Back to the build library
Fitness & wellness
Standard

Personal Training Package Sales

Sell training packages, book the sessions and burn the balance down automatically, so no session, no-show or renewal window goes untracked.

Industry
Fitness & wellness
Build effort
Standard
Typical time to launch
2–3 weeks
On this page
The problemWhat gets builtHow it runsAutomations in detailWhat changesBefore you start
Want this built for you?

Bring your stack to a call and we will scope it against how your business actually runs.

Book a call
01

The problem

Most personal training businesses sell packages on a handshake and track them in a notebook, a spreadsheet, or the trainer's head. A client buys a ten-session block, shows up six times over two months, then quietly stops. Nobody notices, because nobody is counting. Four sessions sit on the books as money already collected and never delivered, and the client drifts away believing they still have some sessions left without ever scheduling them.

The leak happens in three distinct places. First at the point of sale: a prospect finishes a free assessment genuinely excited, the trainer says I'll send you the options, and the follow-up either never lands or lands two days later when the enthusiasm has cooled. Second in the burn-down: sessions get delivered but never decremented, so a ten-pack becomes a twelve-pack and the trainer works two sessions per block for free. Third, and largest, at renewal. There is no moment where someone says you have two sessions left, let's book the next block. The package simply runs out in silence and an active client becomes a lapsed one without a single conversation.

Layer on late cancellations and no-shows with no enforced policy, because enforcement requires knowing who booked what, when they canceled and how many times they have done it before. A solo trainer or a small studio ends up giving away a meaningful slice of billable capacity to admin they have no time to do. The fix is not more discipline. It is a system that holds the session balance as a number, moves that number on its own when sessions are delivered or missed, and speaks up at the exact point where the balance is low enough to matter.

02

What gets built

Pipeline and stages

One pipeline named PT Packages that tracks the sale and then the delivery of the block:

  • New Inquiry: form, call or chat lead, nothing booked yet
  • Assessment Booked: free assessment on a trainer's calendar
  • Assessment Completed: attended, goals captured, options discussed
  • Proposal Sent: package options and payment link delivered
  • Package Purchased: payment captured, session balance loaded
  • Active - Sessions Remaining: in delivery, balance above the renewal threshold
  • Renewal Window: two or fewer sessions left, or expiry inside 21 days
  • Renewed: next block purchased, balance topped up
  • Lapsed: balance exhausted or expired with no renewal
  • Lost: declined, or went cold after the assessment

Calendars

  • Free Assessment: 45 minutes, round-robin across available trainers, 12-hour minimum notice, 1 per contact
  • PT Session 30 and PT Session 60: one calendar per trainer reflecting real availability, 10-minute buffer after each slot, 24-hour cancellation window
  • Semi-Private 2-4: group-type calendar with a seat cap of four
  • Renewal Call: 15 minutes, used for the end-of-block conversation

The session calendars are gated so only contacts tagged pt-active can self-book, and only when Sessions Remaining is greater than zero. Booking confirmations and reminders are owned by the platform, not by the trainer's phone.

Custom fields

  • Package Type: dropdown: 10x30, 10x60, 20x60, Semi-Private 12, Trial 3
  • Sessions Total, Sessions Used, Sessions Remaining: numbers; Remaining is the one every automation reads
  • Package Purchase Date and Package Expiry Date: dates; expiry is purchase plus the block's validity window
  • Assigned Trainer: dropdown of staff names
  • Primary Goal: free text captured at assessment, reused verbatim in renewal copy
  • Readiness Form Complete: yes/no, must be yes before the first session
  • Late Cancel Count and No Show Count: numbers, incremented by automation
  • Last Session Date: date, written on every completed session
  • Renewal Offer Sent: date, prevents the renewal sequence firing twice in one block
  • Payment Method: dropdown: paid in full, installment plan

Tags

  • pt-lead, pt-assessment-booked, pt-assessment-attended
  • pt-active: the gate for self-booking; removed when the balance hits zero
  • pt-low-balance, pt-renewal-offered, pt-renewed
  • pt-no-show, pt-policy-warning, pt-lapsed, pt-winback-active

Forms and surveys

  • Training Inquiry: name, mobile, email, goal, days and times that usually work, SMS consent checkbox
  • Readiness and Intake: sent after the assessment is booked; covers goals, training history, anything the client wants the trainer to know, and an acknowledgement that they have clearance to exercise. The form records what the client states; it does not assess or screen on the business's behalf.
  • Package Selection: the options, the validity window and the cancellation policy, with the payment link on submit
  • Cancellation Request: the only sanctioned way to cancel inside the notice window, so every cancellation is timestamped
  • End of Block Review: four questions at balance zero: progress against the stated goal, what worked, what to change, likelihood of continuing

BO's role and guardrails

BO answers the inbound channels and handles the two conversations that eat the most trainer time: how much is it and can I move my session.

  • BO qualifies an inquiry on goal, availability and location, then books the free assessment directly into the round-robin calendar.
  • BO reads Sessions Remaining and Package Expiry Date back to a client who asks, and offers the next open slot on their assigned trainer's calendar.
  • BO reschedules inside policy without a human. Outside the notice window it explains the policy, logs a late cancel, and hands the thread to the trainer.
  • BO never quotes a figure. Pricing is scoped per client, so BO describes what each block includes and offers either the assessment or a call at bookings.appbo.io.
  • BO never gives training, nutrition, injury or medical guidance. Anything in that territory is escalated to the assigned trainer with the message quoted in full. BO's scope is scheduling, balances and logistics.
  • Every BO thread is visible in the shared conversation inbox, and any staff reply silently takes the thread off automation.

Numbers and channels

  • One provisioned local number for the studio, used for SMS and voice, so client replies land in one thread rather than on four trainers' personal phones
  • Inbound calls ring the studio line in sequence during staffed hours; outside them, a voice flow takes the reason for the call and offers a booking link by SMS
  • Web chat on the site and the booking pages, connected to the same inbox
  • Email on the studio's own authenticated domain for proposals, receipts and reviews
  • Instagram and Facebook message channels routed into the same inbox, since most inquiries start there
03

How it runs, step by step

  1. Inquiry lands. A prospect messages the studio Instagram asking what one-to-one training involves. The message hits the shared inbox, a contact is created, tagged pt-lead, and an opportunity opens in PT Packages at New Inquiry with the source recorded.
  2. BO qualifies and books. BO replies inside a minute, asks what they are training for and which days usually work, then offers the three nearest free assessment slots. The prospect picks Thursday 6pm. BO books it, the opportunity moves to Assessment Booked, and the tag pt-assessment-booked is applied.
  3. Intake goes out. Two minutes after booking, the Readiness and Intake form is sent by SMS and email. On submit, Primary Goal and Readiness Form Complete are written to the contact and the assigned trainer gets the answers before they meet.
  4. Reminders fire. 24 hours out and again 2 hours out, the prospect gets an SMS with the address, the trainer's name and a reschedule link. The 2-hour message asks for a one-word reply to confirm.
  5. Assessment happens. The trainer marks the appointment attended. The opportunity moves to Assessment Completed and pt-assessment-attended is applied.
  6. Proposal goes out within the hour. The platform sends the Package Selection page, pre-filled with the client's name and their stated goal, showing the block options, the validity window and the cancellation policy. No figure appears in any automated message; the page itself carries whatever the studio has configured.
  7. Client selects and pays. They choose the 10x60 block and pay through the connected payment processor. The payment event moves the opportunity to Package Purchased and writes Package Type, Sessions Total = 10, Sessions Used = 0, Sessions Remaining = 10, Package Purchase Date = today and Package Expiry Date = today plus the configured validity window.
  8. Activation. The tag pt-active is applied, which unlocks the assigned trainer's PT Session 60 calendar. The client receives a receipt, a short welcome that repeats their goal back to them, and a link to book their first three sessions in one sitting.
  9. Sessions get delivered. Each time an appointment on a session calendar is marked attended, Sessions Used increments by one, Sessions Remaining decrements by one, and Last Session Date is stamped. The opportunity sits at Active - Sessions Remaining and the trainer never touches a spreadsheet.
  10. A session gets missed. The client does not show for session five. The trainer marks it no-show. No Show Count goes to 1, the balance decrements per the policy on the selection page, and a measured SMS goes out offering a reschedule and restating the notice window. At a second no-show the trainer is notified rather than the client being messaged again automatically.
  11. Balance hits two. Sessions Remaining = 2 flips the opportunity to Renewal Window, applies pt-low-balance, and starts the renewal sequence: a message naming the exact number left and the client's own goal wording, then a renewal call link, then a last-session nudge.
  12. Renewal lands or it does not. If the client buys the next block, the balance is topped up, Sessions Total and Package Expiry Date are rewritten, the opportunity moves to Renewed and all renewal tags are cleared. If the balance reaches zero with no purchase, pt-active is removed, the calendar locks, the opportunity moves to Lapsed, and the End of Block Review goes out.
  13. Win-back runs on its own clock. Fourteen days after lapsing, a win-back sequence starts: one message referencing the review answer if there is one, a second three weeks later offering a check-in session, then the contact drops into the monthly studio newsletter and out of active sequences.
  14. Weekly read. Every Monday the owner gets one dashboard email: sessions delivered last week, undelivered sessions sitting on the books, opportunities in Renewal Window, renewal conversion for the trailing 90 days, and no-show rate by trainer.
04

Automations in detail

1. Inquiry Capture and Speed to Lead

Trigger: Training Inquiry form submitted, inbound SMS to the studio number, web chat started, or a new Instagram or Facebook message from an unknown contact.

Branches: if the contact already carries pt-active, exit immediately and route the message to the assigned trainer instead; this workflow is for new inquiries only.

  • Action 1, immediate: create or update the contact, apply pt-lead, write the source, open an opportunity in PT Packages at New Inquiry.
  • Action 2, immediate: BO replies in the originating channel. "Hi {{first_name}}, thanks for reaching out to {{business_name}}. Quick one so I point you the right way. What are you training for at the moment, and which days usually work for you?"
  • Action 3, wait 5 minutes: if no reply, send SMS. "It's BO at {{business_name}}. Easiest next step is a free 45-minute assessment. We look at where you're at and map out a plan, no obligation. Here are the next openings: {{assessment_link}}"
  • Action 4, wait 1 hour: if still no reply and the inquiry arrived during staffed hours, create a task for the duty trainer: "Call {{first_name}}, inquired {{time}} via {{source}}, no response to two messages."
  • Action 5, wait 1 day: email with a short note on how the studio works and the assessment link.
  • Action 6, wait 3 days: final SMS. "Last one from me, {{first_name}}, if now isn't the right time I'll leave you be. The assessment link stays open whenever you're ready: {{assessment_link}}"

Exit: assessment booked, any inbound reply (hands to BO conversation flow), pt-lead removed, opportunity moved to Lost, or STOP received.

2. Assessment Confirmation, Reminders and No-Show Recovery

Trigger: appointment booked on the Free Assessment calendar.

  • Action 1, immediate: move opportunity to Assessment Booked, apply pt-assessment-booked, write Assigned Trainer from the round-robin result.
  • Action 2, wait 2 minutes: SMS and email the Readiness and Intake form. "You're booked in with {{assigned_trainer}} on {{appointment_time}}. Two minutes on this before you come in and we can use the whole session on you: {{intake_link}}"
  • Action 3, 24 hours before the appointment: SMS. "Tomorrow at {{appointment_time}} with {{assigned_trainer}}. We're at {{address}}, parking is {{parking_note}}. Need to move it? {{reschedule_link}}"
  • Action 4, 2 hours before: SMS. "See you at {{appointment_time}}, {{first_name}}. Reply Y to confirm."
  • Action 5, 30 minutes before, branch on intake: if Readiness Form Complete is not yes, notify the assigned trainer internally so they take the questions verbally rather than assuming they have them.
  • Action 6, 15 minutes after the slot ends, branch on outcome: if marked attended, exit to workflow 3. If marked no-show, apply pt-no-show, increment No Show Count, and send: "Sorry we missed you today, {{first_name}}. Things come up: want to grab another slot? {{assessment_link}}" Then wait 2 days and send one more. If still nothing, move the opportunity to Lost with reason no-show, no re-book.

Exit: attended, re-booked, moved to Lost, or STOP received.

3. Proposal Delivery and Payment Follow-Up

Trigger: assessment appointment marked attended, or opportunity moved manually to Assessment Completed.

  • Action 1, immediate: apply pt-assessment-attended.
  • Action 2, wait 30 minutes: long enough for the trainer to finish and note the goal, short enough to catch the decision warm. Send the Package Selection page by SMS and email. "Great session, {{first_name}}. Based on what you said about {{primary_goal}}, here are the options we talked through, including what's covered and how long each block runs: {{package_link}}. Any questions, just reply here."
  • Action 3, wait 1 day: if the page was opened but not submitted, SMS. "Saw you had a look, {{first_name}}, anything you want me to talk through before you pick? Happy to jump on a quick call."
  • Action 4, wait 2 days: if not opened at all, email with subject "Your plan for {{primary_goal}}" and the same link.
  • Action 5, wait 3 days: task for the assigned trainer to make one personal call. No automated message on this step: at this point a human lands better than a sequence.
  • Action 6, wait 7 days: SMS. "No pressure either way, {{first_name}}. If the timing's off, tell me roughly when and I'll check back then instead of pestering you." Branch: if the reply contains a timeframe, BO sets a follow-up date and the contact drops into the nurture list until then.
  • Action 7, wait 14 days: move the opportunity to Lost with reason no decision and add the contact to the monthly newsletter.

Exit: Package Selection submitted, payment received, opportunity moved to Lost, or STOP received.

4. Package Activation and First-Block Booking

Trigger: payment succeeded webhook from the payment processor, or first installment captured on a plan.

Conditions: match the payment to the product to decide which block was bought.

  • Action 1, immediate: move opportunity to Package Purchased, write Package Type, Sessions Total, Sessions Used = 0, Sessions Remaining = Sessions Total, Package Purchase Date = today, Package Expiry Date = today plus the block's validity window, Payment Method, and clear Renewal Offer Sent.
  • Action 2, immediate: apply pt-active, remove pt-lapsed, pt-low-balance, pt-renewal-offered and pt-winback-active if present.
  • Action 3, immediate: send receipt by email and SMS. "You're in, {{first_name}}. {{sessions_total}} sessions with {{assigned_trainer}}, valid until {{package_expiry_date}}. Book your first three here so they're locked in: {{session_booking_link}}"
  • Action 4, wait 1 hour: notify the assigned trainer internally with the intake answers and the stated goal.
  • Action 5, wait 2 days: if zero appointments exist on a session calendar, SMS. "Noticed you haven't picked your first slots yet. Want me to suggest three that fit the days you said worked? {{session_booking_link}}"
  • Action 6, wait 5 days: if still no booking, task the trainer to call. An unbooked paid block is the single most reliable predictor of a refund request.
  • Action 7, installment branch: on a failed installment, pause pt-active after a 3-day grace period, notify the owner, and send: "{{first_name}}, the last payment didn't go through: can you update the card here? {{payment_update_link}} Your slots are held until {{grace_end}}."

Exit: first session attended, or refund issued (which reverses the balance and removes pt-active).

5. Session Burn-Down and Attendance Logging

Trigger: appointment status changed on any PT Session or Semi-Private calendar.

Branches by status:

  • Attended: increment Sessions Used by 1, decrement Sessions Remaining by 1, write Last Session Date = appointment date. Then wait 2 hours and send: "Nice work today, {{first_name}}. {{sessions_remaining}} left in this block. Next one booked? {{session_booking_link}}"
  • Canceled more than 24 hours out: no balance change, no count increment. Send: "Canceled, no problem. Grab another slot whenever: {{session_booking_link}}" Then notify the trainer that the slot is free.
  • Canceled inside 24 hours: increment Late Cancel Count, apply the studio's configured balance rule, and route to workflow 7.
  • No-show: increment No Show Count, apply pt-no-show, apply the balance rule, and route to workflow 7.
  • Threshold action: when Sessions Remaining changes, evaluate it. At 2 or below, trigger workflow 6. At 0, remove pt-active, move the opportunity to Lapsed unless it is already Renewed, and send the End of Block Review.
  • Gap check, runs daily: if pt-active and Last Session Date is more than 14 days ago and no future appointment exists, SMS. "{{first_name}}, it's been a couple of weeks: you've still got {{sessions_remaining}} sessions and they run out {{package_expiry_date}}. Want me to find you a slot?" Then task the trainer.

Exit: this workflow is event-driven and always on for contacts tagged pt-active.

6. Low-Balance Renewal Sequence

Trigger: Sessions Remaining drops to 2 or below, or Package Expiry Date is 21 days away, whichever comes first.

Conditions: only run if Renewal Offer Sent is empty for this block, so the sequence fires once per block and not once per decrement.

  • Action 1, immediate: move opportunity to Renewal Window, apply pt-low-balance, write Renewal Offer Sent = today, notify the assigned trainer: "{{first_name}} is at {{sessions_remaining}} sessions. Have the conversation in the next session."
  • Action 2, wait 1 hour: SMS. "Heads up {{first_name}}, you're down to {{sessions_remaining}} sessions, and they expire {{package_expiry_date}}. You've been working on {{primary_goal}}; worth keeping the momentum. {{assigned_trainer}} will go through next-block options with you, or book a 15-minute call here: {{renewal_call_link}}"
  • Action 3, wait 3 days: if no renewal and no call booked, email. Subject: "{{sessions_remaining}} sessions left: what's next for {{primary_goal}}". Body recaps session count delivered to date, Last Session Date, and the options page link.
  • Action 4, on the final session of the block, 2 hours after it is marked attended: SMS. "That was your last one in this block, {{first_name}}. Want to carry straight on? {{package_link}}"
  • Action 5, wait 2 days from the final session: task the trainer for a personal call, with the client's goal and total sessions delivered shown on the task.
  • Action 6, wait 5 days: if no renewal, remove pt-low-balance, apply pt-lapsed, move opportunity to Lapsed, send the End of Block Review and hand to workflow 8.

Exit: new payment received (routes to workflow 4), renewal call booked, or Lapsed reached.

7. Cancellation and No-Show Policy Enforcement

Trigger: Late Cancel Count or No Show Count incremented by workflow 5, or Cancellation Request form submitted inside the notice window.

Branches on combined count:

  • First occurrence: SMS, no escalation. "No problem {{first_name}}, that one's inside our {{notice_window}} window so it counts against the block, per the policy on your booking page. Here's the link to pick a replacement slot: {{session_booking_link}}" Notify the trainer that the slot is free.
  • Second occurrence: apply pt-policy-warning. SMS. "That's the second short-notice change, {{first_name}}. Totally understand life happens, but it does leave a slot unused that someone else wanted. If the day or time isn't working, tell me and we'll move your regular slot properly." Task the trainer to raise it in person.
  • Third occurrence: no further automated message to the client. Notify the owner and the assigned trainer with the full history (dates, counts, sessions remaining) and create a task to decide whether to restrict self-booking for that contact. The system stops talking and a human takes over, because a third breach is a relationship question rather than a messaging question.
  • Released-slot offer, immediate on any cancellation: query contacts tagged pt-active with Sessions Remaining greater than 0, no appointment in the next 7 days, and stated availability matching the released slot. Send to at most three of them: "A slot just opened with {{assigned_trainer}} at {{slot_time}}, first to book takes it: {{session_booking_link}}" Stop after the first booking.

Exit: replacement slot booked, counts reset at the start of a new block, or owner closes the escalation task.

8. Lapsed Client Win-Back

Trigger: pt-lapsed applied, or Package Expiry Date passes with Sessions Remaining greater than 0.

Conditions: suppress entirely if the contact has an active opportunity in any other pipeline, or if pt-policy-warning escalated to the third occurrence and the owner marked the contact as not to be re-marketed.

  • Action 1, immediate: apply pt-winback-active, remove pt-active, lock the session calendars.
  • Action 2, wait 14 days: SMS, branching on the End of Block Review answer. If they said they would continue: "{{first_name}}, you said you were planning to carry on: want me to set up the next block? {{package_link}}" If they flagged something to change: "You mentioned {{review_note}}. {{assigned_trainer}} has ideas on that: worth a 15-minute call? {{renewal_call_link}}" If no review was submitted: "{{first_name}}, your block finished a couple of weeks ago. How's training going on your own?"
  • Action 3, wait 21 days: email with a check-in offer. "Come in for a single session, no block required: {{assigned_trainer}} will see where you're at against {{primary_goal}} and tell you straight whether you need us."
  • Action 4, wait 30 days: final SMS. "Last nudge, {{first_name}}. Door's open whenever. I'll stop messaging about it now."
  • Action 5, wait 7 days: remove pt-winback-active, add to the monthly newsletter list, and stop all sequences.

Exit: any purchase, any appointment booked, any inbound reply (hands the thread to the trainer), STOP received, or the sequence completes.

05

What changes

The session balance stops being a memory problem. It is a number on the contact record that moves by itself when a session is delivered or missed, which means every person in the business can answer how many sessions does this client have left without asking anyone. Undelivered sessions become visible instead of invisible, and the renewal conversation happens at the balance level where it still converts rather than three weeks after the client has already drifted.

Follow-up stops depending on the trainer's evening. The proposal goes out within the hour of the assessment while the decision is still warm. Reminders go out on a schedule nobody has to remember. The policy is enforced by the system rather than argued about in person, which removes the most uncomfortable conversation in the business from the trainer's job.

Capacity recovers. Slots that used to be lost to late cancellations with no record now generate a timestamped cancellation, a logged count, and an offer of the released slot to the next client who asked for that time. The trainer's own phone stops being the business's communication channel, so client history survives staff turnover.

What to measure

  • Assessment show rate: attended divided by booked, watched weekly; the reminder cadence is the lever
  • Assessment-to-purchase rate: the single number the proposal timing is meant to move
  • Time from assessment completed to proposal sent: should be minutes, not days
  • Session delivery rate: sessions delivered divided by sessions sold in the period; the gap is deferred revenue at risk
  • Undelivered session balance: the sum of Sessions Remaining across all active clients, and how much of it is inside 30 days of expiry
  • Renewal rate at balance zero: split by trainer, since this is where coaching quality shows up commercially
  • No-show and late-cancel rate by trainer and by time slot: reveals whether the problem is a client cohort or a badly placed slot
  • Average days between sessions per active client: a widening gap predicts a lapse earlier than the balance does
  • Win-back conversion: lapsed contacts who return to Package Purchased within 120 days
06

Before you start

Prerequisites

  • Written package definitions: how many sessions in each block, session length, validity window, and whether sessions are transferable between family members. Every automation in this build reads those rules, so they have to exist as rules before anything is configured.
  • A written cancellation and no-show policy with a stated notice window. Decide now whether a no-show burns a session, because the burn-down automation has to be told.
  • Trainer availability as real calendar hours, including the hours they will not work. Round-robin assignment is only as good as the availability behind it.
  • A single owner for the shared inbox during staffed hours. BO escalates, and escalations need somewhere to land.
  • A decision on who is the assigned trainer of record for each existing client, and their current session balances, before migration.

Integrations

  • Stripe for one-off block payments and installment plans, with the payment event wired to the activation workflow. Square works equally well where the studio already takes in-person payments on it.
  • Google Calendar two-way sync per trainer, so the trainer's personal commitments block studio availability automatically
  • QuickBooks or Xero for revenue recognition, which matters here because a sold block is not earned revenue until the sessions are delivered
  • Instagram and Facebook message channels connected to the shared inbox
  • Zapier or Make only where an existing door-access or gym-management system needs to hear about activation and lapse events

Number provisioning and messaging compliance

  • Provision the studio's local number through the platform and complete A2P 10DLC brand and campaign registration before any automated SMS is switched on. Registration takes days, not minutes, and unregistered traffic is filtered or blocked by carriers. Register the campaign as the mix it actually is: appointment reminders plus marketing.
  • Capture SMS consent explicitly on every form with its own unticked checkbox and plain wording about what the client will receive. Do not bury it in a terms link.
  • Honor STOP, UNSUBSCRIBE, CANCEL, END and QUIT on the number and ensure a stop keyword removes the contact from marketing sequences while allowing transactional appointment confirmations only where the client's consent and local rules permit it.
  • Set quiet hours on every sending workflow, typically 9pm to 8am in the contact's own timezone, and have reminders that would land inside quiet hours queue to the next permitted window rather than silently drop.
  • Include the business name and a clear opt-out line in the first message of every marketing sequence.

Data protection

  • The intake form collects what the client chooses to tell the studio about their training history and readiness to exercise. Keep the field set minimal, keep it to what the trainer needs to program safely, and set a retention period rather than holding it indefinitely.
  • Restrict intake answers to the assigned trainer and the owner using role-based permissions, rather than making them visible to everyone with inbox access.
  • Depending on where the studio operates and what the forms ask, state and national health-information, consumer-protection and privacy rules may apply to this data, and consent language for both messaging and data handling has to match them.
  • Confirm all of the above with the client's own counsel. This guide describes how to build the mechanism; it is not legal advice, and messaging and privacy obligations differ by jurisdiction and by what each business collects.
Field notes

Build it with us.

Every build on this page is something we configure, test and hand over with the SOPs your team needs to run it.

Book a call