Eight workflows. Every message step checks sms-opt-out and falls back to email, because a ticket is information the attendee needs in order to get through the door.
1. Registration Intake, Payment and Ticket Issue
Trigger: a Registration Form submission on the event funnel, a Group Registration submission, or a registration taken by BO.
Conditions and branches:
- Check capacity for the requested ticket_type. If full, do not create a registration: route to workflow 3 and offer the waitlist.
- Check the ticket window against today's date and write ticket_window. A request for a closed window is offered the current one, never the closed one.
- Match email and mobile against existing contacts. On a match, apply repeat-attendee, carry dietary_notes, accessibility_needs and badge_name forward, and skip asking again. Otherwise apply first-time-attendee.
- If ticket_quantity is above 1, create one child record per named attendee with its own registration_code, link them to group_lead_contact, and apply group-lead and group-member. Every attendee gets their own ticket and their own reminders. A group of eight managed as one record will produce eight people at the door with one QR code between them.
Actions in order:
- Free event: set payment_status Not Required and move straight to Registered - Paid.
- Paid event: create in Registered - Unpaid, apply reg-unpaid, set payment_hold_expiry to 48 hours out (or 4 hours if the event is inside 7 days), and send to the Stripe payment step.
- On payment success webhook: set payment_status Paid, swap reg-unpaid for reg-paid, move to Registered - Paid.
- Generate a unique registration_code, move to Ticket Issued, apply ticket-issued.
- Within 1 minute: confirmation email with the QR ticket, calendar attachment, venue address and travel note, running order, transfer link, and your refund terms quoted verbatim.
- Within 1 minute: SMS with the ticket link alone. [Event] - you are in. Ticket and QR here: [link]. [Date], doors [time], [venue]. Save this message; it is all you need at the door.
- Immediately after: release the Session Selection form, then the Dietary and Accessibility form.
- If ticket_type is Speaker, Sponsor or Press, suppress the standard sequence and send the Speaker and Sponsor Logistics form instead, with its own deadlines.
- Write source_channel and referral_code from the URL, and post one line to the event channel.
Exit: ticket issued, waitlisted, or hold expired.
2. Unpaid and Abandoned Registration Recovery
Trigger: record sits in Registered - Unpaid, or a Stripe payment failure webhook arrives, or the registration form is submitted but the payment step is never reached.
Conditions: runs only while payment_status is Pending or Failed, and stops the instant payment clears.
Actions in order:
- 20 minutes after: first recovery email and SMS. Your place at [event] is held until [expiry date and time]. The payment did not complete - usually the card rather than you. Finish here and your ticket sends straight away: [link].
- Wait 12 hours: second message, adding the one genuine reason to act now - the ticket window closing, or the remaining places if the number is real. Never invent scarcity.
- Wait 12 hours (24 hours in): third message, offering help rather than pressure. Still holding your place. If the payment page is the problem, reply to this and a person will sort it manually.
- At 4 hours before payment_hold_expiry: final notice naming the exact release time.
- At payment_hold_expiry: release the place to capacity, move to Canceled, and fire workflow 3 to offer the place to the waitlist. Send one clean message: We have released your held place at [event]. If you still want to come, here is live availability: [link].
- If the event sells out while a record is unpaid: shorten the remaining hold to 4 hours and say so plainly in the message.
- On three recovery attempts with no payment, create a task for the event owner only if ticket_type is Group or VIP. Everyone else exits silently.
Exit: payment clears, place released, or the attendee cancels.
3. Capacity, Waitlist and Release
Trigger A: a registration attempt against a full event or ticket_type.
- Create the record in Waitlist, apply waitlist-active, assign waitlist_position in submission order, and tell the attendee their position honestly. [Event] is full. You are number [n] on the waitlist - places do come back, usually in the last two weeks. I will message you the moment one does, and you will have 12 hours to take it.
Trigger B: a place is released by a cancellation, an expired unpaid hold, or a capacity increase.
- Query waitlist-active for the matching event and ticket_type, ordered by waitlist_position.
- Offer to the first person only, with a 12-hour expiry, apply waitlist-offered. A single-person offer is fairer than a scramble and produces fewer complaints than a first-come link on a waitlist people joined weeks ago.
- Wait 12 hours. Not taken: remove waitlist-offered, move to the next position, and repeat. Inside 72 hours of the event, shorten the expiry to 3 hours and offer to the next three simultaneously, since time now matters more than order.
- On acceptance: run workflow 1 from the payment step, preserving the original waitlist join date on the record so you can measure the channel.
- Inside 24 hours of the event with places still unsold: notify the event owner with the count and a one-click option to open on-door sales.
Trigger C: scheduled, daily. Recalculate remaining capacity per ticket_type and per session, update the funnel's displayed availability, and close a ticket type automatically when it fills. Alert the event owner at 80 and 95 per cent of capacity.
Exit: event starts, or the waitlist empties.
4. Details Capture and Session Selection
Trigger: stage reaches Ticket Issued.
Actions in order:
- Immediately: send Session Selection with live remaining capacity shown per session. On submission, write session_choices, apply one session- tag per choice, and decrement session capacity.
- If a chosen session fills between the form loading and submission: accept the rest, flag the clash, and offer the two nearest alternatives rather than silently dropping the choice.
- Wait 3 days. No session selection: one reminder. Wait 4 days: second reminder. After that, assign nothing - an unassigned attendee is a problem for the room count, so instead flag them on the final headcount as unallocated and let a human decide.
- 24 hours after ticket issue: send Dietary and Accessibility, stating plainly who sees the answers.
- On allergy declared: set allergy_flag, apply allergy-present, post the attendee's exact words to the event channel, and create a task for the event manager due in 24 hours to confirm with the caterer and reply in writing. Escalate at 24 hours and again at 48. Log the written reply on the record.
- On accessibility need declared: notify the event manager and the venue contact, create a task to confirm the specific arrangement, and reply to the attendee naming the person who will meet them.
- On consent_photography declined: apply photo-opt-out, flag it on the badge record, and include the list in the photographer's brief.
- When session, dietary and accessibility answers are all in, move to Details Complete.
Exit: details complete, or the event begins.
5. Pre-Event Reminder Ladder and Reconfirmation
Trigger: scheduled, counting backwards from event_datetime, on every record in Ticket Issued or later.
Actions in order:
- 14 days before: the agenda announcement - speakers confirmed, running order, and anything newly added. No ask attached.
- 7 days before: the personalized agenda. The attendee's own sessions, room numbers, start time, and one link to change a session. Attach the ticket again.
- 3 days before: the reconfirmation, two buttons only. [Event] on [day]. Still coming? Tap YES. Cannot make it? Tap here - someone on the waitlist would love your place and there is no awkwardness in it.
- On YES: stamp reconfirmed_at, apply reg-reconfirmed, move to Reconfirmed, stop reminding.
- On cannot make it: offer the Transfer Request flow first and the cancellation second. A transfer keeps your headcount, and most people would rather send a colleague than lose the ticket.
- 2 days before, as a scheduled run: compile and send the final headcount to the caterer, the venue and each session lead - reconfirmed total, unreconfirmed total, dietary breakdown by type, the allergy list with names, accessibility arrangements, and per-session numbers. One document, one send, from real data.
- 2 days before, per record: anyone not reconfirmed gets one SMS. Anyone still unreconfirmed with ticket_type VIP, Speaker, Sponsor or Group gets a task for a human to call.
- 1 day before, 17:00: the logistics message. Doors, first session, address, travel and parking, the ticket link, and the event number to text. Keep it short enough to read on a platform.
- Event morning, 2 hours before doors: the final message - ticket link, doors time, and the one thing that most often goes wrong at your venue, named explicitly.
Exit: event begins, canceled, or transferred.
6. Door Check-In and Live Count
Trigger: a scan or a name-search check-in on the door page, from the moment doors open.
Actions in order:
- Validate registration_code. Valid and unused: stamp checkin_time, checkin_method and checkin_by, move to Checked In, apply checked-in, and return the door screen - badge_name in large type, ticket_type, session choices, and any allergy-present, accessibility-need or photo-opt-out flag.
- Code already used: do not reject the person. Show the original checkin_time and who scanned it, and prompt the volunteer to call the door lead. Duplicate scans are almost always a shared group ticket or a double tap, not fraud.
- Code not found: fall back to name search across the event. Found and unpaid: flag to the door lead for a decision, never refuse automatically. Not found at all: route to workflow 7 for on-door registration.
- Session doors: scan again at each session entrance, write to sessions_attended, and alert the session lead when a room reaches capacity.
- Every 15 minutes: post the live count to the event channel - checked in, against reconfirmed, against tickets issued, plus the last 15 minutes' arrival rate so the door lead can see whether the queue is building or clearing.
- 30 minutes after doors, and again 60 minutes after the first session starts: run the late-arrival nudge against every reg-reconfirmed record with no check-in. Doors are open and your seat is still here - come straight in, the desk can wait: [ticket link]. This single message recovers more attendance than any pre-event reminder.
- At event close: move every checked-in record to Attended. Move every ticket-issued record with no check-in to No-Show, apply event-no-show, and increment no_show_count on the contact.
Exit: event closes. Keep the offline fallback list live until it does.
7. On-Door Registration, Transfers and Refunds
Trigger A - walk-up: On-Door Registration form submitted by a door volunteer.
- Check remaining capacity. Full: record as an inquiry, add to the waitlist for the next event, and tell them honestly.
- Capacity available: create the record with ticket_window On Door, take payment at the desk through Stripe where the event is paid, generate registration_code, check them in immediately in one step, and send the ticket to their phone so they have it for session doors.
- Capture email, mobile, badge_name, company and consents. A walk-up attendee with no email captured is an attendee you cannot invite next time, which is the whole point of the record.
Trigger B - transfer: Transfer Request submitted.
- Check the transfer cut-off date in your policy. Past it: route to the event owner rather than refusing automatically.
- Within it: void the old registration_code, create the new attendee record with transfer_from populated, generate a new code, and issue the new ticket within 5 minutes. Move the original record to Transferred.
- Send the new attendee the full sequence from the current point in the ladder - session selection if seats remain, dietary form, and whichever reminders are still ahead of them.
- Notify both parties in one line each so neither is left wondering.
Trigger C - cancellation or refund request:
- BO acknowledges and collects the reason, then stops. No refund is ever issued by automation. Create a task for the event owner with the request, the date, the policy position and the payment reference.
- Before the task is actioned, offer the transfer alternative once: Before we refund - would sending a colleague work? A name change takes two minutes and keeps your place: [link].
- On the owner approving, process the refund in Stripe, set payment_status Refunded, move to Canceled, release the place, and fire workflow 3.
Exit: resolved by a human in every refund case.
8. Post-Event Survey, Content Delivery and Next-Event Pipeline
Trigger: event marked closed.
Actions in order:
- Same day, 2 hours after close: send the Post-Event Survey to every attended record. Four questions: one score, best session, one thing to change, and would you come again. Same-day response rates run far above next-week ones.
- Score 9 or 10: thank them and send one review or testimonial request, with a single link. Tag them for the next event's early-access list.
- Score 6 or below: no review request. Post to the event channel and create a task for the event owner to make personal contact within 48 hours. Log the outcome.
- Wait 2 days: deliver slides and recordings by session- tag, so each attendee receives the content for the sessions they actually attended plus a link to everything else. Specificity is what gets this email opened.
- No-show branch, next morning: one message, written without reproach. Sorry we missed you yesterday. Here are the slides and the recordings anyway - you paid for them, or you meant to come, and either way they are yours: [link]. Capture any reason given. A no-show treated well registers again; a no-show ignored does not.
- Wait 10 days: if consent_marketing is on, send the next-event announcement to attended records with a priority window before public release, and set a reminder for when that window closes.
- Speaker and sponsor branch: within 3 working days, send each sponsor the agreed lead list containing only the fields attendees consented to share, plus attendance numbers and session-level counts. Create a task for a debrief call inside two weeks, while the event is still fresh enough to renew on.
- Wait 5 working days: compile the event report for the owner - registrations by channel and referral code, payment completion and recovery, show-up rate by ticket type and by reconfirmation state, check-in throughput and scan success, session attendance against choices, waitlist conversion, transfer and refund counts, dietary accuracy, survey scores and themes, and repeat-attendance rate. Keep it against event_id so the next event can be planned from it rather than from memory.
Exit: report delivered and the attendee list segmented for the next event. The record persists - that list is the asset.