> ## Documentation Index
> Fetch the complete documentation index at: https://docs.chartcastr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# WhatsApp delivery (private beta)

> Deliver scheduled chart snapshots and AI summaries to any WhatsApp number — or group chat — via Chartcastr. Pick our shared Managed sender for zero setup, or use your own number with the Branded tier.

<Info>
  **Private Beta** — WhatsApp delivery is in private beta. [Contact us](mailto:support@chartcastr.com) for access to the Managed tier, or [book a Branded onboarding](https://chartcastr.com/book-a-demo) if you want messages sent from your own number.
</Info>

## What you get

Push a chart image, a short AI-written read of what changed, and a deeper analysis as a threaded follow-up — straight to a WhatsApp number on your team's schedule. Built on the official **WhatsApp Business Cloud API** (no third-party bots).

Replies and emoji reactions on a delivered chart fire an AI follow-up back in the same conversation, so WhatsApp becomes a two-way channel for your data — not just a delivery pipe.

## Two tiers: Managed vs Branded

WhatsApp delivery ships in two flavors. The *sending* technology is identical (Meta Cloud API, same chart + AI pipeline) — what differs is **whose number it comes from** and **how much setup you do**.

|                             | **Managed**                                 | **Branded**                                                 |
| --------------------------- | ------------------------------------------- | ----------------------------------------------------------- |
| **Sender**                  | Chartcastr's shared business number         | Your company's own WhatsApp Business number                 |
| **Setup time**              | \~30 seconds — one click                    | 1–2 weeks — we drive Meta Business verification with you    |
| **What the recipient sees** | "Chartcastr" in the message header          | Your brand, your verified business name                     |
| **Meta Developer account?** | Not needed                                  | Yes — we walk you through it                                |
| **Group delivery**          | Supported (once Meta GA's group send)       | Supported (once Meta GA's group send)                       |
| **Best for**                | Solo founders, small teams, internal alerts | Agencies, customer-facing delivery, branded experiences     |
| **Pricing**                 | Bundled with any paid plan                  | **starting at \$85/mo per account** + per-message Meta fees |

The simplest mental model:

* **Managed** is the right default. Most teams just want charts on their phones — it doesn't matter that the sender header says "Chartcastr". You'd never set up Twilio or Meta Business Manager just to text yourself.
* **Branded** is for when your *customer* gets the message. Agencies sending client KPIs, SaaS sending account dashboards to enterprise buyers, any context where seeing "Chartcastr" in the header would feel off-brand. Worth the setup time when the recipient is paying attention to who sent it.

## Quick start — Managed

<Steps>
  <Step title="Enable in Chartcastr">
    Settings → **Destinations → WhatsApp → Connect → Enable managed WhatsApp**. No credentials, no Meta Developer account. One click.
  </Step>

  <Step title="Invite a recipient (reverse opt-in)">
    In the same dialog: **Add recipient** → set an optional label (e.g. "Sarah — CFO") → **Generate invite**. You'll see a QR code and a `wa.me/...` link with a prefilled "verify WA-XXXXXXXX" message.

    * **For your own phone**: scan the QR code with your phone — WhatsApp opens with the message ready to send. Tap send. Done.
    * **For a teammate**: share the link via Slack, email, or paste the prefilled message. They tap it, hit send from their own WhatsApp, and they're added.

    Chartcastr never messages a phone before that phone messages us — the inbound message is the consent record Meta wants on file, and it eliminates the abuse vector of typing in someone else's number.
  </Step>

  <Step title="(Optional) Link a group chat">
    Add Chartcastr's WhatsApp number to a group → from inside the group, send `chartcastr link` from a phone you've already verified. The group appears in your destination picker.

    <Note>WhatsApp group delivery is still in limited beta with Meta. We record linked groups now and switch deliveries on automatically once Meta enables group send.</Note>
  </Step>

  <Step title="Create a connection">
    Create a connection from any data source (Google Sheets, HubSpot, etc.) → pick the verified WhatsApp number or group → set a schedule. Done.
  </Step>
</Steps>

### Recipient confirmation notifications

When a teammate self-adds via your invite link, Chartcastr can let you know through three channels — toggle each from **Settings → WhatsApp → Settings tab → Recipient confirmation notifications**:

* **In-app** *(default on)* — toast + new row in the recipients list.
* **Email** *(default on)* — email to the admin who created the invite.
* **WhatsApp DM** *(default off)* — Chartcastr WhatsApps you on your own verified number. Useful for one-person teams; requires you to have completed your own invite first.

## Branded — talk to us

Charts delivered from **your** company's number, with **your** verified business name in the header. The setup we drive for you:

1. **Discovery (\~30 min)** — we ask about your volume, regions, message use case, and existing Meta Business assets. Drives whether you bring a number or we buy one for you.
2. **Meta Business verification** — your business gets verified inside Meta Business Manager (if it isn't already). Required for the WABA.
3. **Phone provisioning** — usually a US Twilio number (\$1.15/mo) gets verified into your new WABA, but you can bring an existing number too.
4. **System User token + handover** — we set up the long-lived API token, paste it into Chartcastr, and run an end-to-end test together.
5. **Templates** (later, if needed) — for sending outside the 24-hour customer-service window, we draft and submit utility templates to Meta for approval.

Pricing starts at **\$85/mo per account** and scales with volume + the number of Meta-side assets we maintain for you. Meta per-message fees are passed through at cost.

[Get in touch about Branded →](mailto:branded@chartcastr.com) — we usually respond within a business day. Or click **Get in touch** inside the in-app WhatsApp dialog and we'll spin up a thread.

## The 24-hour window rule

Meta only allows **free-form** business-initiated messages within 24 hours of the recipient's last inbound message.

* **Managed**: the reverse-opt-in invite tap counts as a customer-initiated message, which opens the window cleanly for the first deliveries. Subsequent replies and reactions on each pulse keep the window open indefinitely.
* **Branded**: same rule applies on your WABA. The first delivery to a brand-new recipient who's never messaged you needs an approved **Message Template** — we help you submit one during onboarding.

If a pulse fails with `error.code: 131051` or `131047`, the recipient is outside the 24-hour window. Have them text the business number once ("hi" works) to reopen it.

## Architecture

```
┌──────────────┐ chart.png + AI summary ┌────────────────────┐
│  Chartcastr  │ ─────────────────────▶│  WhatsApp Cloud    │
│  Pulse Run   │  POST /messages       │  API (graph.fb)    │
└──────────────┘                       └────────────────────┘
       ▲                                          │
       │ X-Hub-Signature-256                       │ wamid.*
       │ POST /webhook/integrations/whatsapp       ▼
       └────── inbound reply / reaction ── recipient phone
                                          OR group chat
```

* **Outbound**: image uploaded to `/{phoneNumberId}/media` → media ID sent in an `image` message with caption → long analysis sent as a `text` message with `context.message_id` referencing the image's `wamid` (renders as a thread).
* **Inbound**: Meta POSTs replies to `/webhook/integrations/whatsapp`. Three things happen:
  * Messages containing a `WA-XXXXXXXX` invite token consume the matching invite, capture the sender's phone as a verified Destination, and send a confirmation reply.
  * The literal token `chartcastr link` inside a group registers the group as a destination (group-id-keyed, scoped to the org of the verified sender — so no leaks across customers).
  * Replies and reactions on a delivered chart correlate to the pulse via `context.id = wamid` and trigger an AI follow-up reply.

## Supported sources

WhatsApp works with every Chartcastr data source.

<CardGroup cols={2}>
  <Card title="Google Sheets" icon="table" href="/integrations/sources/google-sheets">
    Send live KPIs to a co-founder's phone every morning.
  </Card>

  <Card title="Shopify" icon="bag-shopping" href="/integrations/sources/shopify">
    Daily revenue snapshots to your phone.
  </Card>

  <Card title="HubSpot" icon="chart-line" href="/integrations/sources/hubspot">
    Pipeline health pulses to the CRO.
  </Card>

  <Card title="Linear" icon="square-kanban" href="/integrations/sources/linear">
    Weekly velocity to the engineering lead.
  </Card>
</CardGroup>

## Limits and gotchas

* **Caption** capped at 1024 chars (Chartcastr trims with `…`).
* **Text body** (analysis) capped at 4096 chars.
* **Rate limits**: tier-based, starting at 1k unique recipients / 24h for an unverified business. Watch the [WABA quality rating](https://developers.facebook.com/docs/whatsapp/api/messages/message-templates/quality-rating).
* **Reactions** arrive as `type: reaction` events — Chartcastr treats them like a one-character reply.
* **Group send is gated on Meta** — schema and UX exist now; actual outbound to groups flips on automatically once Meta promotes group send out of limited beta.

## Troubleshooting

| Symptom                           | Likely cause                                                                                                          |
| --------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| `error.code: 131051` or `131047`  | Recipient is outside the 24-hour window. Have them message your business number, or use a template (Branded).         |
| `error.code: 190` (token expired) | **Branded only** — the System User token was revoked or expired. Ping us and we'll regenerate it in Business Manager. |
| Verification code doesn't arrive  | Confirm the number is on WhatsApp (the app is installed and registered). Try **Re-send code**.                        |
| Webhook never fires               | **Branded only** — subscribe the `messages` field on the WABA in **Configuration**, not just on the app.              |
| Image fails to send               | Make sure the chart URL is reachable; we fall back to `image.link` when the in-app media upload fails.                |

## Next Steps

* [Connect your first source](/quickstart)
* [Set a schedule](/admin/pulses)
* [Talk to us about Branded](mailto:branded@chartcastr.com)
