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.
- Buttons —
postback,web_url, andphone_numberbutton 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_idrenders 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.receivedfires for inbound text and attachment messages;message.sent,message.delivered,message.read, andmessage.failedcover 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.receivedevent 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.sentfires when Meta accepts the outbound message,message.deliveredwhen Meta confirms it reached the recipient’s device, andmessage.readwhen the recipient opens the conversation. Delivery receipts are relayed on this channel, somessage.deliveredcan and does fire — treat it, notmessage.sent, as your delivery signal.message.failedreflects a delivery failure reported by Meta; inspect the accompanying error code and treat it as a genuine send failure.
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 tochannel: "messenger".
An inbound text message:
- The sender’s PSID is what you send to. Capture
message.fromfrom this inbound event onto the contact — that value is thetoof 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,
refparameters 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 tomessage.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.- From the dashboard, navigate to Channels → Messenger.
- Click Connect Page. Meta’s OAuth dialog requests
pages_messagingandpages_show_list. - 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 itvalid, 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:
- In Channels → Messenger, click Reconnect.
- Re-run Meta’s OAuth dialog with the same scopes as on the first connect.
- Re-select the same Page(s). Outbound sends resume immediately.
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:- Request the token. Send an OTN request message to the recipient inside an open window (
messaging_type: RESPONSEorMESSAGE_TAG). Meta renders the prompt; the recipient’s tap attaches a token to their PSID. - 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.
- Expiry. An unused token expires when Meta rotates it; always pair requests with a short window before you intend to spend.
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.