captureConsentstableCapture consent
Record that the caller agreed to be contacted by phone or text (TCPA consent). Put it right after they say yes — e.g. off a 'press 1 to consent' branch. D…
What it does
Records that the caller agreed to be contacted by phone or text (TCPA
consent). When the flow reaches this node it writes a consent_records
row for the caller's own number, stamped with the call so the recording
is the proof, and then continues down its __next edge. It performs no
audio itself — it's a persist-and-continue node you place after the
moment the caller agrees.
The scope field decides what the consent covers:
- transactional — reminders, confirmations, callbacks. The everyday case; a spoken or keypress "yes" is sufficient and is stored as express consent.
- marketing — promotions and win-backs. A higher bar; the consent is stored as written consent (the call recording is the electronic record). Only use this when the caller clearly opts in to promotional contact.
The number defaults to the caller's own line, so you never have to wire it up. Once recorded, the outbound dial + text gates honor it, and a later STOP always overrides it.
When to use it
- Off the "1" branch of a
gatherDigitsnode that asked "press 1 to agree to appointment reminders by text" - After an
aiAgentinteraction where the caller says yes to being texted (though the agent's ownrecord_consenttool usually covers that in-line) - Any point in a flow where the caller has just, unambiguously, agreed to be contacted and you want a durable, provable consent record
Configuration
Record that the caller agreed to be contacted by phone or text (TCPA consent). Put it right after they say yes — e.g. off a 'press 1 to consent' branch. Defaults to the caller's own number.
| Field | Label | Type | Required | Default | Notes |
|---|---|---|---|---|---|
scope | Consent scope | select | Optional | transactional | Options: transactional, marketing. Transactional covers reminders/confirmations/callbacks. Marketing is for promotions and needs a clear opt-in. |
Examples
Press-1-to-consent branch
A gatherDigits node asks the caller to press 1 to receive reminders;
the 1 edge lands on a captureConsent node, which records the consent
and continues to the confirmation prompt.
{
"id": "record-reminder-consent",
"type": "captureConsent",
"config": { "scope": "transactional" },
"on": { "__next": "reminder-confirmed" }
}
Marketing opt-in
After the caller explicitly agrees to promotional texts, record marketing consent (stored as written consent, backed by the call recording).
{
"id": "record-marketing-consent",
"type": "captureConsent",
"config": { "scope": "marketing" },
"on": { "__next": "thanks" }
}
Gotchas
- Place it AFTER the agreement, not before. The node records consent
unconditionally when the flow reaches it — it does not ask the caller
anything. Gate it behind a
gatherDigits"press 1" branch or a spoken confirmation so you only record consent the caller actually gave. - It always records the caller's own number. There's no field to
record consent for a third party — that would be capturing consent the
caller can't give. Use the API (
POST /orgs/:slug/consent) for consent captured out-of-band. - A later STOP wins. Consent recorded here is overridden the moment the caller texts STOP; the outbound gates read the opt-out first.
- Best-effort persist. The write is fire-and-forget so a transient database hiccup never drops or delays the call — it just means that one consent row wasn't written.
