Send Message Node
The agent confirms the appointment, reads out a reference number, and the caller writes it on the back of an envelope. Or they do not, and they ring back tomorrow to ask what it was.
A Send Message node texts them instead. Call, then text, is the pattern people in India actually complete — the conversation persuades, the message is the thing they keep.
How it behaves
Like the Webhook node, this one is detached — no edges in or out. It is not a step in the conversation. It fires once the run completes, with everything the call gathered available to the message.
| When | After the call ends, alongside webhooks and QA. |
| To | The number that was on the call, unless you say otherwise. |
| From | The configuration’s default caller ID, unless you say otherwise. |
| Body | Supports {{template_variables}} from the call. |
Write the message
Namaste {{first_name}}, your appointment is confirmed for{{appointment_time}}. Reference: {{reference_id}}Everything the call knows is available: variables extracted during the conversation, columns from the campaign CSV, fields from the trigger payload, and anything a pre-call fetch returned.
Only send when it is worth sending
The failure this node must not have is texting somebody a confirmation of a call that did not succeed. Only send if takes the same shape as a branch rule:
| Variable | call_outcome |
| Condition | equals |
| Value | agreed |
Leave the variable blank to always send.
Reading what happened
Every attempt is recorded on the run under follow_up_messages:
{ "follow_up_messages": [ { "node": "Confirmation SMS", "ok": false, "provider": "twilio", "to": "+919876543210", "error": "The 'To' number is not a valid mobile number", "status_code": 400 } ]}The carrier’s own words are kept, because “the To number is not a valid mobile number” tells you what to fix and “HTTP 400” does not.
Numbers
Recipients must be E.164 — +919876543210. Spaces, dashes and a leading
00 are cleaned up for you.
Failures never take the call down with them
By the time this runs the conversation is over, the transcript is stored and the receipt is costed. A carrier that rate-limits you, a network blip, a number that turns out to be a landline — all of them are written onto the run and none of them stops the rest of the post-call work. Losing a call’s data over an SMS would be a bad trade.
From code
import { sms } from "@decibyl/sdk/typed";
await wf.addTyped(sms({ name: "Confirmation SMS", channel: "sms", body: "Namaste {{first_name}}, ref {{reference_id}}.", send_when_variable: "call_outcome", send_when_operator: "equals", send_when_value: "agreed",}));No wf.edge call — the node is detached.
Next
- Branch Node — the same condition shape, for routing.
- Webhook — for telling your systems what happened.