Events spaces
When an event happens, and in whose terms
An event carries two facts about its timing, and they answer different questions:
Field | What it is |
|---|---|
| The instant. Stored as a |
| The zone the event is published in. An IANA name, e.g. |
Keeping them separate is what lets "18:00 in Berlin" and "the moment 17:00 UTC" be the same event described two ways.
Setting the time
startsAt and endsAt each accept either form:
# An instant. `timezone` then only affects how it is DISPLAYED.
{ "startsAt": "2026-11-05T17:00:00Z", "timezone": "Europe/Berlin" }
{ "startsAt": "2026-11-05T18:00:00+01:00" }
# A wall-clock time, resolved by `timezone`. "18:00, Berlin time."
{ "startsAt": "2026-11-05T18:00:00", "timezone": "Europe/Berlin" }
{ "startsAt": "2026-11-05T18:00", "timezone": "Europe/Berlin" }A wall-clock time with no timezone on the event resolves in UTC, which is almost never what you meant — send the zone.
The resolution is DST-correct: a wall-clock time is read with the offset that zone actually had on that date, so an event in March lands where the people in that zone expect it to, not an hour out.
Changing the zone does not move the event
A PATCH that sends only timezone re-labels the event. It does not move it. The event is still happening at the same moment; it is merely being described in another zone — and silently shifting a scheduled event by hours because somebody corrected a label is not a thing software should do.
To actually re-anchor it — "make it 18:00 in the NEW zone" — send both in one request, and the wall-clock time is read in the zone you are setting:
PATCH …/events/{id}
{ "startsAt": "2026-11-05T18:00:00", "timezone": "America/New_York" }What is refused
Request | Answer |
|---|---|
|
|
|
|
|
|
The calendar file
GET …/events/{id}/calendar.ics (and the space's feed) emits DTSTART as a UTC instant and advertises the zone at calendar level with X-WR-TIMEZONE.
That is deliberate, and it is the interoperable choice: a TZID parameter on DTSTART is only meaningful alongside a full VTIMEZONE component carrying that zone's DST rules, which would mean shipping and maintaining a copy of the tz database inside every calendar file we emit. A UTC instant is unambiguous to every calendar client, and X-WR-TIMEZONE is what they read to decide which zone to draw the grid in. A feed whose events disagree about their zone advertises none, rather than claiming one of them for all of them.
Addressing an event
GET …/events/{handle} takes either the event's id or its slug. So does the public page and the .ics. (PATCH and the RSVP routes take the id, which is why the read side had to accept both: an event should not have one handle for reading and another for writing.)
What a reader gets
The space's own name as the page title — not the word "Events".
The space's chrome: header, sign-in, theme toggle, announcement strip, consent and analytics, like every other reader surface.
Eventstructured data, witheventAttendanceModeandPlace/VirtualLocationchosen from whether the event has a location, a join link, or both (both isMixedEventAttendanceMode) — never guessed. The event page addsimage(share image, then cover),organizer(your site), remaining capacity, and anoffersnode for the RSVP that readsSoldOutwhen the event is full. No price is claimed — an RSVP costs nothing; a ticketed event states its ownoffersthrough its JSON-LD override (below).The description rendered as Markdown, in both the detail page and the calendar card.
RSVP controls only once the viewer is known to be signed in, so a logged-out reader is offered a way in rather than a failed request.
Front page
An events space's front page is a composed document. Until you edit it, it is generated: the intro band, then the events band. An events feed sorts by latest or oldest and filters by when (upcoming or past) and tags — so "Upcoming" on your blog's or your site's front page is one spaceFeed with filter.when: "upcoming".
One event's own look and share card
An event can carry the same per-piece keys as a blog post: CSS for that event's page only, a partial theme over the space's, a share image (it beats the cover), its own og title/description and card type, and its own JSON-LD, which replaces the automatic Event markup. Send them under customization on POST …/events or PATCH …/events/{idOrSlug}; keys merge, and null clears one (or, for the whole object, all of them):
{
"customization": {
"shareImageUrl": "/api/assets/…",
"jsonLd": {
"@type": "Event",
"name": "Launch night",
"startDate": "2026-11-05T18:00:00+01:00",
"offers": {
"@type": "Offer",
"price": "25",
"priceCurrency": "EUR",
"url": "https://tickets.example.com/launch"
}
}
}
}In the console it is Page look & sharing under each event in the events manager.
The keys and their rules are in Theme your site → Per-page customization.
Speakers
A space keeps one registry of speakers, and sessions in an event's programme point at them, so a person who speaks three times is one record. Reading takes forum.read; writing takes forum.moderate.
POST /orgs/{orgId}/spaces/{spaceId}/event-speakers
{
"name": "Ada Lovelace",
"title": "Analyst",
"company": "Analytical Engines",
"bio": "Wrote the first **program**.",
"socials": [ { "label": "Mastodon", "url": "https://example.social/@ada" } ],
"position": 10
}Only name is required (up to 120 characters). pronouns, title and company take short text or null; bio is Markdown up to 5,000 characters; position orders the speakers page, with ties broken by name; slug is generated unless you give lower-case words joined by hyphens. Create answers 201 with { "speaker": ... }. PATCH the same path plus /{speaker} (id or slug) changes any of the fields, and DELETE removes the speaker.
Promo codes
A promo code takes money off a ticketed event. Managing codes needs forum.moderate.
POST /orgs/{orgId}/spaces/{spaceId}/event-promo-codes
{
"code": "EARLYBIRD",
"percentOff": 20,
"eventId": null,
"maxRedemptions": 100,
"expiresAt": "2026-11-01T00:00:00Z",
"tierIds": []
}Give exactly one of percentOff (1 to 100) or amountOffCents (minor units off each ticket, never below zero); both or neither is a 422. code is 2 to 40 letters, digits, - or _, and is stored upper-case. eventId: null (or leaving it out) makes the code work for every event in the space; set an id to confine it to one. An empty tierIds means every ticket tier. maxRedemptions and expiresAt are optional limits. The list is GET …/event-promo-codes; PUT …/event-promo-codes/{id} replaces a code with a full body, and DELETE removes it.
What an event mails
Confirmations, reminders and announcements are controlled per space, and any key you leave out falls back to the organization's events.* setting and then to the default (confirm, remind a day and an hour before, send the digest, announce).
PUT /orgs/{orgId}/spaces/{spaceId}/event-notices
{
"confirmations": true,
"reminders": ["1d", "1h"],
"reminderNote": "Doors open at 17:30. Bring photo ID.",
"organizerDigest": true,
"announce": false
}reminders: [] sends none; reminderNote is your own text in every reminder. organizerDigest is a daily mail of new RSVPs to whoever made the event, and announce mails the space's email subscribers when an event is published. GET …/event-notices (space.read) returns the keys you set (stated) and what actually happens (resolved); PUT needs space.update. Reminder leads are 7d, 3d, 1d, 3h, 1h and 15m.
Who is going, and RSVP by email
Three switches in the space's attendance settings decide what readers see, all off until you turn them on: publicAttendees (the event page lists who is going), emailRsvp (a reader with no account may RSVP with an email address) and searchable (the space's events appear in site search).
PUT /orgs/{orgId}/spaces/{spaceId}/event-attendance
{ "publicAttendees": true, "emailRsvp": true, "searchable": false }GET on the same path (space.read) reads them; PUT needs space.update and a key left out is switched off. The reader-facing calls are public and live under /public/orgs/{orgId}/spaces/{spaceId}:
Call | What it does |
|---|---|
| What the RSVP control needs to know (no secrets). |
|
|
| An email-only RSVP. Mails a link; no seat is held until it is followed. |
| Body |
| Same body; withdraws the RSVP. |
POST /public/orgs/{orgId}/spaces/{spaceId}/events/{handle}/rsvp
{ "email": "reader@example.com", "name": "Sam", "guests": 1, "showPublicly": false }email and name are required; answers carries replies to registration questions and captchaToken is checked when the organization uses a captcha. The request is limited to five a minute per caller. Confirming and cancelling are POSTs, not GETs, so mail scanners that follow links cannot do it for the reader.
Privacy for email-only RSVPs
Someone who RSVP'd without an account can still ask for a copy of what is held about their address, or for it to be erased.
POST /public/orgs/{orgId}/spaces/{spaceId}/event-rsvps/privacy
{ "email": "reader@example.com", "kind": "export" }kind is export or erase. The answer is always 202 { "ok": true }, whether or not the address ever RSVP'd, so a stranger cannot find out. The link goes to the mailbox; following it is POST …/event-rsvps/privacy/confirm { "token": "..." }, which exports or erases every email-only RSVP for that address in the organization.
How the calendar reads: theme.events
Everything about how an events space looks lives under one theme key, theme.events. It layers like every other theme key: the site's theme, then the space's, then one event's own customization (below). Every key is optional, and a key you set always wins over a look, a preset or the default. A misspelt key is a 422 that names it, never a silent default.
PATCH /orgs/{orgId}/spaces/{spaceId}/theme
{ "events": { "look": "ticket", "list": { "pastMode": "tabs" } } }In the studio this is Design → Events: every setting: every key below has a control there, and clicking a part of the calendar in the studio offers the key that draws it.
Three things stack under your keys, in this order:
The default layer — what a calendar nobody configured looks like: a date tile beside each card with the cover as a square thumbnail, six past events then "All past events", the register card beside the description (sticky, with a bar at the foot of a phone's screen), the facts as tiles, a map card, who is going, "More events", and an "Event time / My time" switch that only appears when the reader's zone differs from the event's.
The preset (
settings.preset, chosen at creation, changed withPUT …/preset) — where things stand:standard,luma,community,conferenceorwebinar.The look (
theme.events.look) — how things are dressed.
Looks are patches you can mix
A look sets dress keys only — style, chips, page.title, page.hero — and never an arrangement key a preset sets (list.layout, page.layout, registerCard, list.dateTile). That is why any look sits on any preset (a stage look on the luma preset), and any key you set sits on both.
| What it sets |
|---|---|
| Nothing beyond the default layer (unset means this). |
| No default layer at all: the calendar as it was before it had one. The way back, in one key. |
|
|
|
|
| Cards radius 12, shadow |
| Every box framed with small corners (cards 6, register 6 with shadow |
Preset | What it arranges |
|---|---|
| The default layer, nothing more. |
| One row per event under a day label in the gutter, a square picture on the right, past events in a tab, hosts on the card; on the page the cover stands left over the register card. |
| A month-by-month timeline with who is going; a wide banner and "More events" on the page. |
| A grid of 16:9 covers with a pill date; a full-bleed hero with a countdown; the agenda a column per stage; speakers five across, square. |
| A 16:9 thumbnail per row, twelve past events stacked, every time in both zones; one card per series showing its next date; the agenda a table; speakers as a list. |
Three combinations no template ships, each one PATCH body:
{ "events": { "look": "stage", "list": { "layout": "rows", "cover": "thumb-right" } } }The conference stage head (centred title over a shaded, glowing hero) on a plain list of rows — a single flagship event on a quiet calendar.
{ "events": { "look": "ticket", "page": { "hero": { "backdrop": "none" } }, "chips": { "style": "pill" } } }The ticket stub's framed cards and register card, without its dotted backdrop and with round pills instead of outlined caps.
{ "events": { "look": "minimal", "style": { "register": { "shadow": "lg", "radius": 16 } }, "page": { "showCountdown": true } } }A typeset list whose one raised object is the register card, counting down to the start.
Each element's own box: style
style.card, style.register, style.factTile, style.session and style.speaker each take the same box; style.dateTile takes only radius, border and shadow (its fill is dateTileTone).
Key | Default | What it does |
|---|---|---|
| the surface it sits on | The fill: a palette slot or a hex (with a dark-mode twin). |
| as before (on where there was one) | Draw the frame at all. |
| the theme's hairline | The frame's colour. |
| as before | Corner radius, 0–40 px. |
| as before | The components' elevation steps ( |
| as before | Inner space, 0–48 px. |
card is the calendar's card wherever it appears: the index, feeds, "More events" and embeds.
The calendar: list
On top of the shared list keys every type has (layout, group, facets):
Key | Default (default layer) | What it does |
|---|---|---|
|
|
|
| on | "List | Month" links over the calendar. |
| Sunday in English, Monday otherwise | The month grid's first column. |
|
| Filter rows (in person / online, month) beside the tag row. A row with one choice is not drawn. |
|
|
|
| 6 | Past events listed before "All past events" (1–50). |
| 30 | How faded the past half reads, 0–90 %. |
| see below | The month grid's cells. |
|
| Featured events lead the upcoming list, with a "Featured" chip. |
|
|
|
|
|
|
|
|
|
| on | "12 going", "12 spots left" / "Full", the place on the card. |
| off | The hosts' names and pictures on the card. |
| today's padding | The forum list's density words. |
|
| Which zone the card's time reads in: the event's, the reader's, or both. |
| on | The "Event time / My time" switch (only drawn when the zones differ). |
list.calendar: showTimes (on), maxPerDay (3, 1–8, then "N more"), hideWeekends (off), showState (on) and phone (list draws the month's days as cards on a phone; grid keeps the grid).
An event's page: page
Key | Default (default layer) | What it does |
|---|---|---|
|
|
|
|
|
|
| 320 | The register column's width, 240–480 px. |
| on | A bar at the foot of a phone's screen with the date and "Register". |
|
|
|
| shown |
|
|
| How when / where / mode read. |
|
|
|
| — | For |
| none | A pattern behind the whole page: |
|
|
|
| off | "Starts in 2 days 4 hours". |
| on, 3 | "More events" (1–6). |
|
| As on the list. |
| on | A map under the facts when the event has a venue. |
| on | Faces of attendees who chose to be shown — only when the space shows attendees publicly. |
| — | While the event is on: |
| shown |
|
| shown |
|
| — |
|
| on | "Join the discussion" when the event links a forum topic. |
| off | A "Write to the hosts" form under the description. |
| on | "Going to every date" on an event in a series. |
| the order below | The order of the parts under the description. |
page.sections reorders, it does not hide: list the parts you want first and the rest follow in their default order — attendees, map, teaser, sponsors, faq, discussion, dates, feedback, engage, liveRoom, contact, cfp. A listed part the event does not have is skipped. Set it in one event's own theme (below) to give that event its own order.
The rest of the namespace
Key | What it holds |
|---|---|
| The page's side rail ( |
| The state pill's look; unset follows the front door's badge style. |
| Each state's colour: |
| The date tile's colour. Unset: the brand colour. |
|
|
|
|
| A session's own page: |
| A speaker's own page: |
|
|
| A finished event: |
| The calendar embed: |
| The generated share card: |
One event, its own look
An event's customization (see One event's own look and share card) takes the events namespace and nothing else: any key above, for that event only, over the space's. Another type's namespace (post, docs, …) is refused with a 422 that names it, rather than accepted and drawn nowhere.
{ "customization": { "theme": { "events": { "look": "stage", "page": { "layout": "hero-full" } } } } }The event's agenda, speakers, speaker and session pages wear the event's theme and custom CSS too, so a flagship event's programme matches its page. Its SEO and JSON-LD are not inherited by them.
Theme outlets on event pages
Theme components (see Theme components) can draw into these slots:
Outlet | Where | Context |
|---|---|---|
| The calendar, above the list. | |
| The foot of every event card (repeats). |
|
| An event page, between the details and the description. |
|
| An event page, under the register card. |
|
| An event page, after the description and register card, before "More events". |
|
| The agenda, speakers, a speaker and a session page, under the event header. |
|
| The same pages, at the end of their content. |
|
Reach, timing and the page's own content
These keys sit on the event itself (POST …/events, PATCH …/events/{id}). Every one defaults to what an event did before it existed, so an event that sets none reads as it always has. In the studio they are in the event form's Access and During and after sections.
Key | Default | What it does |
|---|---|---|
|
|
|
|
| Keep this event out of search engines while it stays listed. |
|
| Pin it to the top of the calendar (drawn by |
|
| A published event stays off every public door until this instant; subscribers are told then. |
|
| The RSVP window. Null opens now and closes when the event is over. The event carries |
|
| Withhold the address from the page, the |
|
| Directions, parking, which door — shown under the place. |
|
| An embeddable livestream (YouTube, Vimeo, any https player), shown while the event is on and |
|
| Up to 40 |
|
| Up to 30 |
|
| Step-free access, captions, a quiet room. |
|
| "18+" on the page. |
|
| This event's reminder leads ( |
|
| Up to 12 of your own facts, |
|
| Terms (Markdown) a reader must accept to RSVP or buy ( |
|
| One word for discovery. |
|
| Write-only. The page asks for it before showing anything; |
|
| Up to 20 languages, |
|
| List the event in the public directory at |
Who may RSVP
Key | Default | What it does |
|---|---|---|
|
| Up to 20 organization groups whose members may RSVP. Empty means anybody who can read the event. |
|
| Only the hosts add people (a closed event with a public page). |
|
| People who may not RSVP. |
|
| The recording shows only to readers who were |
A reader is told the RSVP is restricted (rsvpRestricted), never which groups. Registration questions keep using the Forms field model; a file question now uploads through …/events/{handle}/rsvp-files, a question can depend on another's answer, and a signed-in reader's answers are prefilled from their last registration in the space. A referral link is the event's address with ?ref=<code>; the RSVP carries ref, and each registration is credited to the code's owner.
Series, sessions and the schedule builder
A monthly series can now repeat on "the 2nd Tuesday": { "freq": "monthly", "byWeekday": ["TU"], "bySetPos": 2 } (bySetPos is 1–4, or -1 for the last). A reader can RSVP to every date at once (page.seriesRsvp, on by default).
A session gains kind (talk, keynote, workshop, panel, lightning, break, meal, networking, other; default talk), language (a BCP 47 tag), its own streamUrl, capacity, and registration: with it on, a reader's My agenda save is a sign-up, up to capacity seats. A speaker gains a tagline under the name. Attendees rate a session as well as the event, and the ratings summary breaks it down per session.
In the studio, Schedule builder in the event form lays the programme out by time and room: drag a session to another slot or stage, or nudge the selected one with the arrow keys.
Tickets, tax and the box office
Ticketing builds on the tiers, promo codes and the organization's own Stripe connection the events manager already had. A tier (POST …/events/{handle}/tiers) gains:
Key | Default | What it does |
|---|---|---|
|
|
|
| 1 | The smallest order of this tier ("a table of four"). Cannot exceed |
| off | A hidden tier is off the ticket box until a reader enters its code ( |
|
| The buyer names the price; |
| 1 | A bundle: one unit seats this many. |
| none | Up to five |
| none | Timed entry: when this tier's holders may come in. |
| none | The tier's own registration questions, asked after the event's. |
The event's ticket rules are settings on PUT …/events/{handle}/ticketing (studio: Tax, fees, refunds, seating and sales):
Key | Default | What it does |
|---|---|---|
| none |
|
| none |
|
| none |
|
| off | Cancelling the event refunds every paid order. |
| none |
|
| none |
|
| none | Which registration answer goes under the name on badges (e.g. |
| off | Ask buyers for company, VAT id and address. |
| none |
|
seatMap on the same call is reserved seating: up to 20 sections, each with rows of up to 200 seats and an optional tierId that only that tier may sit in. A seat is named <section>/<row>/<n>; the reader picks seats on a map, and seats in a cart are held while the buyer pays.
A cart (quote and checkout) gains answers, attendees (group registration: a name and email per extra ticket, each getting their own ticket), billing, addons, seats, unlockCode and unitCents (the PWYW amount). With the space's RSVP approval on, a paid order waits as requested until a host approves it, and only then is the buyer sent to pay; a waitlisted order is waitlisted, then offered.
Call | Who | What it does |
|---|---|---|
| hosts | Sell at the door (cash or card taken elsewhere). |
| hosts | Approval before payment. |
| hosts | The sales report, with the Stripe payouts. |
| hosts | An order's invoice (PDF). |
| the buyer | A reader's own orders, each with its invoice. |
| the buyer | A self-service refund inside the refund window. |
Running the event: the Run panel
Each event in the events manager has a Run panel for the days around it. Everything here is open to the event's hosts: anyone holding forum.moderate on the space, and the event's co-hosts.
Invitations — invite up to 200 addresses a time with a line of your own (
POST …/events/{handle}/invites); the invitee answers from the mail.Messages — mail attendees now, at a time (
sendAt), or a while after the end (afterEndMinutes), to anaudienceofgoing,waitlist,interested,checked_in,no_showorall.kind: "thank_you"and"feedback"are the after-event mails.Co-hosts —
PUT …/events/{handle}/cohosts { userId, role }. Amanagerco-host runs everything here; adoorco-host may only check people in.Door — opens
…/{slug}/dooron a phone: the camera scans ticket QR codes (typed codes where the browser has no barcode reader), and a kiosk mode checks people in by the email they registered with.GET …/badges.pdfprints badges. Each check-in fires thersvp.checked_inwebhook.Live — moderate questions, open and close polls, approve photos, read the ratings and NPS, manage sponsor booths and their leads.
Proposals — the call for papers (below).
Hosts can also add an attendee by hand (POST …/events/{handle}/attendees), correct one (PATCH …/attendees/{rsvpId}/details), and an attendee can hand their place to someone else (POST …/events/{handle}/transfer). A reader's ticket, with its QR code, is at …/{slug}/ticket and can be mailed again (POST …/events/{handle}/ticket/mail).
During and after
Each feature is off until the event turns it on, and its door answers 404 for an event that did not ask for it.
Key | What it switches on |
|---|---|
| Live questions with upvotes (one vote per person; pressing again takes it back). Hosts mark them |
| Polls of 2–10 options. A poll starts as a |
| Attendees who were |
| 1–5 stars, an optional 0–10 "would you recommend", and a comment, from people who came. Hosts see the average and NPS. |
| A certificate of attendance (PDF with a QR code) for everyone checked in; its QR leads to a verify page at |
| The live room: |
Sponsor booths (POST …/events/{handle}/booths) list a sponsor with a lead prompt and an optional promo code. An attendee chooses to leave their name and address with a booth; nothing is shared until they press it.
Call for papers
cfp on the event — { opensAt, closesAt, categories, formats, questions, intro } — opens a public form at …/{slug}/cfp. A proposal carries the speaker, up to four co-speakers, a title, an abstract (20–5000 characters), a category, a format and the answers. Hosts review them under Proposals with stars and notes, accept or decline (the speaker is mailed), and mail every speaker at once; an accepted speaker confirms and edits their own details from a private link. null closes the call.
The network
With the live room's directory on, people who are going can make a profile visible — headline, bio, interests, links, answers to the calendar's profile questions, and openToMeet — and with networking on they request 1:1 meetings with a message, a proposed time and a place. With gamification on, actions earn points on a leaderboard. The calendar's profile questions and points are space settings (PUT …/events-network-settings, studio: Member profiles and points):
Key | Default | What it does |
|---|---|---|
|
| Up to 10 |
| 50 | Points for being checked in. |
| 10 | Points for asking a question. |
| 1 | Points per chat message. |
| 20 | Points for rating the event. |
| 15 | Points for a meeting. |
Chapters and the network overview
An organization that runs many calendars can make each one a chapter (POST /orgs/{orgId}/events-network/chapters, studio: Chapters and integrations): a name, slug, the EVENTS space it is, a city and country, map coordinates, and up to 20 leaders who act as staff on that chapter's events. Readers get a chapter directory with a drawn map (no map tiles) at /e/{orgId}/chapters. POST …/events/{handle}/global { "global": true } lists an event in every chapter's calendar. The Network overview sums events, RSVPs, check-ins, members and attendance rate across chapters.
Co-listing and suggestions
colistOn lists an event in up to ten other EVENTS spaces of the organization too; it stays one event, with one RSVP list. With submissions on in the space's attendance settings, readers can suggest an event (POST /public/orgs/{orgId}/spaces/{spaceId}/event-submissions); each arrives as a draft for you to publish.
Insights
The event page counts views and registrations by source without cookies, and the Insights card in the event form shows views, registrations, check-ins, conversion and show-up rate by day and by source. Tracking links (POST …/events/{handle}/insights/links { label, source, medium, campaign }) give you a UTM-tagged address per channel and count each one. When your site loads Meta Pixel or GA4 (your analytics settings, Meta Pixel as metaPixel), registrations and paid orders are reported to them as their standard conversion events; nothing is loaded for a reader who refused that consent category.
Importing, quick create and covers
Import events in the events manager reads an .ics file (any calendar exports one) or the CSV exports of Luma, Eventbrite and Meetup (POST …/events/import), and reports each row it skipped and why. See Importers.
/o/{orgId}/new-event is a short phone-sized form for creating an event on the go. Under Live, insights and cover an event without a picture can take one of several generated covers, or have your own AI draw one (Draw with AI, which uses your organization's OpenAI key from its AI settings and is off without one).
Embeds and share cards
Each of these renders bare inside an <iframe> on your own site with ?embed=1:
Address | What it shows |
|---|---|
| The upcoming list, in |
| One event's card. |
| The register box. Stripe checkout opens in a new tab inside a frame. |
| The programme. |
| The speaker wall. |
An event or calendar with no picture of its own gets a generated share card (…/social-card.png, governed by theme.events.social).
What an event mails, now
Beside the confirmations and reminders above, the events group of the email templates gains events.invite, events.ticket, events.ticket-offer (a waitlist seat), events.submission-received, events.submission-decision, events.speaker-message and events.contact-host. Webhooks gain rsvp.checked_in (carrying eventId, rsvpId, userId, guests, checkedInAt — what a badge printer or gate listens to), ticket_order.paid and ticket_order.requested.
Templates
Six events templates ship with the product; Expohall (a trade show and summit) switches on the whole toolkit: sponsor booths with opt-in leads, live Q&A and polls, a photo wall, an open call for papers, workshops with their own seats, a password-protected dinner, certificates of attendance and an after-event rating. Like every template it uses no custom CSS: every detail is a theme key or event data.
What you need to set up
Most of an events space works the moment it exists. These parts need an account or a key of yours first; until then each one is simply not offered.
Feature | What you need | Where | Until then |
|---|---|---|---|
Paid tickets | Your own Stripe account. | Organization settings → Payments (Payments and the shop). | Tiers can be free; the ticket box offers no paid checkout. |
Stripe Tax ( | Stripe Tax switched on in your Stripe dashboard, with your tax registrations. | Stripe, then the event's ticket rules. | Use a fixed |
HubSpot, Salesforce, Mailchimp sync | A HubSpot private-app token; Salesforce | Chapters and integrations → Integrations, or | Nothing is sent. Credentials are write-only and encrypted; each registrant who becomes |
LiveKit stage and breakout rooms | A LiveKit server. | See Live rooms. | Rooms can still be a link to any meeting tool. |
Meta Pixel / GA4 conversions | Your pixel or measurement id. | No conversions are reported. | |
AI cover | An OpenAI key. | The organization's AI settings. | Generated covers only. |
Not built, and what to use instead:
SMS or WhatsApp reminders — reminders go by email only (
reminders, the space's notices). There is no text-message channel for events.Apple Wallet and Google Wallet passes — the ticket is the QR code at
…/{slug}/ticket, in the mailed ticket, plus the.icsfor the calendar.Zoom or Google Meet links created for you — paste the meeting link into the event, or add it as a link room in the live room.
Venue autocomplete — type the address; the map card and "Open map" use it, and street tiles need the venue's coordinates.
The Zapier app turns course and event webhooks (RSVP created, updated, cancelled or checked in; event published, updated or cancelled) into Zapier triggers, and the WordPress plugin frames the register box and course embeds on a WordPress site. See Zapier, Terraform, React and WordPress.
Not yet published. Import into the
guidesspace's "Building your site" collection beside the other space-type guides. Re-import after editing — the page is not generated from this file.
In the API
Every operation below is also reachable from the other surfaces without a dedicated command. forumulate api <Operation> calls it from the CLI, the JavaScript SDK has a typed method for each one (the last column names it; the Python and Go clients are generated from the same spec), and an agent reaches the organization-scoped ones through the MCP call_api tool. Where a CLI command or MCP tool exists too, the last column names it. Operation names link to the API reference.
Event Agenda Public
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Get the agenda in a space |
| |
| File of calendar (sessions) |
|
Event Attendees
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| List attendees in a space |
| |
| File of attendees |
| |
| Update the attendee |
| |
| Create the message in a space |
| |
| Get the event attendance in a space |
| |
| Replace the event attendance in a space |
|
Event Attendees Public
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Get the event attendance in a space (public reader) |
| |
| List attendees in a space (public reader) |
| |
| Create the rsvp in a space |
| |
| Confirm the rsvp |
| |
| Cancel the rsvp |
|
Event Engage Public
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Unlock the event |
| |
| Get the unlocked in a space |
| |
| Get the ticket in a space (public reader) |
| |
| Get the certificate in a space (public reader events ticket) |
| |
| Get the attendance |
| |
| Create the answer in a space (public reader events invites) |
| |
| List questions in a space (public reader events) |
| |
| List polls in a space (public reader) |
| |
| List photos in a space |
| |
| List booths in a space (public reader) |
| |
| Create a submission in a space (events) |
| |
| Get the cfp |
| |
| Create the cfp |
|
Event Extras
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Create a rsvp file in a space |
| |
| Get the answers prefill in a space |
| |
| Get the badges PDF in a space |
| |
| Check yourself in at the venue |
| |
| Get the reach in a space |
| |
| Create a rsvp series in a space |
|
Event Extras Public
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Create a rsvp file in a space (public reader) |
| |
| Create the contact in a space (events) |
|
Event Meetings
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| An event’s meetings, host links included |
| |
| Create a Zoom or Google Meet meeting for the event or a session |
| |
| Forget a meeting (the provider keeps it) |
| |
| An event’s meeting links as this member may see them |
|
Event Meetings Public
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| An event’s meeting links, per its join-link visibility |
|
Event My Agenda
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Your agenda for an event |
| |
| Add a session to your agenda |
| |
| Remove a session from your agenda |
|
Event Network
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Get the chat in a space |
| |
| Create the chat in a space |
| |
| Replace the chat |
| |
| Delete the chat |
| |
| Create a reaction in a space |
| |
| List rooms in a space |
| |
| Create a room in a space |
| |
| Replace the room |
| |
| Delete the room |
| |
| Join the room |
| |
| Get the directory in a space (events) |
| |
| Replace the meeting |
| |
| Get the leaderboard in a space (events) |
| |
| List insights in a space |
| |
| Create a link in a space |
| |
| Delete the link |
| |
| Create the AI cover in a space |
| |
| Create the global in a space |
|
Event Notices
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| List event notices in a space |
| |
| Replace event notices in a space |
|
Event Profile
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Get the event profile in a space |
| |
| Replace the event profile in a space |
|
Event Promo Codes
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| List event promo codes in a space |
| |
| Create an event promo code in a space |
| |
| Replace the event promo code |
| |
| Delete the event promo code |
|
Event Rsvp Privacy
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Create the privacy in a space |
| |
| Confirm the privacy |
|
Event Series Public
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| List series in a space (events) |
| |
| File of series |
|
Event Sessions
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| List sessions in a space |
| |
| Create a session in a space |
| |
| Update the session |
| |
| Delete the session (orgs spaces events) |
|
Events Network Admin
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| List chapters in an organization |
| |
| Create a chapter in an organization |
| |
| Replace the chapter |
| |
| Delete the chapter |
| |
| Read the events network’s console overview: totals and attendance per chapter |
| |
| List integrations in an organization (events network) |
| |
| Replace the integration (events network) |
| |
| Delete the integration (events network) |
|
Events Network Settings
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| List events network settings in a space |
| |
| Replace events network settings in a space |
|
Event Speakers
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| List event speakers in a space |
| |
| Create an event speaker in a space |
| |
| Update the event speaker |
| |
| Delete the event speaker |
|
Event Suggestions Public
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Create an event submission in a space |
|
Event Ticket Extras
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Create the box office in a space |
| |
| Approve the order |
| |
| Create the decline in a space |
| |
| Get the report in a space (events orders) |
| |
| Get the invoice in a space (orders) |
| |
| List my orders in a space |
| |
| Create the refund in a space (events my orders) |
| |
| Get the invoice in a space (my orders) |
|
Event Ticket Extras Public
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Get the invoice in a space (public reader ticket) |
| |
| Create the refund in a space (public reader events ticket) |
|
Event Tickets
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| List tiers in a space |
| |
| Create a tier in a space |
| |
| Update the tier |
| |
| Delete the tier |
| |
| Replace the ticketing in a space |
| |
| List orders in a space |
| |
| Create the refund in a space (events orders) |
| |
| Create the checkout in a space (events tickets) |
|
Event Tickets Public
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| List tickets in a space |
| |
| Create the quote in a space |
| |
| Create the checkout in a space (public reader events tickets) |
| |
| Confirm the ticket |
|
Public spaces
Operation | Request | What it does | Shortcuts |
|---|---|---|---|
| Get the space (public reader) |
|