Skip to main content

Meta Ads - Feature request: Facebook Login for Business (system-user tokens) for Meta connections

Ask

Let the Meta connect dialog run through Facebook Login for Business (FLB) with a login configuration minting a Business Integration System User token, instead of classic login with a personal user token.

Scope: our use is purely ads operations — campaign/ad-set/ad launch and management, structure + insights sync, Page-published ads, lead retrieval. No organic/posting.

Needed permissions: ads_management, ads_read, pages_manage_ads, pages_show_list, business_management, leads_retrieval.

Why

  1. Employee turnover. The token belongs to whoever clicked "connect". They leave, get removed from the BM, or hit a password/2FA reset → sync and campaign management die while spend runs blind. A system-user token is installed into the business portfolio and survives staffing changes.

  2. Personal-profile restrictions hit the business. Meta checkpoints/restricts personal profiles on personal signals (new device, ID verification, false positives). Acting through that profile's token makes personal risk the business's outage: live campaigns can't be paused or fixed. We built restriction detection + a guided re-verify flow because this recurs. With FLB the acting identity is the app's system user in the client's portfolio; API volume also attributes to the integration, not a person.

  3. Multi-business isolation. One person often sits in 5+ Business Managers. Classic login stores grants per user + app: reconnecting client A silently rewrites the grant set for clients B–E (latest dialog wins — we run a fleet-wide health sweep to catch this), the token sees everything the person sees, and Page grants accumulate across all their clients. FLB grants are per business, picked in the dialog: per-client installations with their own asset lists, a real permission boundary, and per-business revocation from the client's own Business Settings.

FB API level

  • App must be Business-type; create an FLB Login Configuration (token type: Business Integration System User; permission set above) in the App Dashboard.

  • Dialog uses config_id instead of scope:

https://www.facebook.com/{api-version}/dialog/oauth
  ?client_id={APP_ID}
  &config_id={LOGIN_CONFIGURATION_ID}
  &redirect_uri={REDIRECT}
  &response_type=code
  &state={STATE}
  • Business + asset (ad account, Page) selection is native to the FLB dialog.

  • Token exchange is the same GET /oauth/access_token, but don't hard-require fb_exchange_token — system-user tokens are already long-lived and Meta rejects re-exchange; keep the initial token on rejection. (Verified live in our prior direct integration.)

  • Discovery changes: /me is the system user, so /me/businesses returns []. Enumerate grants on the token: GET /me/adaccounts?fields=id,name,currency,business{id,name} (each account tagged with its owning BM); Pages likewise enumerate on the token.

  • One-time app prerequisites: Advanced Access via App Review for the business permissions + a Data Deletion callback. FLB apps have reduced ongoing-review requirements.

Product asks

  • Connect flow driven by an FLB config_id for the ads surface (per-workspace opt-in fine; posting can stay on classic login).

  • Discovery/health endpoints that work on system-user tokens (no /me/businesses, no personal profile), token type surfaced so non-expiring tokens skip reconnect nagging.

  • Migration: re-connect on an existing profile swaps the token in place, keeping scoped ad accounts and synced history.

References

  • FLB: https://developers.facebook.com/docs/facebook-login/facebook-login-for-business

  • Business Integration System User tokens: same doc, "Access token types"

  • Data Deletion callback: https://developers.facebook.com/docs/development/create-an-app/app-dashboard/data-deletion-callback

Status: Completed1 comment

Log in to comment and vote

Comments1

  • Miquel Palet López

    Team•

    Sep 10

    Shipped and live. Thank you for the write-up, it was accurate enough that we built straight from it, including the two traps you flagged.

    How to use it. Add loginMode=business to the existing ads connect call:

    GET /v1/connect/facebook/ads?profileId={id}&loginMode=business

    The default stays classic, so nothing changes for existing integrations. It is also available on /v1/connect/instagram/ads. Business and asset selection happen in Meta's dialog as you described. The dashboard now offers the same choice, so non-API users can pick it too.

    Your four product asks:

    • FLB config_id for the ads surface, opt-in. Done, as above.

    • Discovery that works on system-user tokens. Done. We enumerate grants on the token rather than calling /me/businesses, which returns an empty list exactly as you said.

    • Token type surfaced so non-expiring tokens skip reconnect nagging. Done. GET /v1/accounts reports tokenType: system-user, plus businessId, businessIds, grantedAdAccountIds and adAccountBusinesses mapping each ad account to its owning business. No tokenExpiresAt is set when Meta omits an expiry.

    • Migration keeps scoped ad accounts. Done. Reconnecting the same business identity preserves the existing ad-account scope unless you explicitly replace it.

    We also took your warning about fb_exchange_token: we never re-exchange a system-user token and keep the initial one.

    One thing worth knowing. Meta requires a Page to create ads, so the login configuration asks for one. If you grant several Pages, API callers pass pageId and the dashboard shows a picker; if you grant exactly one, it is selected automatically.

    Verified live today: five separate business portfolios connected successfully, each landing a non-expiring system-user token with a business-namespaced identity and its granted ad account.