# The Storefront (/docs/live-events/storefront)



Every published event gets a public page at `resyevents.com/e/{slug}`. That page is the whole buying
experience: the poster and details, the ticket picker, checkout, and the confirmation with QR tickets.
Only [published](/docs/live-events/publishing) events resolve. A draft, an unpublished, or a
mistyped link returns "Event not found", so a slug that leaks early sells nothing.

The root of `resyevents.com` is not a public event directory. It redirects to resytech.com, so the
links you share are the event page and the [venue page](#the-venue-page).

The Event Page [#the-event-page]

The page is built from what you entered on the event and its venue:

| Area                 | What appears                                                                                                                                                                                                                            |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Header**           | Poster image, event name, the date and time range in the event's own time zone, and "Doors open …" when a doors time is set.                                                                                                            |
| **Venue line**       | Venue name and address, when either is filled in.                                                                                                                                                                                       |
| **About this event** | Your description, with line breaks preserved.                                                                                                                                                                                           |
| **Gallery**          | Event photos in your chosen order. Clicking the poster or any photo opens a full-screen viewer.                                                                                                                                         |
| **Venue section**    | Venue name, address, an **Open Map** button (Google Maps), venue photos, venue logo, website and social links, and a **More Events** button when the event is linked to a [venue](/docs/live-events/venues) rather than typed manually. |
| **Tickets panel**    | The buying rail: tiers, add-ons, subtotal, and the **Get tickets** button. On phones this becomes a summary bar pinned to the bottom of the screen.                                                                                     |

The page also fills in preview cards for social shares and messaging apps using the event name,
description, and poster. Colors and typography come from the [theme](/docs/live-events/themes)
on the event, or the venue's theme if the event has none.

Picking Tickets and Add-Ons [#picking-tickets-and-add-ons]

Only **active** ticket types and add-ons appear, in the sort order you set. For each tier the buyer
sees the name, the description, and either the price or the word "Free".

* A tier with a minimum per order shows "min 2" beside the price, and the stepper starts there.
* The stepper is capped by whichever is lower: your per-order maximum, or what is actually left.
  With no per-order maximum set, a single order tops out at 10 of that tier.
* When 8 or fewer remain, a red "Only 4 left" line appears under the price.
* A tier with nothing left shows a **Sold out** pill instead of a stepper.

Add-ons sit under the tickets in their own section labelled "Purchased alongside tickets". Their
steppers stay disabled until at least one ticket is selected, so nobody can buy a drink package with
no admission. Add-ons with no capacity set are unlimited and never show a remaining count.

The panel totals the selection as a subtotal and notes that fees and taxes are calculated at checkout.
Availability shown on the page is live but advisory: it counts tickets already sold plus tickets other
buyers currently have on hold. The binding check happens the moment the buyer presses **Get tickets**.

The Ten Minute Hold [#the-ten-minute-hold]

Pressing **Get tickets** reserves the selection for **10 minutes** and moves the buyer to checkout. The
countdown is visible the whole time, in the checkout header ("Held for 6:42") and, if they navigate
back to the event page, in a "You have tickets on hold. Finish checking out." banner.

Held tickets are subtracted from what everyone else can see and buy, so two buyers cannot both take the
last seat. When the timer runs out the hold is released automatically, the tickets return to the pool,
and the buyer sees "Your ticket hold expired" with a link back to the event. Going **Back to event**
from checkout releases the hold immediately and restores the buyer's picked quantities so they can
adjust and try again.

Reserving is all or nothing. If any part of the selection cannot be reserved, nothing is held and the
buyer is told why:

| What the buyer sees                                                           | Why                                                                                                        |
| ----------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| `"VIP" just sold out.`                                                        | Nothing left in that tier.                                                                                 |
| `Only 3 left for "VIP". Adjust your quantity and try again.`                  | Someone else took some while they were choosing.                                                           |
| `Tickets are not on sale right now.`                                          | The current time is outside the event's sales window or that tier's own window.                            |
| `That's more than the per-order limit for "VIP".`                             | Above the tier's per-order maximum.                                                                        |
| `That is more tickets than one cart can hold for this event.`                 | One cart can hold 25 tickets for a single event by default. Large groups check out in more than one order. |
| `This event was just updated. The page has been refreshed, please try again.` | A tier or add-on was deactivated, or the event was unpublished, while they had the page open.              |

Checkout [#checkout]

Checkout shows the held items, then collects:

* **Your name** (required)
* **Email** (required), noted as "Your tickets will be emailed here"
* **Attendee names**, one per ticket, when the event requires them. Each field is labelled with the
  tier it belongs to ("General Admission (ticket 2 of 3)") so names land on the right tickets.

While the buyer fills the form, the page prices the order for real and shows **Subtotal**, **Service
fee** (only when one applies), **Tax** (only when a tax rate is set), and **Total**. Nothing is
hidden until the payment step. See [Fees and Payouts](/docs/live-events/fees-and-payouts) for which
fees a buyer pays and which you absorb.

A few checkout attempts can still be turned away:

| What the buyer sees                                                       | Why                                                                   |
| ------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| `You have reached the ticket limit for this event on this email address.` | The event has a per-email ticket cap and this address has used it up. |
| `Please provide a name for each ticket.`                                  | The event requires attendee names and one is blank.                   |
| `This organizer cannot accept payments yet. Please try again later.`      | Stripe onboarding is not finished for your organization.              |
| `Your cart session expired. Please start again from the event page.`      | The cart session lapsed. Their holds are gone with it.                |

Paying [#paying]

Paid orders continue to a card form powered by Stripe, shown on the same page with the total above it
and "Payments are processed securely by Stripe" underneath. The charge lands on your connected Stripe
account. Cards that ask for a bank challenge (3D Secure) are handled inside that form.

Orders that come to $0, for example an entirely free tier, skip the payment step altogether and go
straight to confirmation.

The Bot Check on Free Tickets [#the-bot-check-on-free-tickets]

Free tickets skip the card entirely, which removes the friction that normally keeps a script from
draining an allocation. So **any event with an active $0 ticket type adds a Cloudflare Turnstile check
to checkout**. It is invisible for the vast majority of buyers and only shows a real challenge when
Cloudflare flags the visitor.

The check is keyed on the event having a free tier, not on the buyer's total, so on an event that mixes
free and paid tiers the paid buyers pass through it too. It runs before anything is charged or reserved
into an order, so a failed check never strands a buyer's tickets. If an ad blocker stops the widget
loading, the buyer is told to disable it for that page or try another browser.

You do not configure any of this per event. Adding or activating a $0 tier turns it on; having no free
tier leaves it off.

Confirmation [#confirmation]

After payment the buyer lands on a confirmation page that waits for the payment to settle
("Finalizing your order…"), then shows &#x2A;*You're going!**, the email address the tickets were sent to, a
ticket card summarising what they bought ("2 × General Admission · 1 × VIP"), a **Get directions**
button when the venue has an address, and the full order summary with the order number.

If the card is still processing when they land, the page says so and tells them the tickets will be
emailed either way, so there is no need to sit and wait. If the order is later
[refunded](/docs/live-events/orders-and-refunds), the same link says "This order was refunded" and that
its tickets are no longer valid.

The Confirmation Email [#the-confirmation-email]

Every fulfilled order triggers an email titled `Your tickets for {event name}` containing:

* The event name, the date, the start and end times, the doors time, and the venue name and address,
  all in the event's own time zone
* **One QR code per admission**, each on its own ticket card labelled with the ticket type and the
  last characters of its code. These QR codes are what your staff scan at the door (see
  [Door Check-In](/docs/live-events/check-in)).
* The order summary and total paid
* A **View your order** button back to the confirmation page

The email is the only place a QR code is delivered. The order screens in your dashboard deliberately
never show admission codes.

The Venue Page [#the-venue-page]

A [venue](/docs/live-events/venues) with a slug gets its own public page at `resyevents.com/v/{slug}`,
which the event page links to with the **More Events** button. A cover image hero carries the venue
logo and name, then **Upcoming Events** lists poster cards with each event's day, start time, and
"From $25" or "Free" ("No upcoming events right now. Check back soon." when there are none). **About**
follows with the description, the address plus an **Open Map** button, website and social links, and
the venue photo gallery. Events come first on purpose: buyers arrive to see what is on. The venue page
uses the venue's theme.

When Buying Is Closed [#when-buying-is-closed]

| State                                        | What buyers see                                                                          |
| -------------------------------------------- | ---------------------------------------------------------------------------------------- |
| Stripe onboarding incomplete                 | The tickets panel reads "Ticket sales aren't open yet. Check back soon." with no picker. |
| Before or after the sales window             | Tiers are still listed, but reserving fails with "Tickets are not on sale right now."    |
| Every tier sold out                          | Each tier shows a **Sold out** pill and no stepper.                                      |
| Event end time has passed                    | The tickets panel reads "This event has ended."                                          |
| Event not published, or venue slug not found | "Event not found" / "Venue not found".                                                   |

Related [#related]

* [Publishing](/docs/live-events/publishing)
* [Ticket Types and Add-Ons](/docs/live-events/tickets-and-add-ons)
* [Storefront Themes](/docs/live-events/themes)
* [Fees and Payouts](/docs/live-events/fees-and-payouts)
* [Orders and Refunds](/docs/live-events/orders-and-refunds)
* [Door Check-In](/docs/live-events/check-in)
