Run an RCS marketing campaign end-to-end
This guide walks the full lifecycle of an RCS campaign: size how much of the audience your agent can actually reach, draft the campaign with the approved template bound to the agent, dry-run the RCS-specific gates, launch, and subscribe to the webhooks that report per-recipient outcomes. It complements the campaign end-to-end guide, which covers the channel-agnostic sequence — everything here is the RCS delta: agent binding, template approval, the capability-based reach scan, and the SMS fallback ladder that decides who still gets the message.1. Prerequisites
- An agent (bot) launched on at least one carrier. An RCS campaign sends only through a carrier-launched agent — a
draft,pending_verification, orpending_launchbot fails the pre-flight. If you have not onboarded yet, start with the RCS onboarding guide; the brand → agent → verify → launch sequence takes days, so do it before any campaign planning. - An approved template registered to that agent. Campaign sends reference templates by name, and only
Approvedtemplates pass the launch gate. Author and submit it in the Rich Card Studio, and read its approval badge on the Templates tab. A template pending carrier review blocks the launch. - An audience sized by reach scan. RCS reachability is per device — a list that looks large can be half non-capable. Run the reach scan in step 2 before you commit the segment to a rich-media send.
- An API key with the
campaigns:writescope. Reads (reach scan, audience preview, dry-run, stats) acceptcampaigns:read; launch requires write. - An opted-in recipient audience. Opt-outs and suppression are enforced at send time; the SMS fallback hop passes through the same opt-out screening as a pure SMS campaign.
2. Pick reach: scan before you build
The reach scan samples your segment against your bot and returns the capable share plus a recommended channel mix — the answer to “RCS-only, mixed, or SMS-first” before you draft:rcs— most of the segment is capable; a single-channel RCS campaign is viable, but a short SMS ladder still protects the minority.mixed— some recipients are capable, some are not; use the RCS-first ladder with SMS as the terminal hop (step 3). Never ship amixedverdict as RCS-only — every non-capable recipient hard-fails.sms— the segment is mostly non-capable; either keep this send on SMS, or ship the ladder anyway knowing most recipients settle on the SMS hop.
sample_size contacts (default 50), so treat the percentage as an estimate. The reach-scan recipe in the SMS-to-RCS upgrade guide covers per-recipient capability caching when you need finer granularity.
3. Build the campaign: template attached, agent bound
Create the draft withchannel: "rcs" and the approved template name from your agent’s roster:
message_template against the agent’s template roster and requires status: Approved. A PUT to a template resets approval to pending — check the row on the Messages → RCS → Templates tab before launch, and sequence template edits between launches, not during them.
SMS fallback ladder. To send RCS first and fall back to SMS on terminal failure, pass a channels array whose first entry is RCS carrying rcs_template, with SMS as the terminal hop:
channel must equal the first entry, and rcs_template may only appear on the RCS entry. The fallback_on: "failed" trigger moves a recipient to SMS only on a terminal RCS failure (undelivered / rejected, including the capability short-circuit RCS_NOT_SUPPORTED) — it protects reach without double-paying delivered recipients. The SMS hop carries the plain-text body via top-level message_template. The fallback chains guide maps the broader trigger vocabulary.
4. Pre-flight: dry-run plus audience preview
Preview the audience with the channel set, so the net projection subtracts suppression rows, RCS opt-outs, and contacts with no reachable address:- No capability. Contacts whose devices were probed and reported non-capable (or whose handset carrier is not among the agent’s launched carriers) drop out of an RCS-only preview. If the unreachable share is large, add the SMS ladder from step 3 or restrict the audience to capability-verified recipients.
- Template pending. On a ladder, the RCS hop is treated as unconnected when its template is not
Approved, and recipients who would only reach the rich message fall to the SMS hop. On an RCS-only campaign, a pending template blocks the launch outright.
ready_to_launch), an RCS campaign is gated on RCS-specific state:
- Agent readiness. The bot must be
launchedon at least one carrier — the pre-flight readsGET /api/v1/rcs/bots/:id/qualityfor thecarrier_statusesmap. A campaign pointing at a draft or pending-launch bot reads unconnected and suppressesready_to_launch. - Template approval. Launch re-resolves
message_templateor the hop’srcs_templateagainst the agent’s roster; anything notApprovedmeans back to the Templates tab. - Fallback hop readiness. On a ladder, the SMS hop requires a dedicated sending number — the pre-flight probes every step, so an unprovisioned SMS sender also suppresses
ready_to_launch. Details: pre-launch readiness for fallback chains.
5. Launch and read
- Campaign lifecycle —
campaign.started,campaign.completed,campaign.paused. - Per-message outcomes —
message.sent(accepted by the carrier hub),message.delivered(device receipt),message.read(the recipient opened it — RCS reports a read receipt SMS never produces), andmessage.failedcarrying the provider error, e.g. capability skip (RCS_NOT_SUPPORTED) or a carrier rejection on template content. - Replies — inbound replies arrive as
message.received; route them into the inbox or your own automation via the normalized inbound envelope.
GET /api/v1/campaigns/:id/stats aggregates the same signals — sent, delivered, read (opened), replied — so the dashboard and your webhook-driven pipeline reconcile. On a ladder, each hop’s outcome lands on the campaign recipient record; the cascade tracking guide is the per-hop receipt surface.
6. Per-template analytics
Read per-template rates to decide what to keep sending:GET /api/v1/rcs/analytics/daily?days=30 breaks volume per day to catch a delivery dip after a bot or template change. In the dashboard the Messages → RCS → Analytics tab renders the same aggregation, and the Templates tab shows the counters inline with each template’s approval badge.
7. Operate after launch
- Template edits mid-flight. Every
PUTto a template resets approval to pending — a live campaign referencing it falls back to SMS (on a ladder) or starts failing (RCS-only). Freeze templates before launch; land edits between launches. The warning lives on the Templates tab too — sequence edits around launch windows. - Rollback to SMS-first. If RCS delivery dips against a launch’s baseline, pause the campaign (
POST /api/v1/campaigns/:id/pause), edit the ladder sochannel: "sms"leads, and re-launch; or flip the org-level cross-channel fallback off for blast traffic until the carrier hub recovers. Either way the SMS hop keeps the audience reachable. - Re-approve before renewal. Template approval does not roll into new definitions: when you revise copy for a seasonal reuse, resubmit and wait for
Approvedbefore scheduling the next send. The approval-state table on the Templates tab is the checklist.
Troubleshooting
- Launch 422: template not approved or not found. Re-sync the Templates tab and confirm the name — template names are case-sensitive. Only
Approvedtemplates send. - Pre-flight: RCS hop unconnected. The bot is not launched on any carrier, or the ladder’s RCS template is pending. Poll
GET /api/v1/rcs/bots/:id/qualityfor the per-carriercarrier_statuses. - High
message.failedwithRCS_NOT_SUPPORTED. The recipients were never RCS-capable to this agent — shorten your capability cache or restrict the audience to probed-capable recipients; on a ladder, those recipients advance to SMS. - Delivered stays high, read trends toward zero. Rich cards earn taps only if the card itself prompts one — compare the template’s rates against the rest of the roster on the Templates tab or the per-template analytics endpoint and iterate on the card content before scaling further.
- Sends skip recipients on some carriers. The agent is launched only on a subset of carriers — the org-level
RCS → SMSfallback or your campaign ladder’s SMS hop covers the rest; comparecarrier_statusesagainst where your audience sits before scaling traffic.