# Tito Pro documentation

## Team

Tito Pro supports multiple team members per account. Invite colleagues to help manage events, with granular permissions to control who can do what.

## Inviting team members

Invite team members by email from the **Team** section in your **Account settings**. They will receive an invitation to join your account.

## Managing your team

View and manage team members, update their roles, and revoke access when needed.


Team member permissions control what each person can access and modify within your account.

## Permission levels

The account owner is the person who created the account. They have full access to everything, including billing and ownership transfer. Ownership is not a role — it's a permanent status tied to the account creator.

Team members are assigned one of the following roles:

- **Admin** - full access to all events and account settings, including team management
- **Manager** - can manage events they are assigned to, but cannot modify account-level settings
- **Read-only** - can view events and data, but cannot make changes

## Assigning permissions

When inviting a new team member, choose their permission level. You can change permissions at any time from the team settings page.

## Event access

By default, team members can access all events in the account. You can restrict a team member's access to specific events only when inviting them or editing their permissions.


## Settings

Tito Pro provides configuration options at both the account and event level. Account settings apply to all events, while event settings let you customize individual events.

## Account settings

Manage your account name, billing, team members, integrations, and more.

## Event settings

Configure event-specific options like time zones, currencies, test mode, and registration behaviour.


Account settings apply across all events in your account. Access them from your [account settings page](https://staging.pro.tito.io/{account_slug}/admin/settings).

## Admin

**Account info**

- **Account name** - your organization or company name
- **Account slug** - the URL identifier for your account, used in event URLs and API endpoints
- **Country** - your account's country
- **Default time zone** - newly created events will use this time zone by default
- **Favicon** - branding shown across your public pages
- **Account privacy** - whether account is private or has a publicly accessible page with links to public events

**Tax rates**

Configure tax rates that can be applied to ticket types. Tax rates are defined at the account level and can be reused across events.

**Team**

Invite and manage team members, and control their access. See [Team](/docs/team).

**Billing**

Manage your subscription, view invoices, and update payment information.

**Trash**

Restore recently deleted events and other items.

## Customization

**HTML templates**

Create and manage reusable HTML templates for your event pages and emails. See [fully custom layouts](/docs/guides/fully-custom-layouts).

**Library**

Upload and manage files (images and other assets) for use in your templates.

**Custom fields**

Define custom fields to collect specific information from buyers and attendees, or to attach data to your event for use in your HTML templates. See [custom fields](/docs/guides/custom-fields).

**Digital pass designs**

Design Apple Wallet and Google Wallet passes for your attendees. See [digital passes](/docs/customization/digital-passes).

**Custom domains**

Set up custom domains for your event pages. Custom domains also support custom email sender addresses and subdomains. See [custom domains](/docs/customization/custom-domains) and [custom email senders](/docs/customization/custom-email-senders).

**Colors**

Define a palette of brand colors to use across your events.

## Third-party apps

**Integrations**

Connect third-party services such as Stripe. Integrations are configured at account level and then attached to individual events. See [integrations](/docs/integrations).

**Integration logs**

View a log of all integration activity for debugging and monitoring.

## Developers

**API tokens**

Create and manage API tokens to authenticate with the [Tito Pro API](/docs/api).

**Webhooks**

Set up webhook endpoints to receive real-time notifications when events happen in your account.

**API logs**

View a log of all API requests made to your account.

**Webhook logs**

View a log of all webhook deliveries and their responses.


## Integrations and API

Tito Pro integrates with external services to extend the functionality of your events. Connect payment processors, check-in tools, and more.

## Integrations

Integrations are managed at the account level and can be attached to individual events. Each integration is configured through the **Account settings** page. See [available integrations](/docs/integrations/available-integrations).

## Webhooks

Receive real-time notifications when events happen in your account. Set up [webhooks](/docs/api/webhooks) to push data to your own systems automatically.

## API access

For custom integrations, Tito Pro provides a [REST API](/docs/api) that lets you programmatically access your event data, including events, orders, tickets, and check-in data.


API tokens allow you to authenticate with the [Tito Pro API](/docs/api) to programmatically manage your events, orders, and attendees.

## Creating a token

1. Go to your **Account settings**
2. Navigate to **API tokens**
3. Click **Create API token**
4. Give your token a descriptive name
5. Choose which events it should be able to access
6. Save your API token
7. Copy the token immediately - it will only be shown once. **Note** We store part of the token as a one-way hash, so we have no way of retrieving a full token after it has been created. If you lose your token, you will need to create a new one.

## Token security

- Each token is scoped to a single account
- Tokens can be revoked at any time
- Do not share tokens or commit them to version control
- We recommend using a secrets manager to store tokens in your applications

## Revoking a token

If a token is compromised, revoke it immediately from the API tokens page. Create a new token and update your applications.


Tito Pro supports integrations with popular services to help you manage payments, check-in, and more.

## Stripe

Connect your Stripe account to accept credit card payments directly through your event registration pages. Stripe handles payment processing securely, and funds are deposited directly into your bank account.

### Setting up Stripe

1. Go to **Account settings**
2. Click **Integrations**
3. Connect your Stripe account
4. In your event, go to **Money** and select the Stripe integration

For a detailed walkthrough, see the [Connect Stripe](/docs/guides/connect-stripe) guide.

## Validar

Connect your Validar account for advanced check-in and badge printing at your events. Tito Pro syncs attendee data with Validar so you can manage on-site registration seamlessly.

## Webhooks

Use [webhooks](/docs/api/webhooks) to receive real-time notifications when events happen in your account. This lets you connect Tito Pro to any external system without polling the API.

## Custom integrations

For services not listed here, use the [Tito Pro API](/docs/api) to build custom integrations. Create an [API token](/docs/integrations/api-tokens) in your **Account settings** to get started.

## Integration logs

All integration activity is logged and can be reviewed from the **Integration logs** section in your **Account settings**. This helps with debugging and monitoring integration health.


## Security & privacy

Data protection, GDPR compliance, and how Tito Pro handles your data and your attendees' data.


Data Security is of paramount importance to us, and Tito Pro is GDPR compliant.

In terms of what we do with data, we simply hold it, store it and present it to perform the tasks our software does. If you are someone buying tickets from an organiser who uses Tito Pro, you can do so safe in the knowledge that we are not doing anything with your data: we don’t share it, we don’t sell it, and we don’t try to claim it as our own.

GDPR aligns with our core philosophy at Tito Pro: respect people’s data.

## Roles under GDPR

In GDPR terms, for anyone who _signs up_ to our service — event organisers and their teams — we act as a **data controller**. This means we are responsible for how the data is used, and for getting permission on how we use it.

For anyone who _registers a ticket_ via Tito Pro, we are the **data processor** for their data. Anything we do with this, we do on behalf of our customers, who act as the **data controller**.

## Data processing agreement

You don't need to sign a separate DPA. Our [Terms of Service](https://pro.tito.io/terms) constitute a legally binding GDPR-compliant contract which covers all the bases required by Article 28 of the GDPR.

## Data storage

Tito Pro's data and operations are located within the EU, in Ireland. All web access is over a secure HTTPS connection.

## Your rights

As long as you have a Tito Pro account, your data is retained, and we will delete personal data on request by contacting [pro@tito.io](mailto:pro@tito.io).

- Our Terms of Service can be found here: [https://pro.tito.io/terms](https://pro.tito.io/terms)
- Our Privacy Policy can be found here: [https://pro.tito.io/privacy](https://pro.tito.io/privacy)
- Our Security Policy can be found here: [https://pro.tito.io/privacy#security-policy](https://pro.tito.io/privacy#security-policy)

## Attendee rights

Under GDPR, attendees have rights including access to their data, rectification, erasure, and portability. As the data controller, you are responsible for handling these requests. You can contact us for help processing these requests.

## Contact

If you would like to find out more about our data protection policies you can contact us at [pro@tito.io](mailto:pro@tito.io).


## Event management

Core settings and configuration for your events.


Event settings let you configure how each event behaves. Access them from the **Settings** section in your event admin.

## Basics

- **Event title** - the display name of your event
- **URL slug** - the URL-friendly identifier used in links and API endpoints
- **Tag line** - a short description of your event to show on digital passes
- **Organizer name** - used as the name part of the FROM email address in outgoing emails and in the event calendar
- **Organizer email** - This is used in the event calendar. It isn't used for outgoing emails

## Dates and location

- Event start and end dates and times
- **Time zone** - used for displaying dates and times throughout the event and templates
- **Venue** - used for displaying the event location throughout the event and templates
- **Calendar description** - Optional text that will be included in the ICS description file attached to emails

## Localization

- **Default language** - choose the default language shown on customer-facing pages

## Custom domain and email sender

- **Custom email sender** - choose your default custom email sender for outgoing messages
- **Custom domain** - choose your default custom domain

## Payment integration, currency

- **Stripe integration** - select your connected Stripe account for your event
- **Currency** - the currency for ticket pricing
- **Integration option** - choose whether your payment checkout uses the inline Stripe Payment Element or redirects to Stripe checkout
- **Create Stripe Customer for every order** - by default, we only create Stripe customers for bank transfer payments

## Invoicing

- **Days until payment due** - number of days after an order is placed that the invoice must be paid
- **Automated reminders** - various options for setting up reminder emails for invoice payments

## Custom references

- See [Custom references](/docs/event-management/custom-references)

## Attendee Hub

- See [Attendee hub](/docs/customization/attendee-hub)

## Dashboard

- Choose which widgets to display on the dashboard. Changes will be applied for all event collaborators. This option can also be accessed via the three dots menu in the top-right of the dashboard itself.

## Invitations

- Control how much info you collect for attendees' guests.
- Set a custom vanity invitation URL.
- Specify URL query params to save as metadata on public registrations. e.g. utm\_\*.

## Messaging

- **Custom email sender** - the default email address your messages will come from.
- **Signature** - the default sign-off on ongoing messages.
- **Send declined invitation email** - checkbox to automatically deliver an email to an invitee if they confirm they are not attending.

## Digital Passes

- Choose a custom template for Apple and Google Wallet passes.

## Integrations

- See [Integrations and API](/docs/integrations)

## Delete event

- Delete event and all its data.


By default, Tito Pro generates order references in the format `ABCD-1234`. With custom reference formats, you can define your own pattern.

## Setting a format

Configure your reference format in **Settings > Custom references**. You must include `{{ random }}` to ensure the reference is unique.

## Use cases

- Include your event name or abbreviation in references
- Match an existing numbering system
- Create references that are easier to communicate verbally


## Ticket types

Ticket types are the core of what you sell on Tito Pro. They define the different options available to your attendees - whether that's general admission, VIP passes, workshops, or any other ticketed offering.

## What are ticket types?

A ticket type represents a specific offering for your event. Each ticket type has:

- A name and description
- A price (or free)
- A quantity available
- Availability dates
- Optional restrictions and requirements

## Types of tickets

Tito Pro supports various ticket configurations:

**Standard tickets** - Regular paid or free tickets with attendee information collection.

**Anonymous tickets** - Tickets that don't require attendee details, useful for general admission events.

**Time slot tickets** - Tickets available only for specific time windows, perfect for workshops or sessions.

**Bundle tickets** - Group multiple tickets together as a package offering.

**Dependent tickets** - Tickets that require another ticket to be purchased first, like add-ons or upgrades.

## Organizing ticket types

The order ticket types appear on your event page can be customized. Use drag and drop in the ticket types list to reorder them. Consider grouping related tickets together or ordering them by price or popularity.


Anonymous tickets allow attendees to purchase tickets without providing individual attendee information. This streamlines the purchase process for events where you don't need to collect personal details for each ticket holder.

## When to use anonymous tickets

Anonymous tickets are ideal for:

- General admission events where you only need to track capacity
- Events where attendees don't need individual identification
- Quick purchase flows where minimal friction is desired
- Family or group tickets where one person purchases for others

## How anonymous tickets work

When a ticket type is marked as anonymous:

1. Attendees add tickets to cart and proceed to checkout
2. They provide payment information but no attendee names or details
3. The order is created with the purchased quantity but without individual ticket records
4. Capacity is still tracked and enforced

## Creating anonymous tickets

1. Create or edit a ticket type
2. Enable "Anonymous tickets" in the ticket type settings
3. Set the quantity available - this controls total capacity
4. Configure pricing as normal

## Limitations

Anonymous tickets:

- Cannot have QR codes or digital passes (since there's no individual ticket record)
- Cannot be checked in individually (check-in happens at the order level)
- Cannot have custom fields or question sets
- Cannot be assigned to specific attendees after purchase

## Combining with regular tickets

You can offer both anonymous and regular tickets for the same event if needed.


Bundles allow you to package multiple tickets together as a single purchasable item, perfect for group bookings or combo packages.

## What are bundles?

A bundle is a ticket type that automatically includes other ticket types when purchased. For example, a "Team Pass" bundle might include 4 general admission tickets, or a "Conference + Workshop" bundle might include one conference ticket and one workshop ticket.

## Creating a bundle

1. Navigate to "Ticket types" and create or edit a ticket type
2. Enable "Bundle" in the ticket type settings
3. Add the ticket types you want to include in the bundle
4. Set the quantity of each ticket type in the bundle
5. Set the bundle price - this can be discounted compared to buying tickets separately

## Bundle pricing

Bundle pricing gives you flexibility to offer discounts:

- Price the bundle lower than individual tickets to encourage bundle purchases
- Price it at the same rate as individual tickets for convenience packaging
- Offer special bundle-only packages not available individually

## How bundles work for attendees

When an attendee purchases a bundle:

1. They pay the bundle price in a single transaction
2. The system automatically creates the included tickets
3. Attendee information is collected for each ticket in the bundle
4. Each ticket can be assigned to different attendees
5. Each ticket gets its own QR code and digital pass


Buy X Get Y Free promotions automatically add free tickets when attendees purchase a qualifying quantity of tickets, perfect for group discounts and promotional offers.

## How it works

When enabled on a ticket type, the system automatically adds free tickets to the cart once the buyer reaches the qualifying purchase quantity. For example, "Buy 3 Get 1 Free" means purchasing 3 tickets automatically adds 1 free ticket to the cart.

## Creating a Buy X Get Y Free promotion

1. Edit the ticket type you want to apply the promotion to
2. Enable "Buy X Get Y Free" in the ticket type settings
3. Set the "Buy" quantity (X) - how many tickets must be purchased
4. Set the "Get" quantity (Y) - how many free tickets are added
5. Specify whether the free ticket(s) should be of the same type as the purchased one, or a different ticket type

## Example configurations

**Buy 3 Get 1 Free** - Purchase 3 tickets, get 1 free (total of 4 tickets, pay for 3).

**Buy 5 Get 2 Free** - Purchase 5 tickets, get 2 free (total of 7 tickets, pay for 5).

**Buy 10 Get 5 Free** - Purchase 10 tickets, get 5 free (total of 15 tickets, pay for 10).

## Multiple promotion tiers

The promotion applies repeatedly within a single order. With "Buy 3 Get 1 Free", purchasing 6 tickets automatically adds 2 free tickets (total of 8 tickets).

## Attendee experience

Free tickets added through this promotion appear automatically in the cart. Attendees complete information for all tickets, including the free ones, ensuring you collect details for all attendees.


Creating a ticket type defines what attendees can purchase for your event. Each ticket type can be configured with specific settings, pricing, and availability rules.

_All fields are optional except for the ticket name._

## Basic details

1. Navigate to "Ticket types" in your event dashboard
2. Click the plus (+) icon at the top of the list
3. Enter a name that clearly describes the ticket (e.g., "General Admission", "VIP Pass", "Workshop")
4. Add a description that explains what's included with this ticket
5. Add a public-facing label if it's to be different from the ticket name

## Pricing

Choose whether the ticket is free or paid. For paid tickets, enter the price in your event's currency. The price you enter is what attendees will see and pay.

You can add a tax type to apply to this ticket type, and specify whether the price includes or excludes tax.

## Capacity

Set a maximum capacity (total quantity available) for this ticket. Leave empty for unlimited. Additionally, specify a maximum number of tickets a customer can select per order. The default number is 100.

## Advanced ticket settings

- [Buy X get Y free](/docs/ticket-types/buy-x-get-y-free) - automatically give customers free tickets when they buy a certain quantity
- [Bundles](/docs/ticket-types/bundles) - package multiple tickets together as a single purchasable item
- [Ticket dependencies](/docs/ticket-types/dependencies) - require or recommend that customers have other tickets when buying this ticket
- [Anonymous mode](/docs/ticket-types/anonymous-tickets) - don't collect any personal information
- [Disable QR code](/docs/ticket-types/qr-code-disabled) - don't issue a QR code or digital passes
- [Attach custom fields](/docs/guides/custom-fields) - display questions during checkout


Ticket dependencies allow you to require that one ticket type must be purchased before another ticket type becomes available. This is perfect for add-ons, upgrades, and optional extras.

## What are dependencies?

Dependencies create a relationship between ticket types where a "dependent" ticket can only be purchased if a "required" ticket is also in the cart. This ensures attendees purchase necessary base tickets before adding optional extras.

## Common use cases

**Workshop add-ons** - Require a conference pass before allowing workshop ticket purchases.

**Meal packages** - Require an event ticket before offering lunch or dinner add-ons.

**VIP upgrades** - Require a general admission ticket before offering VIP upgrade options.

**Equipment rentals** - Require a workshop ticket before offering equipment rental tickets.

**Child tickets** - Must accompany an adult ticket. You can set rules like 3 children per adult.

## Creating dependencies

1. Open the ticket type that needs a dependency (e.g., the add-on or extra).
2. Enable Dependencies in the ticket settings.
3. Choose which ticket type(s) must be purchased first.
4. Set the dependency as required or recommended (recommended allows separate purchase but shows a warning).
5. Define how many dependent tickets are allowed per required ticket.


Tito Pro provides flexible pricing options for your tickets, supporting multiple currencies and payment methods.

## Setting prices

When creating or editing a ticket type, enter the price attendees will pay. This can be any amount including zero for free tickets.

**Fees** - Your price includes any payment processing and applicable platform fees. What you enter is what attendees pay.

**Currency** - Prices are displayed in the currency format appropriate for your chosen currency (e.g., $50.00, €50,00, £50.00).

## Supported currencies

Tito Pro supports major currencies including:

- USD (United States Dollar)
- EUR (Euro)
- GBP (British Pound)
- CAD (Canadian Dollar)
- AUD (Australian Dollar)
- And many more

**Important**: Choose your currency when creating your event. It cannot be changed after tickets have been sold.

## Free tickets

Set a ticket price to zero or leave blank to create a free ticket. Free tickets still require attendees to complete the registration process, allowing you to collect information and manage capacity.

Free tickets are useful for:

- Complimentary passes
- Speaker and sponsor tickets
- Internal team allocations


Disabling QR codes on ticket types removes the QR code generation and digital pass features, which is useful when tickets don't need to be scanned or when you have alternative check-in methods.

## When to disable QR codes

Consider disabling QR codes for:

- Virtual events where physical check-in isn't needed
- Tickets that serve as purchase confirmations only
- Add-on items like meal vouchers that use different verification methods
- Events using external check-in systems

## How it affects tickets

When QR codes are disabled on a ticket type:

- No QR code is generated for the ticket
- Attendees cannot add the ticket to Apple Wallet or Google Wallet
- The ticket confirmation email still includes all other order details
- The ticket can still be checked in manually using the admin interface
- Attendee information is still collected and managed normally

## Creating tickets without QR codes

1. Create or edit a ticket type
2. Enable "QR code disabled" in the ticket type settings
3. The ticket functions normally except for QR/digital pass features

## Check-in alternatives

Without QR codes, you can still check in attendees by:

- Manual check-in using the admin interface
- Searching for attendees by name in the check-in list
- Using external systems with manual verification

## Enabling QR codes later

You can enable QR codes on a ticket type at any time. Existing tickets will have QR codes generated automatically.


Time slots allow you to associate ticket types with a specific date and time. This is perfect for workshops, sessions, tours, or any time-based activity where capacity needs to be managed across multiple time periods.

## What are time slots?

Time slots divide your event into specific time periods, each with its own capacity. Attendees choose their preferred time when purchasing tickets, and each slot tracks its own availability independently.

## Using time slots

1. Navigate to **Time slots** in your event dashboard
2. Click to create a new time slot

Each time slot needs:

- **Name** - Unique internal name used by the system and displayed in checkout if no label has been set
- **Start time** - When the session begins
- **End time** - When the session ends
- **Capacity** (optional) - How many spaces are available for this slot
- **Label** (optional) - A custom public-facing name for the slot, e.g. "Morning workshops"

Ticket types can can be attached to time slots from the summary view, and vice versa. You can also optionally display time slots on [landing pages](/docs/landing-pages-and-widgets/landing-pages) and grouped by day if desired.

## Attendee experience

When purchasing time slot tickets, attendees:

1. Select the ticket type
2. Choose their preferred time slot from available options
3. Complete purchase with their chosen time associated with the ticket


## Orders and attendees

When someone purchases tickets, an order is created for the transaction and an attendee record is created for each ticket holder. These are separate but related: one order can contain multiple attendees, and attendees can be different people from the buyer.


Orders are created whenever someone purchases tickets for your event. Each order contains all transaction details including any payment information, what tickets were purchased, etc.

## What is an order?

An order represents a single transaction and includes:

- One or more tickets
- Payment information and status
- Buyer contact details
- Order total and any applied discounts
- Unique order reference number

## Manual orders

You can't create manual orders directly, but you can add attendees individually or in bulk via the [Attendees section](/docs/orders-and-attendees/attendees).


Attendees are the individual ticket holders for your event. Each ticket purchased creates an attendee record with their responses and check-in status.

## Attendees vs orders

While an order represents a transaction, attendees represent the people actually attending:

- One order can contain multiple tickets (and thus multiple attendees)
- Each ticket corresponds to one attendee
- Attendees can be different people than the buyer who purchased the tickets

## Attendee information

Each attendee record includes:

- Name and email address
- Ticket type they purchased
- Custom field responses
- Check-in status
- QR code for entry
- Communication history

## Managing attendees

From the Attendees section, you can:

- View all attendees in a searchable list
- Filter by ticket type, status, or custom criteria
- Edit attendee information
- Send messages to specific attendees or groups
- Export attendee data
- View which order the ticket belongs to

## Attendee privacy

Tito Pro respects attendee privacy. Attendee information is only used for event management and communication, and you control what information is collected through custom fields and question sets.

## Bulk operations

Perform actions on multiple attendees at once, such as sending messages, updating fields, or exporting data for specific groups.


Invoice-based payments allow you to create orders that are paid against an invoice rather than through immediate checkout. This is suited to corporate sales, purchase orders, or custom payment arrangements.

## What is invoice-based payment?

Instead of processing payment at checkout, an order is created in an “unpaid” state and an invoice is generated for the buyer.

Each invoice includes unique payment references, allowing payments to be automatically matched to the correct order. Once the invoice is paid, the order is automatically marked as paid. No manual reconciliation is required.

## Accept invoice orders

When creating or editing a [landing page](/docs/landing-pages-and-widgets) for your event, you can toggle on "Allow invoice requests". This will reveal the option for the customer to select "Request invoice" during checkout, in addition to the button to pay immediately.

The order is created in an "unpaid" state. Tickets are allocated but the order shows as pending payment until payment is received.

## Manage due dates and reminders

Under Settings > Invoicing, you can specify how many days payment is due after the initial request. This defaults to 7 days.

You can also enable automated reminders, and set up multiple invoice reminders, and choose whether to automatically cancel unpaid orders after this time.


Quotes allow potential buyers to request a pricing proposal during checkout rather than paying immediately. This is useful for corporate sales, group bookings, or any situation where a buyer needs approval before committing.

## How quotes work

Instead of completing payment at checkout, a buyer selects their tickets and submits their details via a dedicated quote request flow. A quote email is sent to the buyer containing a PDF summary and a link to complete their order when ready. No tickets are reserved.

Once they're ready to proceed, they click **Complete order** in the email or on the quote page, which returns them to the normal checkout flow to complete payment.

## Sharing a quote link

There is no toggle to surface quotes on your event page. Instead, each landing page has a dedicated quote URL in the format `/{slug}/quotes/new`. You can share this link directly with buyers who need to request a quote. Upon submitting the form, they will receive a copy of their quote by email with a link to download the PDF and a link to complete their order.


## Invitations

The invitation system allows you to create private ticket allocations for specific groups - speakers, sponsors, VIPs, or any other group that needs special access to tickets.

## What are invitations?

Invitations are private links that give specific people access to tickets without going through your public registration page. You create invitation lists, assign ticket allocations, and send personalized invitation emails to recipients.

## Key concepts

**Invitation lists** - Collections of invited people with their own ticket allocations.

**RSVP flow** - Invited people receive a unique link to claim their allocated tickets.

**Ticket allocation** - Specify which ticket types and how many are available to each invitation list.

**Tracking** - Monitor who has claimed their tickets and who hasn't responded.

## Common use cases

**Speaker tickets** - Provide free passes to event speakers with plus-ones.

**Sponsor allocations** - Give sponsors their contracted number of tickets.

**VIP access** - Create exclusive ticket access for special guests.

**Early access** - Let specific groups register before public sales open.

**Group sales** - Create custom allocations for organizations or teams.

## Invitations vs regular tickets

Invited attendees go through a simplified registration process:

- They use a private link (not the public event page)
- Tickets are pre-allocated to them
- They confirm attendance and provide their information
- Tickets may be free or paid depending on your configuration


Invitation lists organize groups of invited people and control what tickets they can access. Each list has its own settings, allocations, and tracking.

## Creating invitation lists

1. Navigate to Invitations and click "Create new list" (under the Default list dropdown)
2. Name the list (e.g., "Speakers", "Gold Sponsors", "VIP Guests")
3. Configure the ticket type for this list
4. Set an optional expiration date

## Adding invitees

Add people to your invitation list in two ways:

**Manual entry** - Add names and email addresses one at a time.

**CSV import** - Upload a spreadsheet with names and emails.

## Sending invitations

Once your list is set up:

1. Review your invitees
2. Customize the invitation email message
3. Send invitations
4. Invitees receive emails with their unique RSVP links

## Managing invitations

Track invitation status:

- See who has claimed tickets
- Resend invitations to non-responders
- Add or remove people from the list
- Adjust ticket allocations if needed
- Send reminder emails before the RSVP deadline


The RSVP flow is the process invited people go through to claim their tickets. It's designed to be simple and personalized for each recipient.

## How RSVP works

1. **Invitation email** - Invited person receives an email with a personalized message and unique link.

2. **RSVP page** - They click the link to see their invitation details and allocated tickets.

3. **Claim tickets** - They confirm attendance and specify how many tickets they'll use (if multiple are allocated).

4. **Provide information** - They enter attendee details for each ticket (name, email, custom fields).

5. **Payment (if applicable)** - They complete payment if tickets aren't complimentary.

6. **Confirmation** - They receive order confirmation and tickets with QR codes.

## Unique invitation links

Each invited person gets a unique, secure link. This link:

- Only works for that specific invitee
- Shows their personal allocation
- Can't be shared or used by others
- Expires based on your settings

## Accepting or declining

Invited people can:

**Accept** - Claim their ticket and provide attendee information.

**Accept on behalf of additional guests** - Claim additional tickets if permitted.

**Decline** - Indicate they won't attend, freeing up their allocation.

**Not respond** - The invitation remains open until expiration or you manually close it.

## Plus-ones

If your invitation list allows plus-ones, invitees can bring additional guests. They provide guest names and information during the RSVP process.


## Landing pages and widgets

Tito Pro gives every event a landing page and provides embeddable widgets for your own website.

## Event landing pages

Every event gets a landing page at `{account_slug}.staging.tito.page/your-event` which includes the event title, dates, location, and available ticket types. Landing pages are fully responsive and work on mobile devices.

You can customise your landing page with your brand colors and a banner image. For full control, create custom HTML templates under **Customize**.

Use a [custom domain](/docs/customization/custom-domains) for branded URLs like `events.yourcompany.com/conference`.

## Simple pages

Create additional pages for your event — schedules, speaker bios, venue details, FAQs — that share your event's branding and navigation. See [Simple pages](/docs/landing-pages-and-widgets/simple-pages).

## Embeddable widgets

Instead of directing people to your Tito Pro landing page, embed the registration experience directly on your website:

**RSVP widget** - Overlays a simple name and email registration form. Recommended for simple events with a single ticket type.

**Ticketed widget** - Shows a list of available ticket options with pricing. Use this for events with multiple ticket types or paid tickets.


Your event landing page is the primary way attendees discover and register for your event. Tito Pro provides beautiful, responsive landing pages with extensive customization options.

## Default landing page

Every event automatically gets a landing page at:

`https://{account_slug}.staging.tito.page/your-event`

The page includes:

- Event name
- Date, time, and location
- Available ticket types with pricing
- Registration form
- Your account branding

## Customizing your landing page

**Event details** - Update title, dates, and location in the Settings section.

**Branding** - Set custom colours and upload assets in the Customize section.

**Add custom content** - Overwrite the default wording in the Customize section, or switch to HTML view to insert additional information.

## Ticket ordering

The order ticket types appear on your landing page matches the order in your **Tickets** list. Drag them to reorder — put your most popular or recommended option first.

Consider how your pricing tiers tell a story. Leading with an Early Bird price creates urgency; showing a VIP tier above General Admission highlights the upgrade.

## Additional pages

You can add extra content pages to your event — for agendas, speaker bios, venue info, FAQs, and so on — using [Simple pages](/docs/landing-pages-and-widgets/simple-pages).

## Custom domains

Replace the default Tito Pro URL with your own domain:

`https://events.yourcompany.com/conference-2024`

Configure a custom domain in your **Account settings**, then point your DNS records to Tito Pro's servers.

## Going live

When your landing page is ready, toggle your event to **Live** from the event dashboard. Share the URL with your audience — on social media, in emails, or on your website.


Create additional static pages for your event to provide more information beyond the main registration page. Simple pages can be used to add content like agendas, speaker bios, venue details, or FAQs.

## What are simple pages?

Simple pages are additional HTML pages connected to your event, sharing the same branding and navigation. They provide a place for content that doesn't fit on your main landing page.

## Creating simple pages

1. Navigate to **Access** and scroll to the Simple pages section
2. Click "New page"
3. Enter a page title and URL slug
4. Add your content using the HTML editor
5. Publish the page

The page appears at `your-event-url/your-page-slug`.

## Use cases

**Schedule/Agenda** - Display your event timeline, sessions, and activities.

**Speakers** - Showcase presenter bios, photos, and session topics.

**Venue** - Provide detailed location information, maps, parking, and travel directions.

**FAQ** - Answer common questions about registration, refunds, accessibility, etc.

**Code of conduct** - Share your event policies and expectations.

**Sponsors** - Highlight sponsors and partners with logos and descriptions.

## Sharing pages

Share direct links to simple pages for specific information, like linking to your FAQ from social media or including the venue page in pre-event emails.


Embed Tito Pro's registration experience directly on your own website using widgets. This keeps attendees on your site while leveraging Tito Pro's ticketing infrastructure.

## Widget types

**RSVP widget** - Overlays a simple name and email registration form. Recommended for simple events with a single ticket type, such as free events or invitation-based gatherings. Choose the **invitation list** kind when creating the widget.

**Ticketed widget** - Shows a list of available ticket options with pricing. Use this when you have multiple ticket types or paid tickets where attendees need to choose between options. Choose the **public registration** kind when creating the widget.

## Setting up widgets

1. Navigate to **Access** in your event navigation
2. Create a new widget and choose the widget type that fits your needs
3. Copy the provided JavaScript embed code
4. Paste the code into your website's HTML where you want the widget to appear

## Mobile responsiveness

All widgets are fully responsive and work on mobile devices, tablets, and desktops.


## Customization

This is where Tito Pro stands apart. Full control over every aspect of your event's branding and attendee experience — custom domains, branded emails, custom HTML templates, and personalized digital passes. No third-party branding, no compromises. Your event looks and feels like yours from the first touchpoint to check-in.

## Branding

Make your event pages and communications reflect your brand:

- Set brand colors for buttons, links, and accents
- Upload a banner image for your event page
- Create fully custom HTML templates with your own fonts, colors, and layouts

## Custom domains

Replace default Tito Pro URLs with your own branded domains:

`events.yourcompany.com/conference-2024`

This creates a professional, on-brand experience for attendees.

## Email customization

Control how emails appear:

- Use custom sender addresses from your domain
- Customize email templates with your branding
- Add your logo to all email communications

## Digital passes

Customize the appearance of Apple and Google Wallet passes for your event, including colors and logos.


Easily apply your brand identity to all Tito Pro templates within your event, via the theme settings drawer in the Customize section.

## Assets

Upload a banner to appear across all web pages and emails, and a background image for web templates. Add a logo to display on the PDF receipts.

## Colors

Set brand colors for the main elements on each template:

- **Background color** - Page background
- **Text background color** - Cards and content panel backgrounds
- **Text color** - Body text
- **Link color** - Hyperlinks
- **Button background color** - Primary action buttons
- **Button text color** - Text on buttons
- **Border color** - Dividers and outlines

## Full control with HTML templates

For complete design control — including custom fonts, colors, layouts, and styles — use [HTML templates](/docs/guides/fully-custom-layouts). These let you provide your own HTML from `<!doctype html>` to `</html>`, with full control over every aspect of the attendee experience.


Replace Tito Pro's default URLs with your own custom domain to create a fully branded event experience. Your attendees see your domain throughout registration and communications.

## What are custom domains?

Instead of `{account_slug}.staging.tito.page/your-event`, use your own domain:

- `events.yourcompany.com/conference-2024`
- `tickets.eventname.com`
- `register.yourcompany.com/annual-meeting`

This provides professional branding and keeps attendees on your domain throughout the registration process.

## Setting up custom domains

1. Choose your domain or subdomain
2. Add the domain in your **Account settings**
3. Configure DNS records with your domain provider
4. Point your domain to Tito Pro's servers using the provided values
5. Wait for DNS propagation (usually a few hours)
6. Request activation

Once we have verified that the domain is set up correctly, we will add it to our allow-list, and automatically provision an SSL certificate.

## DNS configuration

You'll need to add DNS records with your domain provider:

**CNAME record** - For subdomains (e.g., `events.yourcompany.com`), add a CNAME record pointing to Tito Pro's servers.

**A records** - For root domains (e.g., `eventname.com`), add A records pointing to Tito Pro's IP addresses.

Exact values are provided in your **Account settings** when setting up the domain.

## SSL certificates

Tito Pro automatically provisions and manages SSL certificates for your custom domain using Let's Encrypt. Your attendees always see secure HTTPS connections with no configuration needed.

## Multiple domains

Set up different domains for different events or use one domain across your entire account. Each event can have its own custom domain path.


Use your own email address as the sender for all event communications instead of the default Tito Pro sender. This provides brand consistency and helps with email deliverability. For best deliverability, we recommend setting up both a custom web domain and a custom email address.

## Why use custom email senders?

**Brand recognition** - Attendees receive emails from e.g. `noreply@yourcompany.com` instead of our default address.

**Trust** - Emails from your domain are more recognizable and trusted by your attendees.

**Deliverability** - Properly configured custom senders improve email delivery rates.

## Delivery methods

When setting up a custom domain, you choose how email is delivered:

**Tito Pro email (via AWS)** - Uses Tito Pro's included email delivery infrastructure (Amazon SES). This is the default and recommended option. You'll add DKIM and SPF DNS records to prove domain ownership and authorise sending.

**Custom SMTP server** - Routes email through your own or a third-party SMTP server. You'll provide the host, port, credentials, and TLS settings. Use this if your organisation requires email to flow through a specific server.

## Setting up custom email senders

1. Navigate to **Account Settings** > **Custom domains** to create a new domain
2. Enter the email address you want to use as sender
3. Choose a delivery method
4. Add the required DNS records
5. Once verified, your custom sender is active

## DNS configuration

For **Tito Pro email (via AWS)**, you'll add:

**SPF record** - Authorizes Tito Pro to send email on behalf of your domain.

**DKIM records** - Authenticate emails to improve deliverability.

**DMARC record** (optional) - Additional authentication for maximum deliverability.

For **Custom SMTP**, DNS requirements depend on your SMTP provider.

Exact record values are provided in Tito Pro when setting up your custom sender.

## Testing

After setup, send test emails to verify:

- Emails appear from your custom sender
- Authentication passes (check email headers)

## Deliverability testing

We’ve had good success using <a href="https://mailreach.co?fpr=tito" target="_blank">Mailreach</a> to test the deliverability of invitations before sending.


Configure how tickets appear in Apple Wallet and Google Wallet, providing attendees with convenient mobile access to their tickets with your branding.

## What are digital passes?

Digital passes are added by attendees to their mobile wallets (Apple Wallet on iPhone, Google Wallet on Android). They provide quick access to QR codes and event details directly from the phone's lock screen.

Pass contents include:

- Event name, date, and time
- Unique QR code for check-in
- Your event logo and branding

## Setting up digital passes

1. Navigate to **Account Settings > Digital pass designs**
2. Click the **+** icon to add a new design for Apple Wallet, Google Wallet, or both
3. Click **Edit** to configure the pass appearance
4. Add venue details if your event has a physical location — this appears on the pass and can help attendees find the venue
5. Save your design

## Apple Wallet configuration

Customize Apple Wallet pass appearance:

- Background, foreground, and label colors
- Whether to show the attendee name
- Whether to show or hide the event title
- Whether to hide empty fields
- Upload assets for push notification icon, pass logo, thumbnail, and background image or strip image

Note: assets must be specific sizes — see in-app guidance for requirements.

## Google Wallet configuration

Configure Google Wallet pass appearance:

- Background color
- Whether to show the attendee name
- Upload assets for round logo, wide logo, hero image, and barcode image

Note: assets must be specific sizes — see in-app guidance for requirements.

## Previewing and testing

Tito Pro shows an on-screen preview of your pass design, but this is not an exact representation. To see the final result, create test tickets in Test Mode and download the wallet files to your device.

For details, see [Test mode](/docs/guides/test-mode).

## Updating passes

You can push updates to passes already in attendees' wallets — for example if the event time or venue changes. Do this from the **Tickets** section.


The attendee hub lets you create a personalized page for each attendee, accessible through a unique link.

## What is the attendee hub?

The attendee hub is a custom HTML page that you design using Liquid templates. Each attendee gets their own unique URL, giving you a way to share personalized information with them — event-day instructions, schedules, maps, or anything else you want to include.

## Customizing the hub

The hub is a Liquid template, so you have full control over the HTML content. You can use attendee data (name, ticket type, custom field responses) to personalize what each person sees.

Enable the Attendee Hub in your event **Settings**, and customize it in **Customize**.

## Accessing the hub

Attendees access their hub through a unique link. This link can be included in confirmation emails, reminder emails, or shared directly.

Each attendee's hub is secured with a unique URL. Only the intended recipient can access their page.


## Messaging

Tito Pro provides tools to communicate with your attendees through email. Send updates, reminders, and important information to all attendees or specific groups.

## Message types

**Bulk messages** - Send one-time messages to attendees about updates, schedule changes, or event details.

**Automated emails** - System-generated confirmations, reminders, and notifications that send automatically.

**Custom templates** - Customize the look and content of automated emails to match your brand.

## Who can you message?

Send messages to various groups:

- All invitees
- All attendees
- Specific ticket types
- Checked-in / not checked-in attendees
- Attendees matching custom field criteria

## Message delivery

Messages are sent via email using:

- Your default Tito Pro email sender
- Your custom email domain (if configured)
- Professional delivery infrastructure ensuring high deliverability

## Tracking and analytics

It is essentially impossible to track open rates in modern email systems, that either block access to any kind of tracking pixels, or open every email to do a security screen.

If you use our provider to send email, we get reports of sending errors and bounces, which can be useful to see so that you can respond to them.

If someone clicks on an invitation, we increment a click counter, which is a good way to gauge whether folks are responding to your invitation.

## Best practices

**Timing** - Send important messages well in advance, with reminders closer to the event.

**Clarity** - Use clear subject lines and concise content.

**Frequency** - Don't over-message - only send when you have valuable information to share.

**Testing** - Send test messages to yourself before sending to all attendees.


Customize the automated emails that Tito Pro sends to your attendees, including order confirmations, ticket updates, and reminders. Make them match your brand and include your specific messaging.

## Available email templates

Customize these automated emails:

**Invitation email** - Sent to invited people for RSVP.

**RSVP confirmation** - Sent after accepting an invitation.

**Order confirmation** - Sent immediately after successful purchase.

**Ticket confirmation** - Individual ticket details sent to each attendee.

## Customizing templates

1. Navigate to **Customize**
2. Select the template you want to customize
3. Edit the subject line
4. Customize the message content
5. Use available merge tags for personalization
6. Preview your changes
7. Save the template

## Liquid variables

Templates use Liquid for dynamic content. The variables available depend on the template type — the template editor lists them for each template. The most commonly used are:

### Ticket and attendee

| Variable                        | Description                                                       |
| ------------------------------- | ----------------------------------------------------------------- |
| `{{ ticket.first_name }}`       | Attendee's first name                                             |
| `{{ ticket.last_name }}`        | Attendee's last name                                              |
| `{{ ticket.name }}`             | Attendee's full name                                              |
| `{{ ticket.email }}`            | Attendee's email address                                          |
| `{{ ticket.reference }}`        | Unique ticket reference                                           |
| `{{ ticket.qr_code_img }}`      | QR code as an `<img>` tag                                         |
| `{{ ticket.url }}`              | Link to the attendee's ticket page                                |
| `{{ ticket.cancel_url }}`       | Link to cancel the ticket                                         |
| `{{ ticket.custom_data.slug }}` | Response to a custom field (replace `slug` with the field's slug) |

### Invitation

| Variable                                    | Description                           |
| ------------------------------------------- | ------------------------------------- |
| `{{ invitation.first_name }}`               | Invitee's first name                  |
| `{{ invitation.name }}`                     | Invitee's full name                   |
| `{{ invitation.url }}`                      | The invitee's unique RSVP link        |
| `{{ invitation.number_of_guests_allowed }}` | How many guests the invitee can bring |

### Order

| Variable                  | Description               |
| ------------------------- | ------------------------- |
| `{{ order.reference }}`   | Order reference number    |
| `{{ order.first_name }}`  | Buyer's first name        |
| `{{ order.name }}`        | Buyer's full name         |
| `{{ order.email }}`       | Buyer's email address     |
| `{{ order.url }}`         | Link to the order page    |
| `{{ order.receipt_url }}` | Link to the order receipt |

### Event

| Variable                       | Description                                                           |
| ------------------------------ | --------------------------------------------------------------------- |
| `{{ event.title }}`            | Event name                                                            |
| `{{ event.location }}`         | Event location                                                        |
| `{{ event.time_range }}`       | Human-readable date and time range                                    |
| `{{ event.starts_at }}`        | Event start date and time                                             |
| `{{ event.organizer_name }}`   | Organizer name                                                        |
| `{{ event.url }}`              | Public event URL                                                      |
| `{{ event.custom_data.slug }}` | Event-level custom field value (replace `slug` with the field's slug) |

## Branding

Email templates inherit your event colours and banner image as set in **Theme settings** in the **Customize** section.

## Preview and testing

Always preview and test customized templates:

- Send test emails to yourself
- Check rendering on mobile and desktop
- Verify all links work correctly
- Ensure merge tags display properly


Send one-time email messages to your attendees for announcements, updates, reminders, or any other communication needs.

## Creating a message

1. Navigate to Messages and click "New message"
2. By default messages go to **all attendees**. If you want to send to a different cohort, navigate to **Invitations**, **Orders**, or **Attendees**, optionally filter the list, and then in the dropdown choose **Send a message**
3. Write your subject line
4. Compose your message content
5. Preview how the message will appear
6. Send to all recipients

Create your message in test mode to send to test mode recipients for testing your message before delivering the real thing.

## Selecting recipients

Target specific groups of attendees:

**All attendees** - Everyone registered for your event.

**By ticket type** - Only attendees with specific ticket types.

**By check-in status** - Only checked-in attendees or only those who haven't checked in yet.

**By custom fields** - Filter by custom field responses (e.g., only attendees who selected "vegetarian").

**Specific individuals** - Select individual attendees manually.

## Message content

Messages are written using Liquid, which allows you to personalize content with things like attendee name, ticket type, or other personal details from tickets or invitations.

**Attachments** - Tito Pro doesn't support attachments, but you can use your **Library** in **Account settings** to upload files which can be linked to within message contents.


## Check-in

The check-in system helps you track attendance on event day by scanning QR codes or manually checking in attendees. Tito Pro provides flexible check-in options for various event types and sizes.

## Check-in features

**QR code scanning** - Attendees present their digital or printed QR codes for fast entry.

**Manual check-in** - Search for and check in attendees by name through the admin interface.

**Multiple check-in points** - Create different check-in lists for different areas, days, or sessions.

**Real-time sync** - All check-in devices sync immediately so you see who's entered across your entire team.

**Check-in reports** - View attendance statistics and export check-in data.

## Check-in lists

Create check-in lists for all attendees list for main event entry or specific ticket type lists for different access levels.

## Check-in methods

**Web-based check-in** - Each check-in list has a secure URL that can be opened on any device with a browser. Use it on phones, tablets, or laptops to scan QR codes or search for attendees.

**Admin interface** - Check in attendees through the admin dashboard on any computer or tablet.

**Scanner hardware** - Connect dedicated barcode scanners for high-volume entry points.

## Check-in status

Track attendance with check-in states:

- Not checked in (hasn't arrived yet)
- Checked in (attended)
- Check-in time recorded for each attendee


Check-in lists organize your attendees for entry tracking. Create multiple lists to manage different entry points, sessions, or days of your event.

## Creating check-in lists

1. Navigate to Check-in and click "New check-in list"
2. Name the list (e.g., "Main Entrance", "Workshop A", "Friday Only")
3. Choose which ticket types to include
4. Configure check-in options

The list is immediately available for use on all check-in devices.

## List configuration

**All ticket types** - Include everyone registered for the event.

**Specific ticket types** - Only include certain ticket types (e.g., VIP only, workshop attendees only).

## Multiple check-in points

Create separate lists for different purposes:

**Main event entrance** - Track who has arrived at the event.

**Session check-in** - Monitor attendance for specific workshops or sessions.

**Meal service** - Check in attendees for catered meals.

**VIP areas** - Control access to restricted spaces.

**Multi-day tracking** - Separate lists for each day of your event.

## List security

Check-in lists are accessed via a secret link — no account login is required, so the link can be shared directly with check-in staff.

By default, devices only receive what's needed to verify whether a ticket is valid. Personal details such as names, email addresses, and phone numbers are not included unless you choose to show them.

You can enable additional fields in the check-in list settings to help staff identify attendees. If you do, be aware that anyone with access to a device using that link could view those details.

## Using check-in lists

Once created, each check-in list has a secure URL that can be shared with your team. Check-in lists are accessible from:

- The web-based check-in interface (via secure URLs on any device)
- The admin dashboard


Every ticket in Tito Pro includes a unique QR code that identifies the attendee and enables fast check-in. Digital passes let attendees add tickets to Apple Wallet or Google Wallet for easy access.

## QR codes

Each ticket receives a unique QR code that is used by the Tito Pro check-in scanner to verify and check in attendees.

The QR code appears on:

- Email confirmations
- Ticket PDFs (if printing)
- Digital wallet passes
- The attendee's online ticket page

## How QR codes work

Attendees present their QR code at check-in by:

- Showing their phone screen with the code
- Presenting a digital wallet pass
- Showing a printed ticket

Your check-in scanner reads the code, verifies the ticket is valid and hasn't been used, and marks the attendee as checked in.

## Apple Wallet passes

Attendees with iPhones can add tickets to Apple Wallet:

1. They click "Add to Apple Wallet" in their confirmation email or ticket page
2. The pass downloads and opens in Wallet
3. The pass shows event details, QR code, and location
4. They can access it from their lock screen on event day

## Google Wallet passes

Android users can add tickets to Google Wallet:

1. They click "Add to Google Wallet" in their confirmation email or ticket page
2. The pass is saved to their Google Wallet
3. They access it through the Google Wallet app
4. Includes event details, QR code, and map link

## Digital pass customization

Digital passes can be customised with your branding, event logo, colors, and venue information. See [digital passes](/docs/customization/digital-passes) for details.


Tito Pro supports multiple methods for scanning attendee QR codes to track check-ins efficiently at your event entry points.

## Web-based scanning

Each check-in list has a secure URL that opens a check-in interface in any web browser. This is the recommended method for most events:

1. Navigate to **Check-in** in your admin dashboard
2. Select a check-in list
3. Click the QR code on the list page to open the check-in URL, or scan it directly with a mobile device
4. Select a scanner and authenticate your device
5. Click **Start scanning** to open the camera and begin scanning QR codes

Share the check-in URL with your team so multiple people can check in attendees simultaneously from different devices.

## Scanning workflow

1. Attendee presents QR code (on phone or printed)
2. Scanner reads the code
3. System confirms ticket validity
4. Check-in is recorded with timestamp
5. Visual feedback confirms success


## Coupons and promotions

Coupons and promotion codes help you offer discounts to drive ticket sales. Tito Pro provides flexible discount options with tracking and usage controls.

## Coupons vs promo codes

A **coupon** is the discount itself (for example, 20% off or $10 off).

A **promotion code** is what buyers use to redeem the discount.

You can create multiple promotion codes for a single coupon, which lets you share the same discount in different places, track performance by channel, or give specific people or groups their own code, without needing to create a new discount each time.


Create discount coupons to offer special pricing to your attendees. A coupon is the discount itself (for example, 20% off or $10 off). A [promotion code](/docs/coupons-and-promotions/promotion-codes) is associated with a coupon, and is what customers enter at checkout to apply the discount.

## Creating a coupon

1. Navigate to Coupons and click "New coupon"
2. Name the coupon for internal use
3. Choose discount type (percentage or fixed amount)
4. Set the discount value
5. Apply to every ticket in the order, or the order as a whole
6. Apply to specific ticket types only, if desired
7. Save the coupon

## Usage and usage limits

In order for buyers to apply a coupon at checkout, you will need to create and share at least one [promotion code](/docs/coupons-and-promotions/promotion-codes). Usage limits are defined at promotion code level.


To apply a discount [coupon](/docs/coupons-and-promotions/coupons), you will need to create at least one promotion code.

## Creating promotion codes

1. Create a coupon if you haven't already
2. Click to add codes to the coupon
3. Manually add a single promotion code or automatically generate your desired number of codes
4. Optionally set a maximum number of times each promotion code for this coupon can be used

## Formatting promotion codes

We recommend choosing memorable, easy-to-type codes.

Valid characters for promotion codes are "a-z", "A-Z", "0-9" and "-". Codes should contain no spaces, and are case-sensitive. You can format codes dynamically using {% random %} or {% number %} and an optional prefix/suffix.

## Applying a promotion code

Promotion codes can be used in various ways:

- Applied by the buyer at checkout to claim a discount
- Auto-apply the discount by including the promotion code in the URL with the format `https://your-event.tito.io/discount/PARTNER25`
- Unlock access to certain pages or tickets (see [Promotion code gateway](/docs/coupons-and-promotions/promotion-code-gateway))

## Tracking promotion code usage

In the coupon summary view, you can track figures for number of orders, number of individual attendees, and total redeemed value.


The promotion code gateway requires visitors to enter a valid promotion code before they can access your event registration page. This creates a completely private event accessible only to people with the code.

## What is the promotion code gateway?

Instead of showing your event details and tickets, visitors see a simple page asking for a promotion code. Only after entering a valid code can they proceed to register. This provides maximum privacy for private events that still require a registration page.

## Setting up the gateway

1. When editing your [landing page](/docs/landing-pages-and-widgets/landing-pages), enable "Require promotion code"
2. Create one or more promotion codes that grant access
3. Customize the gateway page message (optional)
4. Share codes with intended attendees

## How it works for attendees

1. Visitor navigates to your event URL
2. They see the gateway page requesting a code
3. They enter a valid promotion code
4. The event page is revealed with available tickets
5. They proceed with registration normally

The code remains active in their browser session, so they don't need to re-enter it.


## Getting started

Welcome to Tito Pro.

Tito Pro is event registration software particularly suited to professional events. The software combines an excellent set of tools to manage **invitation-only events** while also supporting more traditional **ticketed events**. From Simple RSVPs to multi-channel, multi-step complex purchase flows, Tito Pro has tools to manage a range of cases.

Whether you're running a VIP event, a flagship conference, a gala dinner, an exclusive product launch, a high-profile exhibition, or any event where your brand matters, Tito Pro gives you the tools to deliver a premium registration experience from start to finish.

Everything your customers see can be customized: from emails, landing pages, to the various user journeys, to digital passes.

Tito Pro builds on our years of experience building and maintaining [Tito](https://ti.to) &mdash; a platform that has processed over $1 billion worth of tickets. It’s Tito, but more... pro.

## Quick start

It's super quick to get a Tito Pro event up and running:

1. [Create your account](https://staging.pro.tito.io/sign_up) - Sign up and you'll be prompted to create your first event
2. [Create your first event](/docs/getting-started/creating-your-first-event) - Creating an event is quick and easy
3. [Send invitations](/docs/invitations) - Once your event is live, you can start sending invitations right away
4. [Customize your event](/docs/guides/customization-overview) - Customize everything your customer sees
5. [Open public registration](/docs/landing-pages-and-widgets) - Create a landing page or multiple landing pages for your event

## Need help?

Our support team is here for you. [Get in touch](mailto:pro@tito.io) any time and we'll help you get set up.

If you'd like us to look into something directly, you can [enable support access](/docs/getting-started/enabling-support-access) to let our team securely log in to your account.


When you sign up for Tito Pro, you'll be prompted to create your first event right away.

## What you need

The only required field is your **Event title**. Everything else is optional and can be updated later in Settings.

You can optionally add:

- **Date and time** - When your event takes place
- **Location** - Venue details (these appear on calendar invites and digital passes)
- **URL slug** - An internal unique identifier for your event for accessing it via the Tito Pro dashboard (with [Landing pages](/docs/landing-pages-and-widgets), you have full control over the URLs your attendees use to access your event.)

That's it! Once your event is created, you'll land on your event dashboard.

Created events are initially **private**, with no public access. For invitation-only events, if you want to use all the defaults, you’re essentially ready to go, but more than likely you’ll want to customize the experience.

The first port of call is usually to enter **Test mode**. Test mode allows you to run through the process of registering for an event exactly as an attendee might, but completely separate from live data. For paid events, test mode allows you to use <a href="https://docs.stripe.com/testing" target="_blank" rel="noopener">Stripe test cards</a> to test the full payment flow.

## What to do next

Depending on the type of your event, you may want to do a number of things.

- If your event is invitation-only, you probably want to [customize your event](/docs/customization), before using [test mode](/docs/guides/test-mode) to [send invitations](/docs/invitations)
- If your event will be ticketed, read our guide on [setting up a ticketed event](/docs/guides/simple-ticketed-event)


Support access lets the IO support team securely log in to your account on your behalf. When it's enabled, a member of our team can view and manage your accounts and events exactly as you would — without needing your password.

We only ever access your account when you've asked us to help with something specific, and we'll let you know when we're done. You're in control at all times.

## What support access allows

When support access is enabled, our team can:

- Log in to your account securely
- View and manage all accounts and events associated with your user
- Reproduce issues you've reported and investigate the cause
- Make changes on your behalf if you ask us to

Support access does **not** give us access to payment details, your password, or any credentials stored outside of IO.

## How to enable support access

1. Click on the avatar icon at the bottom of your dashboard
2. Click **Profile**
3. Click **Edit profile**
4. Toggle **Support access** on

<div class="docs-callout-action">
  <strong>Enable support access</strong>
  <p>Go to your profile settings to turn support access on or off.</p>
  <a href="" class="docs-callout-action-link" target="_blank">Open profile settings &rarr;</a>
</div>

## Disabling support access

You can turn support access off at any time from the same **Edit profile** page. Once disabled, our team will immediately lose access to your account.

If you have an open support request, let us know before disabling access so we can wrap up any investigation first.


An account is where events live in Tito Pro. An account could be associated with an organisation (e.g. for billing), or it could be specific to a series of events.

A single account can have many events, and each event can have its own custom URL, so it makes sense to create an account for all events that will share billing.

## Sign up process

1. Visit [staging.pro.tito.io](https://staging.pro.tito.io) and click "Sign up"
2. Enter your email address and create a password
3. Verify your email address by clicking the link we send you
4. Complete your account profile with your name and organization details

## Your account slug

During setup, you'll choose an account slug - this becomes part of your Tito Pro host event URLs (e.g., `{account_slug}.staging.tito.page`). This slug won’t be visible if you use a custom domain.

The slug must be unique across Tito Pro and can only contain lowercase letters, numbers, and hyphens.

## Account structure

Each account in Tito Pro has a number of shared resources:

- **Events** (obviously 😛)

In settings, you’ll find the following sections:

### Admin
- **Tax rates** for charging tax in your jurisdiction
- **Team** for sharing access to all or individual events
- **Billing** for managing your Tito Pro billing plan
- **Trash** for storing deleted items

### Customization
- **HTML Templates** for customizing how your events look and feel
- **Library** for uploading files to support custom templates
- **Custom fields** for using throughout your events
- **Digital pass designs** for customizing digital passes
- **Custom domains** for custom landing page domains and email addresses
- **Colors** For creating a color palette for visually diferentiating ticket types

### Third-party apps
- **Integrations** For finding third-party integrations that we have built
- **Integration logs** For debugging integrations (or verifying they are working) when necessary

### Developers
- **API tokens** For creating API tokens to interact with [our API](/docs/api)
- **API logs** For debugging your use of the API
- **Webhooks** For receiving real-time notifications in your apps
- **Webhook logs** For debugging your use of webhooks

## Next steps

Once your account is created, you can:

- [Add team members](/docs/team)
- [Create your first event](/docs/getting-started/creating-your-first-event)
- [Configure payment settings](/docs/integrations/available-integrations)
- [Set up your account settings and branding](/docs/customization/branding-and-themes)


## Guides

### Core concepts

In building Tito Pro, we’ve taken lessons from 10 years working on [Tito Classic](https://ti.to) and built with the principle in mind that if we build something that Tito Classic does, we try to improve it in some way. This has added up to a product that has many small conveniences.

Alongside this [Kaizen](https://en.wikipedia.org/wiki/Kaizen)-inspired approach, there are some core ideas driving our product development:

## Everything is customizable

Every touchpoint your attendees see — registration pages, emails, digital passes, domains — can be fully branded and customized. You can start with sensible defaults and progressively customize as much or as little as you need.

## Events are self-contained

Each event has its own settings, ticket types, attendees, and content. This keeps things clean when you're running multiple events under one account. Account-level settings like team members, integrations, and billing are shared across all your events.

## Data moves freely

You can import attendees from CSV files and export invitations, orders, attendees, and reports. Data is also available programmatically via the API.

## Invitations and tickets work together

Tito Pro uniquely handles both open registration (ticketed events) and closed registration (invitation-only) in the same event. You can run a hybrid model where some attendees are invited while others purchase tickets publicly.


### Test mode

Test mode lets you try out your entire event setup — registration, orders, tickets, check-in, and integrations — without affecting real data or processing real payments.

## How it works

You can toggle Test mode at any time. Test mode follows you between your accounts and events until you switch it off. Even though test mode stays on, only certain items in the system have both test and live versions. Changes to event settings, for example, will apply to both test and live modes.

- **Orders and tickets** are marked as test data and kept separate from live data
- **Payments** use your payment provider's test/sandbox environment (no real charges)
- **Emails** are sent normally so you can verify the full attendee experience
- **Check-in** works the same as live mode, with test checkins tracked separately
- **API Tokens** are either test mode or live mode

## Enabling test mode

You can switch between test and live mode at any time using the toggle in the main navigation.

Note that when enabling Test mode it is for your current session only. It does not affect the Live event, or any of your team’s usage of the platform.

## When to use test mode

- **Before launch** — walk through the full registration flow as an attendee would
- **Testing integrations** — verify webhooks, external integrations, and API requests without any side-effects
- **Training staff** — let your team practice check-in workflows with realistic data
- **Walking through flows** — experiment with different features while other features are already "live"

## Test mode and the API

API tokens are test mode or live mode. When using a test mode token, all data returned and created through the API is scoped to test mode. This lets you build and test API integrations without touching live data.

## Cleaning up

You can clear all test data from an event at any time from the event settings. This removes all test orders, tickets, and checkins in one step.


### Importing data

Import attendees from CSV files to bulk create or update invitations or tickets. This can be useful for sending invitations in batches, for migrating from other systems, for adding comp tickets, or batch registration.

You can import into two main sections: **Invitations**, and **Attendees**.

Invitations are added to your event, but sending the batch is done in a separate step.

Attendees are created immediately.

"Import" is available in the dropdown in each of the Invitations and Attendees sections.

## Upload or paste

If you have a **CSV file** ready to go, you can drag it to the Upload box on the import screen. Alternatively, you can paste data into the textarea in the **Paste** tab. Pasted data can be in CSV or TSV format. You can also simply paste the contents of a CSV file.

Typically for imports you would include `first_name`, `last_name`, and `email`, but none of the fields are strictly required. You can add names without emails, and emails without names.

The first row must contain the header rows or your import will fail. The header rows don't have to exactly match the field names, but they have to be convertible. e.g. your header row could be `First name, Last Name, Email` which would work, but `first,last,e-mail` would not.

After you import the file, your import is staged for you to review. If there are any validation errors, they'll be shown at this point and you will have to fix the errors and re-import.

## Upserting

Once you have imported data into Tito Pro, every record gets a unique `ID` within the system. You can use this ID to update records in batch later. To quickly get the IDs of the records you imported, you can [Export](/docs/guides/exporting-data) your data and include the ID field. You can then re-import that data, and as long as the `ID` field is present, you will update the existing records, rather than create new records.

## Custom fields

You can include [custom fields](/docs/guides/custom-fields) in your imports and upserts. The field header should match the Custom field's `slug`, but just like other headers, if the slug is e.g. `company_name`, your header can be `Company name`.

## Ticket type

If you have multiple ticket types, you will need to include the "Ticket type" / `ticket_type` header in your CSV file. Use the ticket type’s unique slug to identify the ticket type that you’d like to associate with the invitation or attendee you are importing.

## Encoding

To prevent encoding issues, we recommend exporting your CSV with UTF-8 encoding to handle special characters correctly.

## Handling duplicates

Tito Pro currently identifies duplicates by email once they are in the system, but it does not prevent the importing of duplicates. If you have duplicates in your data, we recommended de-duplicating before uploading.


### Exporting data

Tito Pro provides flexible export options to get your order data into spreadsheets, accounting software, or other systems. All exports are in CSV format, and you can choose the fields that you export.

## What can be exported?

Export various datasets from the Orders section:

- **Invitations** All invitations or invitations per list
- **Attendees** All ticket-holders and any info related to them
- **Orders** Individual orders with payment amounts, taxes, refunds etc.
- **Reports** All reports can be exported as CSV, PDF, or Excel

Any filtered view within the above sections can also be exported individually.

## Creating exports

1. Navigate to the section you want to export from
2. Apply any filters you want
3. Click on the dropdown, and then "Export"
4. Choose your format and what to include
5. Download the file immediately or click "Print" to view the export in your browser


### Custom fields

Custom fields allow you to collect specific information from customers and attendees beyond the standard name and email. This is essential for gathering dietary requirements, t-shirt sizes, session preferences, or any other data you need.

You can also use custom fields to attach data to your event for use in your [HTML templates](/docs/guides/fully-custom-layouts).

## What are custom fields?

Custom fields are questions you add to the registration process. Attendees answer these questions when purchasing tickets or updating their information, and their responses are stored with their attendee record.

## Field settings

When creating a custom field, you choose what to attach it to: **Events** or **Ticket types**.

### Ticket type fields

Fields attached to ticket types are presented to attendees during registration and their responses are stored against each ticket holder. They can be:

- **Public writeable** - Attendees can see and fill in the field
- **Public read-only** - Attendees can see the value but not edit it
- **Secret** - Only you and your team can see and edit the field

### Event fields

Fields attached to Events don't appear during registration. Instead, they appear in the event's **Settings > Custom data** section, where you fill them in yourself. This lets you store per-event data — such as a venue contact name, a sponsor message, or any other value that varies event to event — and reference it in your Liquid templates.

Access event custom field values in templates using the field's slug:

```
{{ event.custom_data.your_field_slug }}
```

The slug is the unique ID shown when creating or editing the field (auto-generated from the field name, e.g. a field named "Venue contact" gets the slug `venue_contact`). You can find or edit the slug in the custom field settings.

## Field types

Tito Pro supports various field types:

**Text input** - Short text responses (name, company, job title).

**Text area** - Longer text responses (comments, special requests).

**Dropdown** - Select one option from a list (t-shirt size, meal preference).

**Checkboxes** - Select multiple options from a list (session interests, dietary restrictions).

**Radio buttons** - Choose one option from visible choices (attendance day, experience level).

**Date** - Select a date (birthdate, arrival date).

**Number** - Numeric values (age, years of experience).

## Creating custom fields

1. Navigate to **Custom fields** in your **Account settings**
2. Click **Add custom field**
3. Choose the field type
4. Enter the question text
5. Configure options (for dropdowns, checkboxes, radio buttons)
6. Set whether the field is required or optional
7. Choose whether to attach the field to **Events** or **Ticket types**


### Authorization links

Authorization links are a security feature that protects attendee-facing pages by requiring verification before access is granted. Instead of using permanent URLs that could be shared or leaked, Tito Pro uses single-use, time-limited tokens to ensure only the intended recipient can access their registration, tickets, or event page.

## How it works

When someone receives a link — whether it's an invitation to RSVP, a ticket confirmation, or a private event page — that link contains a unique token. When they click it, the token is verified and a secure cookie is set in their browser. From that point on, they can access the page without needing to re-authenticate.

If the token has already been used or has expired, the visitor is prompted to verify their identity by entering their email address. If the email matches the one on file, a fresh authorization link is sent to them.

## What's protected

Authorization links are used to secure:

- **RSVP pages** — invited guests click through from their invitation email to claim their tickets
- **Ticket pages** — attendees access their ticket details, digital passes, and attendee hub
- **Private landing pages** — restrict access to a registration page to a pre-approved email list

## The verification flow

When someone visits a protected page without a valid token:

1. They're asked to enter their email address
2. The system checks if the email matches an authorized recipient
3. If it matches, a new authorization link is sent to that email
4. They click the link and are granted access

This means that even if a link is forwarded or shared, the original recipient's email is required to gain access. The authorization email acts as a second factor of verification.

## Private landing pages

For invitation-only events, you can restrict your landing page to a list of authorized email addresses. Only people on the list can request an authorization link. This is useful when you want to share a registration URL but still control who can access it.

Configure this in your landing page settings by enabling link authorization and adding the authorized email addresses.

## Security considerations

- **Tokens are single-use** — once a token is consumed, it can't be reused
- **Cookies are secure** — authorization cookies use `SameSite=None`, `Secure`, and `Partitioned` attributes for cross-site compatibility
- **No accounts required** — attendees never need to create an account or remember a password
- **Graceful recovery** — if a link expires or is already used, the re-verification flow is simple and immediate


### Set up an invitation-only event

Some events aren't open to the public — guest lists, private dinners, exclusive launches. This guide shows you how to set up an event where only invited people can register.

## What you’ll set up

- A private event with no public registration
- Invitation-only ticket types
- Personalized invitation emails sent to your guest list

## 1. Create your event

From your account dashboard, click **New event** and fill in your event details. Once you create the event, your event is already ready to go to send invitations, since events are **private** by default.

For full details, see [Creating an event](/docs/getting-started/creating-your-first-event).

## 2. Verify your ticket types

By default a ticket type is automatically created for you. Navigate to **Ticket types** and click **Edit** to change the name, add a description, etc.

For full details, see [Ticket types](/docs/ticket-types/creating-ticket-types).

## 3. Prepare your guest list

Go to **Invitations** and add your guests. You can add them one by one, or import a list from a CSV file. Each invitation is tied to a specific email address or telephone number.

For full details, see [Invitations](/docs/invitations/invitation-lists).

## 4. Add plus-one option

When adding your invitations you can optionally add a number to the **Number of guests allowed** field (maximum of 9 per invite). This will trigger an additional flow during the registration process that will capture information on your invitee’s guests. You can choose which information is captured in **Settings > Invitations > Guest settings**.

## 5. Customize your invitation email

Before sending, customize the invitation email under **Customize > Invitation flow > Invitation**. The email includes a unique registration link for each guest — they click through to a personalized registration page.

For full details, see [Email templates](/docs/messaging/custom-email-templates).

## 6. Send invitations

When you're ready, send your invitations. You can send them all at once or in batches by creating a filter. Track who has been sent their invitation and their RSVP status from the **Invitations** list, or see an overview on the event dashboard.

## 7. Monitor RSVPs

As guests register through their personalized links, they'll appear in your **Attendees** list. If any +1s have been added these will also show in this list together with the primary invitee.

## What's next

- [Combining public tickets with invitations](/docs/guides/hybrid-event) — add open registration alongside your guest list
- [Basic customization](/docs/guides/basic-customization) — customize the invitation experience
- [Setting up check-in](/docs/guides/check-in-day) — prepare for event day


### Set up a hybrid event

Many events need both public registration and private invitations — for example, a conference with open ticket sales but invite-only speaker and sponsor passes. This guide shows you how to set up both in a single event.

## What you’ll set up

- Public ticket types for open registration
- Invitation-only ticket types for VIPs, speakers, or sponsors

## 1. Create your event

From your account dashboard, click **New event** and enter your event details.

For full details, see [Creating an event](/docs/getting-started/creating-your-first-event).

## 2. Create public ticket types

Navigate to **Tickets** and create ticket types for your general attendees.

For full details, see [Ticket types](/docs/ticket-types/creating-ticket-types).

## 3. Create invitation-only ticket types

Create additional ticket types for your invited guests — speakers, sponsors, VIPs, or anyone who needs special access.

## 4. Set up invitations

Go to **Invitations** and add your invited guests. Assign each invitation to the appropriate ticket type. Guests receive a personalized link that gives them access to their specific ticket type.

For full details, see [Invitations](/docs/invitations/invitation-lists).

## 5. Create a public landing page

Go to **Access** and create a new **Landing page**. This creates a public event page.

You’ll want to choose to only show your the relevant ticket types. Click **Edit** and enable the **Show specific ticket types** toggle and select your public ticket types then click **Save**.

You can now share the URL of the public landing page to allow people to self-register for your event.

## 6. Monitor both channels

The status of sent invitations can be seen in the **Invitations** view and public registrations can be seen in the **Orders** view.

The combination of attendees from public orders, and accepted invitations can be seen in the **Attendees** view.

## What's next

- [Running a paid event](/docs/guides/paid-event) — configure payment processing for paid tickets
- [Early bird and promotional pricing](/docs/guides/early-bird-pricing) — add time-limited pricing to public tickets
- [Setting up check-in](/docs/guides/check-in-day) — prepare for event day


### Set up a simple ticketed event

This guide walks you through creating a basic event with one or more ticket types and a branded registration page. It's the quickest way to get up and running with Tito Pro.

## What you’ll set up

- A new event with basic details
- One or more ticket types
- A landing page where attendees can register

## 1. Create your event

From your account dashboard, click **New event**. Enter your event title, start date, and optional end date. Your event URL slug is generated automatically — you can customize it if you like.

For full details, see [Creating an event](/docs/getting-started/creating-your-first-event).

## 2. Add ticket types

Navigate to **Ticket types** in your event sidebar. Click  to create a new ticket type. Give it a title, set the price (or leave it free), and configure the quantity available.

If you need multiple tiers — for example, Early Bird and General Admission — create a ticket type for each one. You can control the order they appear on your registration page.

For full details, see [Ticket types](/docs/ticket-types/creating-ticket-types).

## 3. Initialize your landing page

Go to **Access** and under **Share event page** click **Activate share link**. This creates a public event page with all your ticket types shown.

You can now share the URL of the public landing page to allow people to self-register for your event.

For full details, see [Landing pages](/docs/landing-pages-and-widgets/landing-pages).

## 4. Monitor your registrations

You can monitor registrations in real time from your event dashboard and the **Orders** and **Attendees** sections.

## What's next

- [Running a paid event](/docs/guides/paid-event) — set up payment processing for paid tickets
- [Basic customization](/docs/guides/basic-customization) — customize every detail of the attendee experience
- [Setting up check-in](/docs/guides/check-in-day) — prepare for event day


### Set up a free event

Free events are the simplest to set up — no payment configuration needed. This guide covers everything from creating your event to managing RSVPs.

## What you’ll set up

- A free event with RSVP-style registration
- One or more free ticket types with optional quantity limits
- Email confirmations for registered attendees

## 1. Create your event

From your account dashboard, click **New event** and fill in your event details. Since this is a free event, you won't need to configure any payment settings.

For full details, see [Creating an event](/docs/getting-started/creating-your-first-event).

## 2. Create free ticket types

Navigate to **Ticket types** and edit the default name and add a description if necessary. You can also add additional ticket types if needed. Leave the price at zero for each one. You can still set quantity limits to cap attendance.

If you have different attendee types — for example, General and VIP — create a separate ticket type for each. Even though they're all free, this helps you track numbers by category.

For full details, see [Ticket types](/docs/ticket-types/creating-ticket-types).

## 3. Customize confirmation emails

Tito Pro automatically sends a confirmation email when someone registers. You can customize this email under **Customize > Registration flow > Confirmation email** to include additional event details, venue information, or anything else your attendees need.

For full details, see [Email templates](/docs/messaging/custom-email-templates).

## 4. Initialize your landing page

Go to **Access** and under **Share event page** click **Activate share link**. This creates a public event page with all your ticket types shown.

You can now share the URL of the public landing page to allow people to self-register for your event. For free events, the registration flow is quick — attendees just fill in their details and they're confirmed immediately.

For full details, see [Landing pages](/docs/landing-pages-and-widgets/landing-pages).

## 5. Monitor your registrations

You can monitor registrations in real time from your event dashboard and the **Orders** and **Attendees** sections.

## What's next

- [Setting up check-in](/docs/guides/check-in-day) — prepare for event day with the check-in app
- [Basic customization](/docs/guides/basic-customization) — make the registration page match your brand
- [Combining public tickets with invitations](/docs/guides/hybrid-event) — add VIP invitations alongside open registration


### Set up a paid event

This guide walks you through setting up an event with paid tickets, including connecting your payment provider and configuring pricing.

## What you’ll set up

- An event with paid ticket types
- Payment processing via Stripe
- Tax and invoice settings (if needed)

## 1. Create your event

From your account dashboard, click **New event** and enter your event details.

For full details, see [Creating an event](/docs/getting-started/creating-your-first-event).

## 2. Connect your payment provider

Before you can sell tickets, you need to connect a payment provider. In **Account Settings** go to **Integrations** > **Stripe** and then **Connect Stripe**. You can connect multple Stripe accounts, but if you have one it will be the default for all your events.

Tito Pro sends payments directly to your Stripe account — we never hold your funds.

For full details, see the [Connect Stripe](/docs/guides/connect-stripe) guide.

## 3. Create paid ticket types

Navigate to **Ticket types** and click **Edit** on the default ticket type. Set the price and choose the currency. You can also configure:

- **Quantity limits** to cap how many tickets are available
- **Availability windows** to control when tickets go on sale
- **Minimum and maximum per order** to set purchase limits

For full details, see [Ticket types](/docs/ticket-types/creating-ticket-types).

## 4. Configure tax settings (optional)

If you need to charge tax, go to **Tax rates** in your **Account settings** to configure your tax rates. Tito Pro can display prices inclusive or exclusive of tax, and generate invoices with the correct tax information.

For full details, see [Account settings](/docs/settings/account-settings).

## 3. Initialize your landing page

Go to **Access** and under **Share event page** click **Activate share link**. This creates a public event page with all your ticket types shown.

For full details, see [Landing pages](/docs/landing-pages-and-widgets/landing-pages).

## 5. Test your checkout

Before going live, test the full purchase flow. Switch to **Test mode** using the toggle in the bottom-right of the web page. In **Access** select the default landing page and click on the external link button to open the page in test mode. Create a test order to make sure pricing, taxes, and confirmation emails all look correct.

You can use <a href="https://docs.stripe.com/testing" target="_blank" rel="noopener">Stripe test cards</a> to put through paid transactions without incurring a charge.

## 6. Share your event and monitor your registrations

You can now share the URL of the public landing page to allow people to self-register for your event.

You can monitor registrations in real time from your event dashboard and the **Orders** and **Attendees** sections.

## What's next

- [Early bird and promotional pricing](/docs/guides/early-bird-pricing) — set up time-limited discounts
- [Basic customization](/docs/guides/basic-customization) — customize the checkout experience
- [Setting up check-in](/docs/guides/check-in-day) — prepare for event day


### Connect Stripe

To accept payments for your events, you'll need to connect a Stripe account to Tito Pro. This guide walks you through the setup process.

## Prerequisites

- A Tito Pro account
- A Stripe account (you can create one during the setup process)

## Connecting your Stripe account

1. Navigate to your **Account settings**
2. Click **Integrations** in the sidebar
3. Click the  button to add an integration.
4. You’ll be redirected to Stripe to authorize the connection
5. Once authorized, you'll be redirected back to Tito Pro

## Test mode

When you first connect Stripe, you can use test mode to verify everything works before going live. Test mode uses Stripe's test API keys, so no real charges are made.

## Multiple currencies

Once Stripe is connected, you can set prices in any currency that Stripe supports. Each event can use a different currency if needed.

## Disconnecting Stripe

If you need to disconnect your Stripe account, go to your account billing settings and click **Disconnect**. Note that this will prevent you from accepting payments for any events under this account until a new Stripe account is connected.


### Customization overview

Tito Pro gives you full control over how your event looks to attendees — from the registration page to confirmation emails, digital passes, and beyond.

## Levels of customization

There are several levels of customization available, depending on how much control you need:

1. **Basic customization** — set your brand colors and banner image, and add a logo to your receipts using the built-in settings. Brand the Apple Wallet and Google Wallet [digital passes](/docs/customization/digital-passes) your attendees receive. No coding required.
2. **Template customization** — modify the HTML templates for registration pages, emails, and other attendee-facing content using Tito Pro's template editor.
3. **Fully custom layouts** — build completely bespoke registration experiences using custom layouts with full HTML/CSS control.

## Where to start

If you're new to customization, start with [basic customization](/docs/guides/basic-customization) to set up your logo and colors. Once you're comfortable, explore [template customization](/docs/guides/template-customization) for more control, or jump straight to [fully custom layouts](/docs/guides/fully-custom-layouts) if you need complete creative freedom.


### Basic customization

Set up your event's visual identity using Tito Pro's built-in branding options. No coding required — just upload your assets and pick your colors.

## What you’ll set up

- A custom banner and brand colors on your registration page
- A logo on your receipt
- A custom domain for your event URL (optional)
- Branded confirmation and notification emails

## 1. Set your brand basics

Navigate to **Customize** in your event sidebar. Under **Theme settings**, you can:

- Upload your event banner
- Set template colours
- Upload a logo

These theme settings will apply to all templates for the current event.

For full details, see [Branding and themes](/docs/customization/branding-and-themes).

## 2. Configure a custom domain (optional)

Instead of using the default Tito Pro URL (e.g. `example.tito.page`), you can point your own domain at your event. Go to **Account settings > Custom domains** and follow the setup instructions.

Your attendees will see `tickets.example.com` (or whatever subdomain you choose) instead of the default URL.

For full details, see [Custom domains](/docs/customization/custom-domains).

## 3. Customize your emails

Every email Tito Pro sends — confirmations, reminders, invitations — can be customized. Go to **Customize** to edit the templates in the context of the various user-flows in the app. You can change the content, add your logo, and adjust the styling.

For full details, see [Email templates](/docs/messaging/custom-email-templates).

## 4. Preview and test

Before going live, preview your registration page and send yourself a test confirmation email. Check that your branding looks right on both desktop and mobile.

For full details, see [Test mode](/docs/guides/test-mode)

## What's next

- [Template customization](/docs/guides/template-customization) — go further with custom HTML templates
- [Fully custom layouts](/docs/guides/fully-custom-layouts) — build completely bespoke registration pages


### Custom templates

Tito Pro allows you to edit any of the individual templates that power our user flows. The templates support the <a href="https://shopify.github.io/liquid/" target="_blank">Liquid template language </a>. You can move anything around, or you can tweak the defaults easily by editing the template for each screen.

## What you'll learn

- How to access and edit templates
- Which templates are available for customization
- How to use Liquid template variables
- How to preview and test your changes

## 1. Access the template editor

Navigate to **Customize** in your event sidebar. You'll see a list of all customizable templates, grouped by type:

- **Invitation flow** — The OG flow for sending invitations and receiving RSVPs
- **Paid Invitation flow** — You can invite folks to pay to confirm their attendance
- **Adding a guest** — Templates for when invitations allow guests
- **Declined flow** — When potential guests decline their invitation
- **Cancel flow** — When guests accept but subsequently cancel their attendance
- **(Paid) Registration flow** — The classic ticketing flow where guests choose tickets and complete an order
- **Public RSVP** — The **Invitation flow** above, but where attendees self-register rather than you send them their invitation directly
- **Authorization flow** — Event expired or sold out messages
- **Emails** — Various other emails for different contexts
- **Exception cases** — Event expired or sold out messages
- **Invitation emails** — for invitation-only events

## 2. Edit a template

Select a template to open the editor, and switch from the “Preview” view to the “HTML” view. Each template starts with Tito Pro's default content, which you can modify freely.

If at any point you’d like to restart and wipe any changes you can delete the contents of the template, click “Publish” and the default code will be restored.

Templates use **Liquid** syntax for dynamic content — things like attendee names, order details, and event information. For example:

```
Hello {{ ticket.first_name }}, thanks for registering for {{ event.title }}.
```

## 3. Preview and test

Use the preview feature to see how your template looks with sample data. Send test emails to yourself before going live.

For full details, see [Test mode](/docs/guides/test-mode)

## What's next

- [Fully custom layouts](/docs/guides/fully-custom-layouts) — take full control with custom HTML and CSS layouts
- [Basic customization](/docs/guides/basic-customization) — if you haven't set up your branding basics yet


### Fully custom layouts

Tito Pro allows you to bring your own HTML templates so that you have full control over the branding of the customer journey. Everything from `<!doctype html>` to `</html>` can be customised.

## What you'll learn

- How to create a custom layout
- How to structure your HTML
- How to include Tito Pro's registration widget
- How to style everything with your own CSS

## 1. Create a custom layout

Navigate to **HTML templates** in your **Account settings**. Create a new template and you'll have a blank canvas to work with.

You’ll likely want to start with a web layout template so name your file in the `Name` field and select the `Web templates` checkbox. `Layout component name` can stay blank for this type of file. Add the code for your HTML page and click `Save changes`.

## 2. Structure your HTML

Your custom layout is a full HTML document. You have complete control over the markup, but you need to include code to allow Tito Pro to insert the relevant invitation or registration flow.

This can be done by simply adding the following where you’d like the code to be injected:

```
<turbo-frame id="content" class="main-content">
  <slot />
</turbo-frame>
```

## 3. Add your styles

Include your own CSS — either inline, in a `<style>` tag, or linked from an external stylesheet. Tito Pro's default styles won't interfere with your custom layout.

## 4. Adding Tito Pro hosted stylesheets and JavaScript file

If you’d like to add your own separate stylesheet hosted on Tito Pro you can create a new HTML template, give it a name and choose `Stylesheet` in the `Kind` dropdown. Name the stylesheet component something like `my-stylesheet` (use dashes as separators).

Add your CSS styles and save the template.

In your web template you’ll need to reference the file so add the following with the `<head>`:

```
<stylesheet name="my-stylesheet" />
```

The same pattern can be used for JavaScript files.

## 5. Adding your own components

If you have a block of code that is reused across multiple HTML files you can create components to reduce duplicate code.

For example if you’d like to add a reusable header, you would create a new HTML template, give it a name and choose `Component` in the `Kind` dropdown. Name the component something like `my-header` (use dashes as separators).

Add your HTML and save the template.

When you need to insert the component simply add:

```
<my-header></my-header>
```

### Overriding default components

Some parts of the Tito Pro interface use default components that have a built-in default but can be overridden. These are marked with the `fallback` attribute:

```
<checkout-table-b2b fallback />
```

When a component has the `fallback` attribute, Tito Pro will first check for an account-level component with a matching name. If one exists, it will be used. Otherwise, the built-in default is used.

To override a default component, create a new HTML template with `Component` as the kind and set the component name to match the default (e.g. `checkout-table-b2b`). Your version will be used instead of the built-in default.

### Using the built-in version of a component

If you want to ensure the built-in default is always used, even when an account-level override exists, use the `builtin` attribute instead:

```
<checkout-table-b2b builtin />
```

This will always load the built-in version, ignoring any account-level overrides.

## 6. Preview and publish

Preview your custom layout to make sure everything looks right. Once you're happy, publish it and your attendees will see your fully branded experience.

## Using event data in your templates

Your HTML templates are rendered with Liquid, so you can output dynamic event data anywhere in your layout. For example, `{{ event.title }}` or `{{ event.location }}`.

You can also define your own per-event values using [event-level custom fields](/docs/guides/custom-fields) and reference them with `{{ event.custom_data.your_field_slug }}`. This is useful for things like venue contact details, sponsor messages, or any content that varies between events but belongs in the layout rather than the registration flow.

## What's next

- [Basic customization](/docs/guides/basic-customization) — start with the basics if you haven't already
- [Template customization](/docs/guides/template-customization) — customize individual templates within your layout
- [Custom fields](/docs/guides/custom-fields) — set up event-level fields to use in your templates


### Setting up check-in for event day

Tito Pro includes a check-in system so you can track arrivals on event day. This guide covers setting up check-in, assigning team members, and using the check-in app.

## What you’ll set up

- Check-in enabled for your event
- Team members with check-in access
- The check-in app on your phone or tablet

## 1. Verify check-in list

Navigate to **Check-in** in your event sidebar. By default a check-in list will already have been created which allows check-ins for all attendees regardless of ticket type.

Click **Edit** to adjust the information shown after check-in or to limit the list just specific ones.

For full details, see [Check-in](/docs/check-in/checkin-lists).

## 2. Add check-in team members

By default, we assume there will be at least one check-in device — a mobile phone or table which has a camera. You can add as many devices as you need by clicking on the **Add scanner** button and giving them a name and/or location.

If you have staff or volunteers helping with check-in, add their devices as separate scanners and click the  button to allow them to scan and initialize their scanning device.

## 3. Set up the check-in app

The Tito Pro check-in app works on any phone or tablet with a web browser. Each device just needs to scan the set-up QR code shown after pressing the  icon.

By default only the reference is sent to the device meaning if it is lost or stolen attendee data isn’t compromised. You can adjust which fields are sent to the device in the check-in list settings.

## 4. Check in on the day

On event day, your team opens the check-in app and starts checking people in. The dashboard shows real-time stats — how many have arrived, how many are still expected, and a breakdown by ticket type.

Some final tips:

- **Test beforehand** — have your check-in team open the app and test it before event day
- **Keep the app open** — it updates in real time, so there's no need to refresh
- **Offline support** — if your connection drops briefly, the app queues check-ins and syncs when back online

## What's next

- [Setting up a simple ticketed event](/docs/guides/simple-ticketed-event) — make sure your event basics are in place
- [Running an invitation-only event](/docs/guides/invitation-only-event) — check-in works with invitations too
- [Basic customization](/docs/guides/basic-customization) — customize the check-in experience


# Tito Pro API Reference

Version: v1

All API requests require authentication using a Bearer token.

## Creating an API token

1. Go to your **Account settings**
2. Navigate to the **API tokens** section
3. Click **Create API token**
4. Give your token a descriptive name
5. Copy the token and store it securely - you won't be able to see it again

## Using your token

Include your API token in the `Authorization` header of every request: `Authorization: Bearer YOUR_API_TOKEN`

## Verify your credentials

Use the API root endpoint to check that your token is working. It returns your account slug on success, or a `401` if the token is invalid.

#### Example request

```bash
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
  https://api.staging.pro.tito.io/
```

#### Example response

```json
{
  "account_slug": "{account_slug}"
}
```

## Token security

- Keep your tokens secret. Do not commit them to version control.
- Each token is scoped to a single account.
- You can revoke tokens at any time from your **Account settings**.
- If you believe a token has been compromised, revoke it immediately and create a new one.


The API uses standard HTTP status codes to indicate the outcome of requests.

## Status codes

| Code | Meaning |
|------|---------|
| `200` | Success |
| `401` | Unauthorized - no token provided or token is invalid |
| `403` | Forbidden - token does not have access to this resource |
| `404` | Not found - the resource does not exist |
| `429` | Too many requests - rate limit exceeded |
| `500` | Internal server error |

## Error response format

Error responses include a JSON body with an `error` or `message` field:

```json
{
  "error": "Account or event not found"
}
```

## Common errors

### 401 Unauthorized

Your API token is missing or invalid. Check that you're including the `Authorization: Bearer YOUR_TOKEN` header.

### 403 Forbidden

Your API token does not have access to the requested resource. API tokens are scoped to a specific account.

### 404 Not found

The resource you requested does not exist. Check that the account slug, event slug, or resource ID is correct.


The Tito Pro API lets you programmatically access your event data. You can list events, retrieve orders and tickets, and query check-in lists.

## Base URL

All API requests should be made to `https://api.staging.pro.tito.io`.

## Content type

All responses are returned as JSON. Set your `Accept` header to `application/json`.

## Versioning

The API is currently at version **v0**, currently under active development.


List endpoints return paginated results. The response includes a `meta` object with pagination details.

## Request parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `page` | integer | Page number (default: 1) |

## Response meta object

Paginated responses include a `meta` object:

```json
{
  "meta": {
    "lookup_mode": "live",
    "pagination": {
      "page": 1,
      "items": 20,
      "pages": 5,
      "count": 100
    }
  }
}
```

| Field | Description |
|-------|-------------|
| `pagination.page` | Current page number |
| `pagination.items` | Number of items per page |
| `pagination.pages` | Total number of pages |
| `pagination.count` | Total number of records |

## Example

For any API request that needs to be paginated, simply add a `page` parameter.

```bash
# Fetch page 2 of orders
curl -H "Authorization: Bearer YOUR_API_TOKEN" \
  "https://api.staging.pro.tito.io/{account_slug}/{event_slug}/orders?page=2"
```


The API enforces rate limits to ensure fair usage and service stability.

## Limits

- **100 requests per minute** per API token

## Exceeding the limit

If you exceed the rate limit, you will receive a `429 Too Many Requests` response. When this happens:

1. Implement exponential backoff in your client
2. Consider caching responses that don't change frequently

## Best practices

- Cache responses where possible
- Use pagination to reduce the number of requests
- Avoid polling - use reasonable intervals between requests


Webhooks let you receive real-time notifications when events happen in your Tito account. Instead of polling the API, you configure a URL and Tito will send an HTTP POST request to it whenever a subscribed event occurs.

## Supported events

| Event | Description |
|-------|-------------|
| `order.created` | An order has been placed |
| `order.updated` | An order has been updated |

## Setting up a webhook

1. Go to your **Account settings**
2. Navigate to the **Webhooks** section
3. Click **Create webhook**
4. Enter the URL where you want to receive events
5. Select the events you want to subscribe to
6. Copy your signing secret and store it securely

Webhook URLs must use HTTPS in production. HTTP URLs are allowed in test mode.

## Payload format

When an event occurs, Tito sends a POST request to your webhook URL with a JSON payload:

```json
{
  "id": 123456,
  "webhook_event": "order.created",
  "state": "pending",
  "attempts": 1,
  "created_at": "2026-02-08T10:30:00Z",
  "data": {
    "type": "order",
    "id": 789,
    "object": {
      "id": 789,
      "reference": "ABCD-1234",
      "name": "Jane Smith",
      "email": "jane@example.com"
    }
  }
}
```

The `data.object` contains the full resource as returned by the corresponding API endpoint.

## Request headers

Every webhook request includes the following headers:

| Header | Description |
|--------|-------------|
| `Content-Type` | `application/json` |
| `User-Agent` | `Tito-Webhook/1.0` |
| `X-Tito-Webhook-Event` | The event type, e.g. `order.created` |
| `X-Tito-Timestamp` | Unix timestamp of when the request was sent |
| `X-Tito-Signature` | HMAC-SHA256 signature for verifying authenticity |

## Verifying signatures

Each webhook request is signed using your webhook's secret key. You should verify the signature to ensure the request came from Tito.

The signature is computed as an HMAC-SHA256 hex digest of the timestamp and request body, joined with a period.

### Ruby

```ruby
timestamp = request.headers["X-Tito-Timestamp"]
signature = request.headers["X-Tito-Signature"]
body = request.raw_post

expected = OpenSSL::HMAC.hexdigest(
  "SHA256",
  webhook_secret,
  "#{timestamp}.#{body}"
)

if ActiveSupport::SecurityUtils.secure_compare(expected, signature)
  # Request is authentic
else
  # Reject the request
end
```

### Node.js

```javascript
const crypto = require("crypto");

const timestamp = req.headers["x-tito-timestamp"];
const signature = req.headers["x-tito-signature"];
const body = req.body; // raw body string

const expected = crypto
  .createHmac("sha256", webhookSecret)
  .update(`${timestamp}.${body}`)
  .digest("hex");

if (crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature))) {
  // Request is authentic
} else {
  // Reject the request
}
```

### Python

```python
import hmac
import hashlib

timestamp = request.headers["X-Tito-Timestamp"]
signature = request.headers["X-Tito-Signature"]
body = request.get_data(as_text=True)

expected = hmac.new(
    webhook_secret.encode(),
    f"{timestamp}.{body}".encode(),
    hashlib.sha256
).hexdigest()

if hmac.compare_digest(expected, signature):
    # Request is authentic
else:
    # Reject the request
```

### PHP

```php
$timestamp = $_SERVER["HTTP_X_TITO_TIMESTAMP"];
$signature = $_SERVER["HTTP_X_TITO_SIGNATURE"];
$body = file_get_contents("php://input");

$expected = hash_hmac("sha256", "{$timestamp}.{$body}", $webhookSecret);

if (hash_equals($expected, $signature)) {
    // Request is authentic
} else {
    // Reject the request
}
```

## Responding to webhooks

Your endpoint should return a `2xx` status code to acknowledge receipt. Any other status code is treated as a failure.

## Retries and failure handling

If delivery fails, Tito retries with exponential backoff:

| Attempt | Delay |
|---------|-------|
| 1 | 30 seconds |
| 2 | 2 minutes |
| 3 | 8 minutes |
| 4 | 32 minutes |
| 5 | ~2 hours |

After 5 retry attempts, the delivery is marked as failed. If a webhook accumulates 10 consecutive failures across any events, it is automatically disabled. You can re-enable it from your **Account settings**.

## Retention

Webhook event logs are retained for 7 days and then automatically pruned.

## Best practices

- **Always verify signatures** to ensure requests are from Tito
- **Respond quickly** with a `2xx` status code, then process the payload asynchronously
- **Handle duplicates** — in rare cases the same event may be delivered more than once
- **Use HTTPS** to protect the payload in transit
- **Keep your signing secret safe** — regenerate it if you suspect it has been compromised


## Account

### GET `/{account_slug}`

Returns basic information about your Tito account. Use this endpoint to verify your API credentials and retrieve your account details.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account. This is the account identifier you see in your Tito dashboard URL. |

#### Responses

- **200**: successful - account details retrieved
- **401**: unauthorized - no bearer token provided or token is invalid
- **403**: forbidden - account slug does not match your API token

#### Example response

```json
{
  "id": 12345,
  "name": "My Conference Company"
}

```

---

## Checkin Lists

### GET `/{account_slug}/{event_slug}/checkin_lists/{checkin_list_id}/checkins`

Returns all checkins for a checkin list, ordered by most recent first

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | Account slug |
| `event_slug` | path | string | Yes | Event slug |
| `checkin_list_id` | path | integer | Yes | Checkin list ID |

#### Responses

- **200**: successful
- **401**: unauthorized
- **404**: not found

#### Example response

```json
{
  "checkin_lists": [
    {
      "id": 1,
      "name": "Main entrance",
      "checked_in_count": 42,
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    },
    {
      "id": 2,
      "name": "VIP entrance",
      "checked_in_count": 8,
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "next_page": null,
    "prev_page": null,
    "total_pages": 1,
    "total_count": 2
  }
}

```

---

### GET `/{account_slug}/{event_slug}/checkin_lists/{checkin_list_id}/orders`

Returns all orders that can be checked in to this checkin list, including QR code identifiers and ticket type counts

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | Account slug |
| `event_slug` | path | string | Yes | Event slug |
| `checkin_list_id` | path | integer | Yes | Checkin list ID |

#### Responses

- **200**: successful
- **401**: unauthorized

#### Example response

```json
{
  "checkin_lists": [
    {
      "id": 1,
      "name": "Main entrance",
      "checked_in_count": 42,
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    },
    {
      "id": 2,
      "name": "VIP entrance",
      "checked_in_count": 8,
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "next_page": null,
    "prev_page": null,
    "total_pages": 1,
    "total_count": 2
  }
}

```

---

### POST `/{account_slug}/{event_slug}/checkin_lists/{checkin_list_id}/orders/{order_qr_token}/checkins`

Creates checkins for an order using its QR code token. Pass ticket type slugs as form parameters with the number of tickets to check in. For example, if the order has a ticket type with slug `general-admission`, send `general-admission=1` to check in one ticket of that type.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | Account slug |
| `event_slug` | path | string | Yes | Event slug |
| `checkin_list_id` | path | integer | Yes | Checkin list ID |
| `order_qr_token` | path | string | Yes | Order QR code token |

#### Responses

- **201**: created
- **401**: unauthorized

---

### GET `/{account_slug}/{event_slug}/checkin_lists/{checkin_list_id}/tickets`

Returns all tickets that can be checked in to this checkin list, including QR code identifiers

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | Account slug |
| `event_slug` | path | string | Yes | Event slug |
| `checkin_list_id` | path | integer | Yes | Checkin list ID |

#### Responses

- **200**: successful
- **401**: unauthorized

#### Example response

```json
{
  "checkin_lists": [
    {
      "id": 1,
      "name": "Main entrance",
      "checked_in_count": 42,
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    },
    {
      "id": 2,
      "name": "VIP entrance",
      "checked_in_count": 8,
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "next_page": null,
    "prev_page": null,
    "total_pages": 1,
    "total_count": 2
  }
}

```

---

### POST `/{account_slug}/{event_slug}/checkin_lists/{checkin_list_id}/tickets/{ticket_qr_token}/checkins`

Creates a checkin for a ticket using its QR code token

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | Account slug |
| `event_slug` | path | string | Yes | Event slug |
| `checkin_list_id` | path | integer | Yes | Checkin list ID |
| `ticket_qr_token` | path | string | Yes | Ticket QR code token |

#### Responses

- **201**: created
- **401**: unauthorized

---

### GET `/{account_slug}/{event_slug}/checkin_lists`

Returns all checkin lists for an event

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | Account slug |
| `event_slug` | path | string | Yes | Event slug |
| `q` | query | string | No | Search query |

#### Responses

- **200**: successful
- **401**: unauthorized
- **403**: forbidden

#### Example response

```json
{
  "checkin_lists": [
    {
      "id": 1,
      "name": "Main entrance",
      "checked_in_count": 42,
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    },
    {
      "id": 2,
      "name": "VIP entrance",
      "checked_in_count": 8,
      "created_at": "2025-01-01T00:00:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    }
  ],
  "meta": {
    "current_page": 1,
    "next_page": null,
    "prev_page": null,
    "total_pages": 1,
    "total_count": 2
  }
}

```

---

### GET `/{account_slug}/{event_slug}/checkin_lists/{id}`

Returns details of a specific checkin list

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | Account slug |
| `event_slug` | path | string | Yes | Event slug |
| `id` | path | string | Yes | Checkin list ID |

#### Responses

- **200**: successful
- **401**: unauthorized
- **403**: forbidden
- **404**: not found

#### Example response

```json
{
  "id": 1,
  "name": "Main entrance",
  "checked_in_count": 42,
  "created_at": "2025-01-01T00:00:00Z",
  "updated_at": "2025-01-15T10:30:00Z"
}

```

---

## Events

### GET `/{account_slug}/events`

Returns a paginated list of all events in your account that the API token has access to. Supports filtering by date range, status, and custom field responses.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | Your Tito account slug |
| `page` | query | integer | No | Page number for pagination (default: 1) |
| `starts_after` | query | string | No | Events starting on or after this date (e.g. 2025-06-01) |
| `starts_before` | query | string | No | Events starting on or before this date (e.g. 2025-12-31) |
| `status` | query | string | No | upcoming, current, or past:
 * `upcoming` 
 * `current` 
 * `past` 
  |
| `filter[custom_field_slug]` | query | string | No | Filter by custom field slug (e.g. filter[track]=Frontend) |

#### Responses

- **200**: successful - events list retrieved
- **401**: unauthorized - no bearer token provided or token is invalid
- **403**: forbidden - account slug does not match your API token

#### Example response

```json
{
  "events": [
    {
      "id": 123456,
      "title": "My Conference 2025",
      "slug": "my-conference-2025"
    },
    {
      "id": 123457,
      "title": "Workshop Series",
      "slug": "workshop-series"
    }
  ]
}

```

---

### GET `/{account_slug}/events/{id}`

Returns detailed information about a specific event including dates, location, venue, sold out status, and custom metadata. You can use either the event slug or numeric ID.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | Your Tito account slug |
| `id` | path | string | Yes | Event slug or numeric ID |

#### Responses

- **200**: successful - event details retrieved
- **401**: unauthorized - no bearer token provided or token is invalid
- **404**: not found - event slug does not exist or is not accessible

#### Example response

```json
{
  "id": 123456,
  "title": "My Conference 2025"
}

```

---

## Root

### GET `/`

The root endpoint of the Tito API. Use this to verify that the API is accessible and your authentication is working. This is a simple health check endpoint that requires authentication.

#### Responses

- **200**: successful - API is accessible
- **401**: unauthorized - no bearer token provided or token is invalid

---

## Invitation Lists

### GET `/{account_slug}/{event_slug}/invitation_lists`

Returns a paginated list of all invitation lists for the specified event.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `page` | query | integer | No | Page number for pagination (default: 1) |

#### Responses

- **200**: successful - invitation lists retrieved
- **401**: unauthorized - no bearer token provided or token is invalid

---

### POST `/{account_slug}/{event_slug}/invitation_lists`

Creates a new invitation list for the specified event.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |

#### Responses

- **201**: created - invitation list successfully created
- **422**: unprocessable entity - validation errors
- **401**: unauthorized - no bearer token provided or token is invalid

---

### GET `/{account_slug}/{event_slug}/invitation_lists/{id}`

Returns detailed information about a specific invitation list.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `id` | path | string | Yes | The unique identifier for the invitation list |

#### Responses

- **200**: successful - invitation list details retrieved
- **404**: not found - invitation list does not exist

---

### PATCH `/{account_slug}/{event_slug}/invitation_lists/{id}`

Updates an existing invitation list. Note: distribution_option, expires_at, and auto_delivering cannot be changed after invitations have been sent.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `id` | path | string | Yes | The unique identifier for the invitation list |

#### Responses

- **200**: successful - invitation list updated
- **404**: not found - invitation list does not exist

---

## Invitations

### GET `/{account_slug}/{event_slug}/invitations`

Returns a paginated list of all invitations for the specified event.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `page` | query | integer | No | Page number for pagination (default: 1) |

#### Responses

- **200**: successful - invitations list retrieved
- **401**: unauthorized - no bearer token provided or token is invalid
- **403**: forbidden - API token does not have access to this event

---

### POST `/{account_slug}/{event_slug}/invitations`

Creates a new invitation for the specified event. Requires an invitation_list_id and ticket_type_id to associate the invitation with.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |

#### Responses

- **201**: created - invitation successfully created
- **422**: unprocessable entity - validation errors
- **401**: unauthorized - no bearer token provided or token is invalid

---

### GET `/{account_slug}/{event_slug}/invitations/{id}`

Returns detailed information about a specific invitation.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `id` | path | string | Yes | The unique identifier for the invitation |

#### Responses

- **200**: successful - invitation details retrieved
- **401**: unauthorized - no bearer token provided or token is invalid
- **404**: not found - invitation ID does not exist or is not accessible

---

### PATCH `/{account_slug}/{event_slug}/invitations/{id}`

Updates an existing invitation. You can update the invitee details, ticket type, or invitation list.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `id` | path | string | Yes | The unique identifier for the invitation |

#### Responses

- **200**: successful - invitation updated
- **422**: unprocessable entity - validation errors
- **404**: not found - invitation does not exist

---

## Orders

### GET `/{account_slug}/{event_slug}/orders`

Returns a paginated list of all orders for the specified event. Each order includes customer details, reference number, and amount.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `page` | query | integer | No | Page number for pagination (default: 1) |

#### Responses

- **200**: successful
- **401**: unauthorized - no bearer token provided or token is invalid
- **403**: forbidden - API token does not have access to this event

#### Example response

```json
{
  "orders": [
    {
      "id": 123456,
      "name": "John Smith",
      "email": "john@example.com",
      "reference": "ABCD-1234",
      "amount": {
        "cents": 15000,
        "currency_iso": "USD"
      },
      "created_at": "2025-01-15T10:30:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    },
    {
      "id": 123457,
      "name": "Jane Doe",
      "email": "jane@example.com",
      "reference": "EFGH-5678",
      "amount": {
        "cents": 30000,
        "currency_iso": "USD"
      },
      "created_at": "2025-01-16T14:00:00Z",
      "updated_at": "2025-01-16T14:00:00Z"
    }
  ],
  "meta": {
    "lookup_mode": "live",
    "pagination": {
      "page": 1,
      "items": 20,
      "pages": 1,
      "count": 2
    }
  }
}

```

---

### GET `/{account_slug}/{event_slug}/orders/{id}`

Returns detailed information about a specific order, including customer details, invoice, and associated tickets.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `id` | path | string | Yes | The unique identifier for the order. Can be a numeric ID or a secret identifier token (e.g. order-abc123) |

#### Responses

- **200**: successful
- **401**: unauthorized - no bearer token provided or token is invalid
- **403**: forbidden - API token does not have access to this event
- **404**: not found - order ID does not exist or is not accessible

#### Example response

```json
{
  "id": 123456,
  "name": "John Smith",
  "email": "john@example.com",
  "ticket_ids": [1001, 1002, 1003]
}

```

---

## Ticket Types

### GET `/{account_slug}/{event_slug}/ticket_types`

Returns a paginated list of all ticket types for the specified event, sorted by position. Each ticket type includes pricing, capacity, and configuration details.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `page` | query | integer | No | Page number for pagination (default: 1) |
| `q` | query | string | No | Search ticket types by name or slug |
| `sort` | query | string | No | Sort order. Default is by position. Use name_az for A–Z or name_za for Z–A.:
 * `name_az` 
 * `name_za` 
  |

#### Responses

- **200**: successful - ticket types list retrieved
- **401**: unauthorized - no bearer token provided or token is invalid
- **403**: forbidden - API token does not have access to this event

#### Example response

```json
{
  "ticket_types": [
    {
      "id": 101,
      "slug": "early-bird",
      "name": "Early bird",
      "description": "Discounted ticket for early registrants",
      "price": 10000,
      "currency": "eur",
      "quantity": 100,
      "position": 1,
      "is_bundle": false,
      "tax_behavior": "exclusive",
      "created_at": "2025-01-15T10:30:00Z",
      "updated_at": "2025-01-15T10:30:00Z"
    },
    {
      "id": 102,
      "slug": "regular",
      "name": "Regular",
      "description": null,
      "price": 20000,
      "currency": "eur",
      "quantity": null,
      "position": 2,
      "is_bundle": false,
      "tax_behavior": "exclusive",
      "created_at": "2025-01-16T14:00:00Z",
      "updated_at": "2025-01-16T14:00:00Z"
    }
  ],
  "meta": {
    "lookup_mode": "live",
    "pagination": {
      "page": 1,
      "items": 20,
      "pages": 1,
      "count": 2
    }
  }
}

```

---

### GET `/{account_slug}/{event_slug}/ticket_types/{id}`

Returns detailed information about a specific ticket type, including settings, buy-x-get-y-free configuration, dependencies, and bundle items.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `id` | path | string | Yes | The unique identifier or slug for the ticket type |

#### Responses

- **200**: successful - ticket type details retrieved
- **401**: unauthorized - no bearer token provided or token is invalid
- **403**: forbidden - API token does not have access to this event
- **404**: not found - ticket type ID does not exist or is not accessible

#### Example response

```json
{
  "id": 101,
  "slug": "early-bird",
  "name": "Early bird",
  "description": "Discounted ticket for early registrants",
  "price": 10000,
  "currency": "eur",
  "quantity": 100,
  "position": 1,
  "is_bundle": false,
  "tax_behavior": "exclusive",
  "tickets_count": 42,
  "settings": {
    "anonymous": false,
    "qr_code_disabled": false,
    "maximum_tickets_per_order": 100
  },
  "created_at": "2025-01-15T10:30:00Z",
  "updated_at": "2025-01-15T10:30:00Z"
}

```

---

## Tickets

### GET `/{account_slug}/{event_slug}/tickets`

Returns a paginated list of all tickets (attendees) for the specified event. Each ticket represents an individual attendee and includes their name, email, and associated order.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `page` | query | integer | No | Page number for pagination (default: 1) |

#### Responses

- **200**: successful - tickets list retrieved
- **401**: unauthorized - no bearer token provided or token is invalid
- **403**: forbidden - API token does not have access to this event

#### Example response

```json
{
  "tickets": [
    {
      "id": 123456,
      "name": "Jane Smith",
      "email": "jane@example.com",
      "order_id": 789
    },
    {
      "id": 123457,
      "name": "Bob Johnson",
      "email": "bob@example.com",
      "order_id": 790
    }
  ]
}

```

---

### GET `/{account_slug}/{event_slug}/tickets/{id}`

Returns detailed information about a specific ticket (attendee). By default returns order_id; you can use the `include=order` query parameter to embed full order details in the response instead.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `event_slug` | path | string | Yes | The unique slug identifier for the event |
| `id` | path | string | Yes | The unique identifier for the ticket |

#### Responses

- **200**: successful - ticket details retrieved
- **401**: unauthorized - no bearer token provided or token is invalid
- **403**: forbidden - API token does not have access to this event
- **404**: not found - ticket ID does not exist or is not accessible

#### Example response

```json
{
  "id": 123456,
  "name": "Jane Smith",
  "email": "jane@example.com",
  "order_id": 789
}

```

---

## Webhook Events

### GET `/{account_slug}/webhooks/events`

Returns a paginated list of all webhook events for the specified account. Each webhook event includes the event type, state, and associated data.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `page` | query | integer | No | Page number for pagination (default: 1) |
| `event_slug` | query | string | No | Filter by event slug |

#### Responses

- **200**: successful
- **401**: unauthorized - no bearer token provided or token is invalid

---

### GET `/{account_slug}/webhooks/events/{id}`

Returns detailed information about a specific webhook event, including the full payload data.

#### Parameters

| Name | In | Type | Required | Description |
|------|------|------|----------|-------------|
| `account_slug` | path | string | Yes | The unique slug identifier for your Tito account |
| `id` | path | string | Yes | The unique identifier for the webhook event |

#### Responses

- **200**: successful
- **401**: unauthorized - no bearer token provided or token is invalid
- **404**: not found - webhook event ID does not exist or is not accessible

---
