Skip to main content

Messenger

Facebook Messenger lets your business reach the ~1B monthly Messenger users from the same unified Orbit Messaging API used for SMS, WhatsApp, and email. Outbound replies are delivered through the Pages messaging surface; inbound user messages are POSTed to your webhook in real time.

Send a message

Capabilities

  • Text, media, files — text, image, video, audio, generic file attachments.
  • Buttonspostback, web_url, and phone_number button types via the structured-message body.
  • Generic templates — single + multi-card carousels with title, subtitle, image, and up to 3 buttons per card.
  • One-time notifications (OTN) — request and consume OTN tokens for a single follow-up outside the 24-hour window. Full lifecycle below.
  • Sender personas — named agent identities set from Settings → Channels → Messenger; a send with persona_id renders that identity to the recipient instead of the Page silhouette. Full walkthrough below.
  • Persistent menu + greeting text — configured directly through Meta’s Graph API against your connected Page. Orbit does not manage these from the dashboard.
  • Webhook events — see Inbound webhook envelope for the exact payload shapes.

What fires — and what does not

  • message.received fires for inbound text and attachment messages; message.sent, message.delivered, message.read, and message.failed cover the outbound lifecycle.
  • Postbacks (button taps) and referrals (m.me links, Click-to-Messenger ad clicks) are received and processed by Orbit but are not dispatched to your webhook, so do not build automations that expect a message.received event for them.
  • Opt-in plugin events update the recipient’s consent record server-side rather than firing a webhook.
  • Messenger reports delivery status to Orbit using the same status mapping as WhatsApp: message.sent fires when Meta accepts the outbound message, message.delivered when Meta confirms it reached the recipient’s device, and message.read when the recipient opens the conversation. Delivery receipts are relayed on this channel, so message.delivered can and does fire — treat it, not message.sent, as your delivery signal. message.failed reflects a delivery failure reported by Meta; inspect the accompanying error code and treat it as a genuine send failure.
When a flow must react to a button tap or an ad referral, do the reaction inside Orbit (flow or inbox automation), not in your webhook consumer.

Inbound webhook envelope

Every inbound user message POSTs one JSON object to your registered webhook endpoint. The envelope is the standard Orbit message envelope; scope handling to channel: "messenger". An inbound text message:
An inbound attachment message:
An opt-in plugin event (processed server-side, consent record updated — no outbound webhook is fired):
Two rules that keep integrators honest:
  • The sender’s PSID is what you send to. Capture message.from from this inbound event onto the contact — that value is the to of every outbound send.
  • Route control needs Orbit-side flows, not webhook filters. Postbacks and referrals arrive internally and are processed (button taps become an inbound message in the conversation timeline, ref parameters are attached to attribution), but they never leave Orbit’s envelope. Build reactions to them in flows, not in your webhook consumer.

Consume it — capture the PSID

Subscribe your endpoint to message.received and branch on channel: "messenger". The sender’s PSID sits in message.from — record it on your contact so every outbound send to that user can address them. Signature verification on the receiver is the same HMAC check used everywhere in Orbit; see Build your first webhook receiver for the full verifier.

Onboarding

The full ordering — OAuth, Page selection, webhook subscription, personas, token health — is in Messenger onboarding playbook. The steps below are the same flow condensed.
  1. From the dashboard, navigate to Channels → Messenger.
  2. Click Connect Page. Meta’s OAuth dialog requests pages_messaging and pages_show_list.
  3. Select the Page(s) you want to attach. Orbit subscribes the Page to webhooks automatically.

Required scopes

The OAuth dialog asks for two permissions, and both are required: If your company routes Meta app review through a central team, pre-approve both scopes before the first connect or the attach step stalls in Meta’s dialog.

Required roles

You must be an admin of the Facebook Page you are attaching. Meta’s Page-selection dialog only lists Pages the signed-in Meta user controls.

Token expiry — reconnect

Page access tokens issued through the long-lived OAuth window rotate roughly every 60 days, and can go stale earlier after a password change, Page-admin removal, or Meta app review. Orbit tracks the token’s remaining lifetime and marks it valid, expiring_soon (7 days or fewer left), or expired on your channel status. When the channel flips to expired — or when you intentionally rotate — do this:
  1. In Channels → Messenger, click Reconnect.
  2. Re-run Meta’s OAuth dialog with the same scopes as on the first connect.
  3. Re-select the same Page(s). Outbound sends resume immediately.
What changes after reconnect: the stored Page access token is replaced and the channel status returns to valid. The Channel status surface’s Reconnect action runs before expiring_soon becomes expired, so flows do not fall back to flat-out failed sends.

Limits

Personas

Each persona you create from Settings → Channels → Messenger is a Meta /me/personas object pinned to the connected Page: A send made with persona_id (the persona’s numeric Meta id, returned when you list personas) renders that persona’s name and avatar to the recipient instead of the default Page silhouette. Manage personas from the dashboard — create, list, and delete — and pass the returned id on your outbound sends. Skip personas for automation-only traffic; they exist for conversational inbox use.

One-Time Notification (OTN)

OTN is the single-message exception to a closed 24-hour window. The lifecycle is:
  1. Request the token. Send an OTN request message to the recipient inside an open window (messaging_type: RESPONSE or MESSAGE_TAG). Meta renders the prompt; the recipient’s tap attaches a token to their PSID.
  2. Spend the token. A subsequent send that references the token can go through even after the 24h window has closed — once. After that the token is consumed.
  3. Expiry. An unused token expires when Meta rotates it; always pair requests with a short window before you intend to spend.
Track token spend server-side in your integration — OTN is for a single follow-up, not a campaign batch. Continuous follow-up outside the window belongs to MESSAGE_TAG or HUMAN_AGENT.

Common errors

MESSAGE_SEND_FAILED variants

MESSAGE_SEND_FAILED bundles different upstream failures behind the same code. Check details.provider_message before deciding the recovery path.

Pricing

Messenger is always $0 on Orbit’s side. Because you connect your own Meta Page with your own credentials, Orbit hosts the integration but is not the provider of record — every Messenger message (inbound, outbound within the 24-hour window, MESSAGE_TAG, HUMAN_AGENT, and OTN) is free on the platform and never deducts from your wallet. Any charges for Messenger volume are billed by Meta directly to your Meta account under Meta’s own pricing, not through Orbit. See the pricing page.