The Event Ticketing app writes event data onto the Shopify product and its variants as metafields in the event_ticketing namespace. A Liquid theme reads these to render dates, times, venue, and ticket details on your storefront. Every value is stored as a JSON metafield.
Requirements: A theme (or theme app extension) that reads Liquid metafields. Storefront/headless API access is a separate consideration — see the FAQ.
The three metafields
The app writes three metafields per event:
| Owner | Namespace | Key | Holds |
|---|---|---|---|
| Product | event_ticketing |
event_v2 |
The top-level event |
| Each variant | event_ticketing |
event_v2 |
That variant’s date |
| Each variant | event_ticketing |
ticket |
That ticket’s settings |
A variant is one ticket. Note that event_v2 lives on both the product and each variant, and that ticket-level detail (group size, purchase limits, the attendee form) is a separate ticket key — it is not nested inside event_v2.
For a one-time event the product event_v2 and the variant event_v2 describe the same single date. For a multi-date or recurring event they differ: the product event_v2 is the parent event, and each variant’s event_v2 is the specific date that variant sells.
Reading metafields in Liquid
Read event_v2 from the product or the variant:
{{ product.metafields.event_ticketing.event_v2.value }}
{{ variant.metafields.event_ticketing.event_v2.value }}
Read the per-variant ticket settings from the ticket key:
{{ variant.metafields.event_ticketing.ticket.value }}
Each value is a JSON object — access its fields by key:
{{ variant.metafields.event_ticketing.event_v2.value.starts_at | date: "%a, %b %d, %Y" }}
{{ variant.metafields.event_ticketing.ticket.value.quantity }}
Some date fields are empty when the event has no date of its own (for example, the parent of a multi-date event). Null-check before formatting:
{% if variant.metafields.event_ticketing.event_v2.value.starts_at %}
{{ variant.metafields.event_ticketing.event_v2.value.starts_at | date: "%b %d" }}
{% endif %}
event_v2 fields
The event_v2 JSON object contains:
| Field | Description |
|---|---|
id |
Event ID |
name |
Event name |
type |
Event kind — e.g. a single date, the parent of a multi-date event, or a recurring event |
starts_at |
Start, in the event’s time zone (empty if the event has no own date) |
ends_at |
End, in the event’s time zone (empty if the event has no own date) |
date |
Pre-formatted start date (empty if no date) |
time |
Pre-formatted start–end time range (empty if no date) |
venue |
Venue object — name, description, address, time_zone, iana, images |
capacity |
Total event capacity |
tags |
Event tag names |
images.banner |
Event banner image URL, if one is set |
ticket fields
The per-variant ticket JSON object contains:
| Field | Description |
|---|---|
name |
Ticket name |
kind |
Ticket kind (defaults to ticket) |
quantity |
Group size — number of tickets issued per unit sold |
service_fee |
The booking fee for this ticket, as a single amount |
limits.min / limits.max |
Minimum and maximum purchasable per order |
ticket_type.name |
Ticket type name |
ticket_type.fields |
Which attendee fields are collected (name, email, photo), each with included and required |
ticket_type.questions |
Custom attendee questions — each with id, kind, name, position, required, and options |
Related articles
FAQ
Can I read these metafields from the Storefront API or a headless build (Hydrogen, Next.js)?
Not without extra setup. The app writes raw metafield values, not storefront-visible metafield definitions, so the Storefront API does not return them by default. Liquid theme access works as documented above. For Storefront/headless access, contact support.
What’s the difference between the product event_v2 and the variant event_v2?
For a one-time event they describe the same date. For a multi-date or recurring event the product event_v2 is the overall event, and each variant’s event_v2 is the specific date that variant sells. Read from the variant when you need the date a customer is actually buying.
Why is starts_at (or date / time) empty?
An event without its own single date — the parent record of a multi-date event, for example — has no start or end, so those fields are empty. Read the per-variant event_v2, which carries the concrete date, and null-check in your theme.
Should I store my own data in the event_ticketing namespace?
No. The app owns that namespace and rewrites these metafields whenever the event is saved, which would overwrite anything you add. Use your own namespace for custom data.
quantity isn’t the number of tickets for sale — what is it?
quantity on the ticket object is the group size: how many tickets are issued for each unit sold (a “table of 8” issues 8). Sellable inventory is the variant’s normal Shopify inventory, not this field. Per-order purchase limits are limits.min and limits.max.