Instagram Onboarding Playbook
This guide walks you from an empty Instagram channel to a working setup — connect, verify, send your first reply, and handle the window rules and errors that trip up first-timers. It complements the Instagram channel page, which is the API reference; this guide is the ordered path you follow the first time, and re-run whenever you attach an additional Instagram account. There is no Meta app review to wait on and no registration cycle. The only hard gates are that the Instagram account is a Business or Creator account and that it is linked to a Facebook Page you administer — Meta enforces both, not Orbit.1. Prerequisites
Before you open the dashboard, confirm:- An Instagram Business or Creator account. Personal profiles cannot be connected — Meta rejects their messages. Convert in the Instagram app under Settings → Account type if the profile is still personal.
- A Facebook Page linked to that Instagram account, with your Facebook user as a Page admin. The link lives in the Instagram app under Settings → Linked accounts → Facebook. Meta’s OAuth dialog only lists accounts reachable through Pages you control; an unlinked Instagram account never appears.
- A Meta Business Manager account at business.facebook.com, if your org centralises Meta assets there. Not strictly required for a single brand, but most portfolio setups run through it.
- A dashboard role that can connect channels. The user running Connect must hold a role with channel-connect permission (Owner or Admin by default) — an agent or billing-only role will not see the Connect button.
2. Connect Instagram in Orbit
Do this once per Instagram account. One Orbit account can carry several connected accounts (regional brands, sub-brands); repeat these steps for each, and each shows up as its own channel entry.- In the dashboard, go to Channels → Instagram.
- Click Connect Instagram. Meta’s OAuth dialog opens and requests four scopes:
instagram_basic,instagram_manage_messages,pages_messaging, andpages_show_list.instagram_basicidentifies the professional account itself;instagram_manage_messagesis the send/receive grant; the twopages_*scopes exist because Instagram messaging is delivered through Page-level plumbing.
- Select the Instagram Business / Creator account to attach. If several Pages are linked, pick the account tied to the right Page.
- Orbit subscribes the webhook automatically — the inbound callback is registered for you and points at Orbit’s inbound endpoint. You do not wire anything by hand in Meta’s app dashboard.
- The new channel entry appears under Channels → Instagram with the connected account’s handle. If more than one account is attached, sends address whichever account owns the conversation — the connected sender is resolved from your API key, not a
fromfield.
3. Verify the connection and the inbound webhook
Confirm inbound delivery before you build on the channel — a connect that never pushes an inbound event usually means the wrong account got linked.- From a personal Instagram account, send a DM to the connected business account. The inbound event fires as
message.receivedon your registered webhook endpoint and the message lands in the Inbox with the sender’s Instagram-scoped ID attached to the contact. - Send a story mention (tag the account in a story) and a story reply from the same personal account. Both arrive as
message.receivedas well — a mention carriesmetadata.story_mention.url; a reply carriesmetadata.story_reply(urland/orid). - If you filter on quick replies later, tap a quick-reply button in a thread where one was presented — the tap arrives as
message.receivedwithquick_reply.payloadpopulated.
- The sender’s IGSID is what you send to. Capture
message.from(the Instagram-scoped ID) from this inbound event onto the contact — that value is thetoof every outbound send. - Signature scheme. Instagram webhooks are signed with Meta’s
X-Hub-Signature-256header (the same HMAC scheme as WhatsApp), not the Standard Webhooks scheme Orbit uses for its own outbound webhooks. Verify per the channel page’s signature section before trusting the body.
4. Send your first outbound message
Inside the 24-hour window, a reply is a single call:queued response means Orbit accepted the send; delivery itself is reported by the webhook lifecycle on the channel page.
Window rules
Themessaging_type field is not decoration — Meta enforces it, and misuse is the single most common Instagram send failure:
Rule of thumb: work inside
RESPONSE whenever you can. When a reply slips past 24 hours, wait for re-engagement (re-opens the window) or switch to MESSAGE_TAG with a genuinely transactional tag — do not retry the same call and expect the window to ignore you. HUMAN_AGENT extends the reply window to seven days for human support, and is worth naming when you design an inbox SLA.
5. Handle media and quick-reply postbacks
Outbound media goes through theattachment field instead of text:
attachment.type is one of image, audio, video, file; the URL must be publicly fetchable by Meta. For a structured carousel, Orbit supports the generic template via two metadata keys — template_type: generic and a JSON-encoded elements string. The exact shape (and the fallback to plain text when elements is malformed) is on the channel page.
Inbound, media and story interactions arrive as the same message.received event family, and quick-reply taps surface as postbacks with quick_reply.payload set — branch on that payload in your webhook consumer or in an inbox automation flow. Attaching quick-reply buttons to outbound DMs is not currently supported by the send API; quick replies you react to originate from flows you run behind Meta surfaces you already expose.
6. Common errors and fixes
The send API returns one of threeerror.code values; MESSAGE_SEND_FAILED is the umbrella under which Meta-side rejections hide, with upstream detail in details.provider_status.
INVALID_RECIPIENT(422) — thetofield was missing or empty, or treated a username/phone number as a recipient.tomust be the Instagram-scoped ID captured from an inboundmessage.received; store it on the contact at the moment it arrives. A first-sendINVALID_RECIPIENTalmost always means the capture step was skipped and a placeholder was sent instead.- Unlinked Page / non-professional account (
MESSAGE_SEND_FAILED) — the Instagram account was never linked to the Facebook Page, so Meta cannot route its messages; or the account is still a personal profile. Link the account under Instagram Settings → Linked accounts, convert it to Business or Creator, then reconnect from Channels → Instagram → Reconnect. - Insufficient scopes (
MESSAGE_SEND_FAILED) — one of the four OAuth scopes was declined during Connect, so Orbit cannot send or receive on the account’s behalf. Reconnect and acceptinstagram_basic,instagram_manage_messages,pages_messaging, andpages_show_listin full. - Expired page token (
MESSAGE_SEND_FAILEDwith a 401-classprovider_status) — Meta rotated the token. Reconnect from Channels → Instagram → Reconnect; no other side of the integration needs to change. - Window closed (
MESSAGE_SEND_FAILED) — aRESPONSE/UPDATEmore than 24h after the last inbound, or aMESSAGE_TAGwithout an approvedtag. Send with a valid tag for transactional traffic, or wait for re-engagement. RATE_LIMIT_EXCEEDED(429) — the send would exceed the per-tenant hourly Instagram quota (200/hour by default, matching Meta’s current cap per account). Back off and retry later; for planned batches, use the campaigns API, which paces sends, rather than a tight single-message loop.
7. Pricing
Instagram messaging follows Meta’s per-conversation pricing tiers — conversations are metered by Meta, and Orbit bills pass-through on the same model. International destinations vary; the dashboard shows the exact rate per destination before send. Public starter rates are on the pricing page.Where to go next
- Instagram channel page — full API reference: generic templates, signature verification, rate limits, error tables.
- Send and receive messages — the cross-channel send pattern once you run more than one channel.
- Inbox setup — route inbound Instagram traffic to your team.
- Messenger onboarding — the parallel playbook if you also attach the brand’s Facebook Page.
- Best practices — platform-wide sending hygiene.