Skip to content

Offline Tickets Management -- User Guide

For Admin Agents

Welcome to Offline Tickets Management -- your tool for managing bulk offline attraction tickets from purchase through sale to customer delivery. This module replaces manual spreadsheet tracking with a streamlined digital workflow.


Table of Contents

  1. Overview
  2. Getting Started
  3. Setting Up Attractions
  4. Uploading Ticket Batches
  5. Managing Inventory
  6. Selling Tickets
  7. Managing Reservations
  8. Group Assignment
  9. Customer Ticket Download
  10. Sales History
  11. Expiry Management
  12. Dashboard
  13. Campaigns

1. Overview

The Offline Tickets module handles the full lifecycle of pre-purchased attraction tickets:

Stage Description
Purchase Upload ticket PDFs in bulk from suppliers
Inventory Track every ticket by serial, category, validity, and status
Sale Sell tickets to customers with integrated Odoo invoicing and optional Telr payment links
Group Assignment Assign tickets to inbound group activities without payment/invoice
Delivery Customers download their ticket PDFs via a secure link, or agents merge and download all PDFs at once
Payment Callbacks Automated payment processing via Telr callback URLs

This replaces the manual process of tracking tickets in spreadsheets, copying PDFs by hand, and reconciling sales across multiple systems.


2. Getting Started

Accessing the Module

  1. Log in to the administration portal
  2. Click on Offline Tickets in the main navigation menu
  3. You will see the Offline Tickets Dashboard -- your central hub for all ticket operations

Understanding the Dashboard

The dashboard at offline-tickets-dash.html is the main entry point. It provides:

  • KPI cards summarizing your ticket inventory at a glance
  • Per-attraction table with status breakdowns
  • Quick action buttons for navigating to all key pages

3. Setting Up Attractions

Before uploading tickets, you need to define the attractions they belong to.

Creating a New Attraction

  1. From the dashboard, click Manage Attractions
  2. Click Add Attraction
  3. Fill in the attraction details:
Field Description
Name Display name for the attraction (e.g., "Global Village 2026")
Odoo Product Code Must match the corresponding product in Odoo -- type to search and select
Supplier The ticket supplier name
Categories Ticket categories offered (e.g., "Standard", "VIP", "Premium")
Age Groups Applicable age groups (e.g., "Adult", "Child", "Infant")
Time Slot Flag Enable if this attraction uses time-slotted tickets

Product Code Lookup

When entering the Odoo product code, the system provides a type-ahead search. Start typing the product name or code and select from the matching results. The product code must match Odoo exactly for invoicing to work correctly.

Editing and Deactivating Attractions

  • Click an existing attraction to edit its details
  • Use the Deactivate option to hide an attraction from new uploads without deleting its history

Extraction Patterns

Extraction patterns tell the system how to read ticket data (serial numbers, dates, time slots) from uploaded PDFs. In the attractions table, each attraction shows a pattern configuration status indicator so you can see at a glance whether patterns are set up.

To configure patterns, click the patterns icon (regex icon) on an attraction row. This opens the Patterns Modal where you can:

  • AI Analyzer: Upload a sample PDF and let the AI suggest extraction patterns automatically. Review the suggestions before saving.
  • Manual editing: Define or adjust individual regex patterns for each field:
  • Serial number pattern
  • Date pattern and format
  • Time slot pattern
  • Category pattern
  • Barcode pattern
  • Pattern Tester: Paste sample text from a ticket PDF and test your patterns to verify they extract the correct values before saving.

On the first batch upload for an attraction with no patterns configured, the system will prompt you to run the AI analyzer.


4. Uploading Ticket Batches

Starting an Upload

  1. Navigate to Upload Batch from the dashboard, or click Upload from an attraction's detail page
  2. Select the attraction the tickets belong to

Entering Batch Details

Field Description
Supplier Reference The supplier's reference number for this batch
Pricing Choose between total batch cost or per-ticket cost
Selling Price The price you will charge customers per ticket
Currency The currency for pricing
Campaign (Optional) Associate this batch with a promotional campaign

Uploading the PDF

  1. Click Upload PDF or drag and drop the file onto the upload area
  2. The PDF must contain one ticket per page
  3. The system splits the PDF into individual ticket pages automatically

Ticket Data Extraction

After upload, the system extracts ticket data using configured extraction patterns:

  • If no patterns exist for this attraction, the AI analyzes the first page and suggests patterns -- review and confirm before proceeding
  • If patterns exist, extraction happens automatically

Reviewing Extracted Tickets

After upload, the results panel displays an editable ticket table where you can review and correct extracted data for each ticket:

  • Serial numbers -- verify they were read correctly
  • Dates -- check ticket dates and validity dates
  • Time slots -- if applicable, confirm time slot assignments
  • Category and barcode -- verify extracted values
  • Selling price -- adjust individual ticket prices if needed

All fields in the table are editable inline, so you can make corrections before saving.

Tickets with missing key data (serial number, date) are highlighted in yellow with a warning icon and sorted to the top of the table. A summary above the table shows how many tickets need review (e.g., "5 tickets need review").

Bulk Apply

Above the ticket review table, the Bulk Apply section provides input fields for common attributes:

  • Category (e.g., "Standard", "VIP")
  • Age group (e.g., "Adult", "Child")
  • Valid until date
  • Selling price

You can apply values in two ways:

  1. Apply to All -- sets the entered values on every ticket in the batch
  2. Apply to Selected -- use the checkboxes on individual ticket rows (or the Select All checkbox) to select specific tickets, then apply values only to those

Only non-empty fields are applied, so you can set just the category without affecting dates or prices.

Saving the Batch

Click Save Changes to finalize the upload. All tickets in the batch are assigned the status AVAILABLE and appear in your inventory.

After saving, you can: - Click View in Inventory to see the imported tickets in the inventory page - Click Upload Another to start a new batch upload

Recent Batches

The upload page also displays a Recent Batches table on the right side, showing previously uploaded batches with their batch ID, attraction name, ticket count, and upload date. Each batch has View and Delete action buttons for quick management.


5. Managing Inventory

Viewing Inventory

  1. Navigate to Inventory from the dashboard
  2. The page displays KPI cards at the top showing counts for Available, Reserved, Sold, and Expired tickets
  3. Use the filters to narrow your view:
Filter Options
Attraction Select a specific attraction
Batch Filter by batch reference
Status Available, Reserved, Sold, Expired
Category Filter by ticket category
Serial / Barcode Search by serial number or barcode value
Date From / Date To Filter by ticket date range
Campaign Filter by campaign
  1. Click Apply Filters to update the results
  2. Click Export CSV to download the filtered inventory as a CSV file for external reporting

The inventory is paginated with 50 tickets per page.

Ticket Details

Each ticket row displays:

  • Ticket ID and batch
  • Serial number
  • Date and time slot (if applicable)
  • Category and barcode
  • Selling price
  • Current status

Click the View button on any ticket row to open a Ticket Detail modal showing the full ticket information.

Status Indicators

Status Colour Meaning
Available Green Ready for sale
Reserved Amber In a pending sale, awaiting payment
Sold Blue Payment confirmed, delivered to customer
Group Assigned Teal Assigned to a group activity (no payment flow)
Expired Red Past validity date, no longer sellable

Selecting Tickets

Use the checkboxes to select individual available tickets, or use the Select All checkbox to select all available tickets on the current page. When tickets are selected, a selection action bar appears showing the count and a Sell Selected button that takes you directly to the sale page with the selected tickets.


6. Selling Tickets

Sale Workflow

Follow these steps to sell tickets to a customer:

  1. Go to New Sale from the dashboard, or click Sell Selected from the Inventory page
  2. Select an attraction -- the page shows attraction cards with the attraction name, a badge showing total available tickets, and an availability breakdown by age group. Click a card to select it.
  3. Choose ticket quantities -- after selecting an attraction, a ticket selection panel appears. Enter the number of tickets you need per age group (or a single quantity if the attraction has no age groups), then click Find Tickets. The system locates matching available tickets and displays them in a table.
  4. Add tickets to cart -- review the found tickets (showing serial, category, age group, date, and price) and click Add to Cart. You can repeat for multiple attractions.
  5. Review the cart -- the cart panel shows a summary per attraction (ticket count and subtotal) with a total row. Use the remove button to drop items, or Clear Cart to start over.
  6. Enter customer details:
    • Email address (required) -- the system automatically looks up the customer in Odoo when you leave the email field. If a match is found, the name and phone are pre-filled.
    • Customer name (required)
    • Phone number (optional) -- you can also look up a customer by phone number using the lookup button next to the phone field. The system avoids double lookups: if a customer was already found by email, the phone lookup is skipped, and vice versa.
    • Notes (optional)
  7. Optionally uncheck "Generate payment link" if no payment link is needed (e.g., cash payment or internal use)
  8. Click "Reserve Tickets" to create the reservation
  9. The system creates:
    • An Odoo quotation for the sale
    • A Telr payment link for the customer (if the checkbox was checked)
  10. A checkout result panel appears showing:
    • Cart reference and ticket count
    • The payment link with a Copy button (if generated)
    • A guidance message: either "Share payment link with the customer" or "Confirm payment manually from the Reservations page"
    • Navigation buttons: New Sale, View Reservations, View Inventory
  11. If a payment link was generated, copy it and send it to the customer via WhatsApp, email, or any other channel. The payment link includes custom callback URLs that automatically process success, cancellation, and declined payments.
  12. If no payment link was generated, the reservation remains in PENDING_PAYMENT status. The agent can confirm payment manually at any time.
  13. The selected tickets are now marked as RESERVED

7. Managing Reservations

Viewing Reservations

  1. Navigate to Reservations from the dashboard
  2. Filter by status:
Status Description
Pending Payment Checkout completed, awaiting customer payment
Completed Payment confirmed, tickets delivered
Cancelled Reservation cancelled, tickets returned to inventory

Additionally, each reservation tracks a payment status (separate from the reservation status) to reflect Telr payment callback results:

Payment Status Description
Paid Payment received successfully via Telr callback
Declined Payment was declined by the payment gateway
Cancelled Payment Customer cancelled the payment process

Payment status is visible in the reservation detail panel. If a payment is declined or cancelled, the reservation remains active so the agent can regenerate a payment link or cancel the reservation manually.

  1. Search by cart reference to find a specific reservation

Reservation Details

Click a reservation to view:

  • Customer information (name, email, phone)
  • Payment link (copyable)
  • Odoo quote number
  • List of reserved ticket serials

Available Actions

  • Regenerate Link: Generates a new Telr payment link for the reservation, replacing the previous one. Useful when a payment link has expired or needs to be resent.
  • Confirm Payment: Marks the sale as paid. The system creates an Odoo invoice (automatically posted) and changes all tickets in the reservation to SOLD status. Download codes are generated for customer delivery. After confirmation, the detail panel shows:
    • A Download button next to each SOLD ticket for direct PDF download
    • A Copy Link button next to each ticket to copy its download URL
    • A "Copy All Download Links" button to copy all ticket download URLs to the clipboard at once
    • A "Merge & Download" button to merge all ticket PDFs in the sale into a single combined PDF and download it
  • Cancel Reservation: Returns all tickets to AVAILABLE status and invalidates any generated download codes. The Odoo quotation is cancelled.

Automated Payment Callbacks

When a Telr payment link is generated with callback URLs, Telr redirects the customer's browser to the appropriate callback endpoint after payment processing:

  • Successful payment: The system automatically confirms payment (creates invoice, marks tickets SOLD), sends a download email to the customer, and displays a success page
  • Cancelled payment: The payment status is updated to "Cancelled Payment" on the sale record, and a notification is displayed. The reservation stays active.
  • Declined payment: The payment status is updated to "Declined" on the sale record, and a notification is displayed. The reservation stays active.

The callback response pages are loaded from customizable HTML templates in $TLINQ_HOME/templates/ (files: payment-success.html, payment-cancelled.html, payment-declined.html).


8. Group Assignment

Tickets can be assigned directly to inbound group activities (trip services) without going through the payment/invoice workflow. This is used when the agency purchases tickets for a group tour and needs to link them to a specific group activity.

How Group Assignment Works

  1. The agent selects one or more AVAILABLE tickets from the inventory
  2. The agent specifies the trip service ID (the group activity the tickets are for)
  3. The system:
    • Marks the selected tickets as SOLD with the trip service reference
    • Generates download codes for each ticket
    • Creates sale records with status GROUP_ASSIGNED
    • Updates the group activity's ticketsPurchased flag to true
  4. No Odoo quotation, invoice, or payment link is generated
  5. The tickets are immediately available for download

When to Use Group Assignment

  • When tickets are pre-purchased for a group activity and don't need individual customer invoicing
  • When the cost is covered as part of the group package price
  • The group activity's ticket status in the schedule view will show as "OK" (tickets purchased) after assignment

Relationship to Groups Module

Each assigned ticket stores a reference to the trip service (tripServiceId). A ticket can only belong to one trip service. The link is visible in both the offline tickets system and the group management module's activity detail.


9. Customer Ticket Download

After payment is confirmed, customers can download their individual ticket PDFs.

How It Works

  • Each sold ticket receives a unique download code
  • The customer accesses the download page using the URL format: /ticket-download.html?ticketId=X&code=Y
  • The system validates the code and serves the original ticket PDF
  • Downloads are only available for tickets with SOLD status

You can copy the download link for each ticket from the reservation detail page and send it to the customer along with the payment confirmation.

Agents can also email download links to customers directly from the Sales History page -- click on a completed sale and use the "Email Tickets to Customer" button to send all download links in one email.


10. Sales History

Viewing Sales History

  1. Navigate to Sales History from the dashboard
  2. The page auto-populates today's date and performs an initial search automatically on load
  3. Filter results by:
    • Status: All, Pending, Completed, Cancelled
    • Date range: Start and end dates
    • Attraction: Filter sales by specific attraction
    • Agent: Filter by agent user ID

Summary KPIs

The page displays summary cards at the top:

KPI Description
Total Sales Number of sales transactions
Revenue Total revenue from completed sales
Completed Count of fully completed sales
Cancelled Count of cancelled sales

Grouped Sales View

Sales are grouped by cart reference -- each row in the table represents one sale and shows the ticket count and total amount. This provides a concise overview rather than listing every individual ticket.

Sale Detail Panel

Click any sale row to open a detail panel showing the individual tickets in that sale:

  • Each ticket is listed with its serial number, price, and current status
  • For SOLD tickets:
    • A Download button to download the ticket PDF directly
    • A Copy Link button to copy the individual ticket's download URL to the clipboard
  • "Email Tickets to Customer" -- sends an email to the customer containing download links for all tickets in the sale
  • "Copy All Download Links" -- copies all ticket download URLs to the clipboard at once, making it easy to share via WhatsApp or other channels
  • "Merge & Download" -- merges all ticket PDFs from the sale into a single combined PDF file and downloads it

Exporting Data

Click Export to CSV to download the filtered sales data as a flat file for external reporting or reconciliation.


11. Expiry Management

Tickets approaching their validity date need attention to avoid waste.

Viewing Expiring Tickets

  1. Navigate to Expiring Tickets from the dashboard
  2. Set the "expiring within" period (default: 7 days)
  3. The page shows all AVAILABLE tickets that will expire within the selected period

Extending Ticket Validity

  1. Select tickets using the checkboxes (or use Select All)
  2. Enter a new valid-until date
  3. Click Extend Selected to update the validity for all selected tickets

12. Dashboard

The dashboard provides a complete overview of your offline tickets operation.

KPI Cards

Card Description
Attractions Total number of active attractions
Available Tickets ready for sale
Reserved Tickets in pending sales
Sold Tickets with confirmed payment
Expired Tickets past their validity date

Expiry Warning

A warning indicator shows the count of tickets expiring within the next 7 days. Click it to go directly to the Expiry Management page.

Per-Attraction Table

A table listing each attraction with columns for supplier, available/reserved/sold counts (shown as coloured badges), revenue from confirmed sales, and total tickets. Each row has action buttons:

  • View Inventory -- opens the inventory page filtered to that attraction
  • Upload Batch -- opens the upload page pre-selected for that attraction

Quick Action Buttons

Button Destination
Manage Attractions Attraction setup and configuration
New Sale Start a new ticket sale
Upload Batch Upload a new batch of tickets
Reservations View and manage reservations
Sales History Review past sales
Expiring Manage tickets approaching expiry

13. Campaigns

Campaigns allow you to group ticket batches for promotions or seasonal events.

What Are Campaigns?

A campaign is a label that ties together one or more ticket batches under a common promotion -- for example, "Eid Al Fitr 2026" or "Summer Sale 2026".

Creating a Campaign

  1. Open the campaign management interface
  2. Click Add Campaign
  3. Enter the campaign name and any relevant details
  4. Save the campaign

Associating Batches with Campaigns

During the batch upload process, select an existing campaign from the Campaign dropdown to associate the batch.

Filtering by Campaign

Use campaign filters in reports and inventory views to see only tickets belonging to a specific promotion.


Document Information

Document Version 1.3
Date 2026-03-22

Booking Lifecycle Integration

Offline ticket sales integrate with the Booking Lifecycle Management system for checkout, payment processing, and invoice generation.

Ticket Sale to Booking

  1. Complete a ticket sale (select tickets, enter customer details, set quantities)
  2. Click Checkout — the Booking Lifecycle system handles payment collection
  3. A booking is created with an ACTIVITY service line for the ticket sale
  4. Once payment is confirmed, the ticket download codes are activated and an invoice is generated

Shopping Cart Integration

Offline tickets can be added to the shopping cart alongside other services: 1. Add tickets to cart from the ticket sale page 2. Continue adding hotels, flights, or other services 3. Checkout creates a single booking with all items as service lines

Group Ticket Assignment

Tickets can be assigned to activities in inbound groups: - Assigned tickets are marked as SOLD - A reference to the group activity is stored - The activity's ticket fulfilment status is updated - Cost is covered by the group package (no separate invoice)

See Shopping Cart and Integrations for details.