Memberships that unlock ticket discounts
Sell a yearly membership, give members a cheaper price on every show, and open booking to them a week before everyone else. Members see their price on your site, on Live Storefront and at the box office.
In short. A membership grants a customer tag; a ticket type that requires the tag is the members' price; a sale window for the tag is priority booking.
When to use this#
Use this when
You run a membership, a friends scheme or a subscription, and members should pay less and book first.
You want to sell the membership in Ticketlayer, or you already sell it somewhere else and need Ticketlayer to recognise members.
Use something else when
Anyone with a code should get the discount: use presale codes and offers instead.
It is a one-off offer for one event: add a ticket type with its own price, and no tag.
What you'll build#
- A fan joinsBuys a membership, or joins through your own site
- Tag grantedmember, until the membership ends
- Members' priceA ticket type only tag holders are offered
- Priority bookingA sale window that opens to members first
- They buyOn your site, Live Storefront or at Box Office
Before you start#
- An organisation in test mode. Everything here is safe to try there.
- In Backstage, permission to manage tags and the event. With the API, an organisation key (
tlak_) and, for step 1, a staff token. - An event with a price scheme, listed on a channel.
Steps#
Define the member tag#
A tag is the membership card. Everything else refers to it by its slug, which never changes.
Open Fans, then Tags, then New tag. Tick API keys so your own systems can grant it too.
Letting keys grant a tag needs a person, so this call takes a staff token, not a key.
curl -X POST https://api.ticketlayer.com/v1/tag-definitions \
-H "Authorization: Bearer <staff token>" \
-H "X-Ticketlayer-Org: your-org-slug" \
-H "Content-Type: application/json" \
-d '{ "slug": "member", "label": "Members",
"kind": "customer",
"grantableBy": ["staff", "api"] }'Create the membership#
Prototype: needs MembershipsThe membership is what fans buy: a price, how long it lasts, and the tag it grants.
Open Events, then Memberships, then New membership.
Create it with the tag it grants and an ISO 8601 duration.
curl -X POST https://api.ticketlayer.com/v1/memberships \
-H "Authorization: Bearer tlak_..." \
-H "X-Ticketlayer-Org: your-org-slug" \
-H "Content-Type: application/json" \
-d '{ "name": "Friends of Pier Theatre",
"price": { "amount": 4000, "currency": "GBP" },
"duration": "P1Y",
"grantsTag": "member" }'Give members their price#
Add a Member ticket type that requires the tag. Only members are offered it; everyone else never sees the price.
Open the event, then Tickets, then Add ticket type. Set Only for to the Members tag.
A ticket type's requiredBenefit is the customer tag a buyer must hold to be offered it.
curl -X PATCH https://api.ticketlayer.com/v1/events/evt_... \
-H "Authorization: Bearer tlak_..." \
-H "X-Ticketlayer-Org: your-org-slug" \
-H "Content-Type: application/json" \
-d '{ "ticketTypes": [
{ "name": "Stalls, members", "requiredBenefit": "member" } ] }'Open booking to members first#
A sale window whose audience is the tag opens the event to members before everyone else.
Open the channel, then the event's listing, then When it is on sale. Add a window for Members a week before general sale.
The listing's sellable rule holds when any window matches now and the caller. audienceTags names who a window is for.
curl -X PATCH https://api.ticketlayer.com/v1/sales-channels/ch_.../listings/lst_... \
-H "Authorization: Bearer tlak_..." \
-H "X-Ticketlayer-Org: your-org-slug" \
-H "Content-Type: application/json" \
-d '{ "rules": { "sellable": { "open": true, "windows": [
{ "from": "2026-09-01T09:00:00Z", "audienceTags": ["member"] },
{ "from": "2026-09-08T09:00:00Z" } ] } } }'Sell the membership, or grant it from your own system#
Prototype: needs MembershipsSelling the membership in Ticketlayer grants the tag at checkout. If members join somewhere else, grant the tag yourself; it works the same way from there.
Open Fans, find the customer, then Tags, then Grant tag. Set when it ends.
Grant the tag with an expiry. An undefined slug is 400 TAG_NOT_DEFINED.
curl -X POST https://api.ticketlayer.com/v1/customers/cus_.../tags \
-H "Authorization: Bearer tlak_..." \
-H "X-Ticketlayer-Org: your-org-slug" \
-H "Content-Type: application/json" \
-d '{ "tag": "member", "source": "import",
"expiresAt": "2027-08-31T23:00:00Z" }'Hear about new members#
Every grant sends a customer.tag_granted webhook, so your CRM or mailing list can welcome the member.
Open Developers, then Webhooks, and add an endpoint subscribed to customer.tag_granted.
Verify the signature and act on the event. Receive webhooks has the verification code.
{ "type": "customer.tag_granted",
"data": { "customerId": "cus_...", "tag": "member",
"customerTagId": "cent_...", "source": "import",
"expiresAt": "2027-08-31T23:00:00Z" } }Check it in test mode#
Sign in to Live Storefront as a test customer with the tag and open the event: you see the members' price and can book during the members' window. Sign in as a customer without it: the price is not offered, and before general sale the event is not on sale.
Go live#
Take the organisation out of test mode, then check the dates on the sale windows: they are in UTC.
Variations#
- A members' discount without priority booking: skip step 4.
- Tiers: one tag per tier (
member.gold,member.silver), each with its own ticket type. - A partner's members: give the partner an organisation key that can grant the tag, and nothing else.
Troubleshooting#
400 TAG_NOT_DEFINEDwhen granting: the slug is not a defined tag. Define it first (step 1).- Members do not see their price: the buyer must be signed in, and the tag must not have expired.