Product metafields

The event_ticketing metafields the Event Ticketing app writes to your Shopify products and variants, so a Liquid theme can read event dates, times, and ticket details.

Jeff Blake
Written by Jeff Blake Updated May 29, 2026

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

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.