Connect Meta Ads
Quick Reference
Inputs
A connected Shopify store, and a Meta login that already has access to the ad accounts you want to bring across.
Outputs
Daily campaign spend and performance filed against the Paid Social acquisition channel, backfilled roughly six months on the first sync and refreshed at least daily after that.
Outcomes
See what Paid Social customers actually cost, compare it against Paid Search on lifetime gross profit rather than CAC alone, and get told when the connection lapses instead of watching CAC drift down.
Connecting Meta Ads brings your Facebook and Instagram spend into MarginOS, where it meets the orders it produced. Until it is connected, every Paid Social customer looks free to acquire — and a channel that looks free always looks like your best one.
Connecting is two steps, not one: authorise with Meta, then choose which ad accounts to pull from. No spend arrives until you choose at least one account.
Before you start
- Connect Shopify first. Spend without orders cannot produce an acquisition cost — there is nothing to divide it by.
- Sign in with a Meta account that already has access to the ad accounts you want. MarginOS can only ever see what that login can see.
- The permission MarginOS asks for is read-only ad reporting. It is not a permission that can create, edit, pause or spend against a campaign — MarginOS could not change your advertising even if it tried.
- Do it from your own MarginOS login. When a MarginOS system administrator is viewing your workspace for support, the connect controls are hidden — nobody at MarginOS can attach an ad account to your workspace on your behalf.
How to connect
- Open Account Setup, go to the Integrations tab, and open the Meta Ads card. The panel is headed Meta Ads Configuration.
- Click Connect Meta Ads and approve the request in the Meta window that opens.
- The panel changes to Connected to Meta — Access valid until revoked. You are authorised; nothing is syncing yet.
- Under Available Accounts, every ad account your Meta login can reach is listed with its account number and its current Meta status. Click Connect on each one that belongs in your numbers.
- Each choice saves straight away and starts a sync. The account moves up into Active Connections.
There is no API key, app ID or token for you to generate, paste or keep safe. Authorisation happens inside Meta’s own consent flow, and MarginOS never sees your Meta password.
What MarginOS reads from Meta
| What it reads | What it is used for |
|---|---|
| Daily campaign spend | The cost side of CAC, payback and MER |
| Impressions, clicks and conversions | Comparing campaigns against each other in the Growth Engine |
| Campaign structure — objective, budget, bidding strategy, delivery status | Context for why a campaign costs what it costs, without you switching to Ads Manager |
| Ad account name, number and status | The account list, and knowing which accounts can be connected at all |
What happens to the spend once it lands
Meta Ads spend is filed against the Paid Social acquisition channel, where it meets the orders that attribution assigned to that same channel. That pairing is what makes channel LTGP:CAC answer a real question — whether Paid Social returns more gross profit over a customer’s life than it cost to buy them — instead of hiding inside a store-wide average.
Four behaviours are worth knowing up front:
- Meta spend arrives at campaign level, not product level. Meta reports what a campaign cost, not which SKU the money went to. MarginOS records it honestly as campaign spend rather than inventing a per-product split it has no evidence for. Product-level profitability stays driven by your order and cost data; Meta tells you what the acquisition cost.
- The first sync reaches back roughly six months. Payback and cohort measures are meaningless without history, so the opening pull is deliberately deep and slower than routine updates. You do not need to wait on the page.
- Later syncs re-read a recent window, not just the newest day. Meta restates recent spend and conversion counts after the fact, so MarginOS keeps re-reading the near past and lets those corrections land rather than freezing the first figure it saw.
- An archived or deleted campaign keeps the structure it had. Meta stops reporting a campaign’s objective, budget, schedule and bidding strategy once it is archived or deleted, while still reporting what that campaign spent. MarginOS reads that absence as unknown rather than as an answer, so the campaign keeps the details it last reported instead of gradually emptying out — its spend history stays readable months later, and alerts that depend on knowing what a campaign was for do not start firing on blanks. A campaign Meta is still reporting on updates normally, including clearing a field you have deliberately emptied.
After the first pull, connected accounts refresh on their own at least once a day. Sync Now, beside the Active Connections heading, forces an immediate refresh.
Reading the connection panel
The dot beside Active Connections reports the last sync: green for healthy, blue and pulsing while one is running, amber when some accounts succeeded and others did not, red when the last attempt failed. Last synced underneath tells you how current the spend behind your margins is.
Each account row carries the status Meta itself reports — Active, Disabled, Unsettled, Risk Review, Pending Settlement or Grace Period — alongside Synced or Error for the last pull. An account Meta has closed shows Cannot Connect in place of a Connect button: a closed account cannot report spend, so MarginOS will not pretend to sync it.
When the connection lapses
Meta authorisations are time-limited, and they can also be revoked from the Meta side — by a password change, a security review, or someone removing the app in Business Settings. When that happens MarginOS does not fail quietly. The connection is paused, the reason is shown on the panel, and an alert is raised telling you the ad spend behind your CAC has stopped updating.
This matters more than a normal integration outage. Spend that stops arriving does not read as an error in your dashboards — it reads as cheaper customers, because the cost side of the ratio simply stops growing while orders keep coming. That is why a lapsed Meta connection is treated as a data-integrity problem rather than a housekeeping one. Reconnecting through the same panel restores it, and the sync that follows fills in the gap rather than starting from the day you noticed.
Example
A brand connects two Meta ad accounts: the main trading account and an older one from a regional test.
The first sync brings back roughly six months of daily spend — say £62,000 across the window, against 1,550 first-time customers that attribution assigned to Paid Social. Paid Social CAC lands at £40, against £30 on Paid Search. On its own that reads as Meta being the worse channel.
It usually is not that simple. Once those customers’ lifetime gross profit is set against their acquisition cost, a £40 CAC buying customers who repeat can comfortably out-earn a £30 CAC buying customers who never come back. That comparison is the reason both connections are worth making: with only one platform connected, MarginOS can tell you what a channel costs, but not which channel you should be feeding.
Common questions
Can MarginOS change my campaigns or spend my budget?
No, and not merely as a policy. The permission requested is read-only ad reporting, which cannot create, edit, pause or spend against a campaign. MarginOS reads what your advertising cost and calculates from it.
I connected, but my spend is still zero.
Authorising Meta and choosing accounts are separate steps, and the second is the one people miss. Reopen the Meta Ads panel: if Active Connections reads “No active connections”, click Connect on the accounts you want under Available Accounts. Syncing starts immediately.
An account shows “Cannot Connect”.
Meta has closed or is closing that ad account, so it can no longer report spend. There is nothing to fix in MarginOS — a closed account has no further data to give. Connect the account that is actually running your advertising instead.
Why does one of my accounts say Unsettled or Risk Review?
That is Meta’s own status for the account, passed through unchanged rather than reinterpreted. It usually points at a billing or policy issue to resolve inside Meta. MarginOS will still sync what the account reports, but an account in that state may not be spending normally, so treat its numbers as a picture of a disrupted period rather than a typical one.
How often does spend refresh?
At least daily, unattended. Use Sync Now when you want an immediate refresh — after a launch, or when reconciling a figure against Ads Manager.
What happens if I disconnect?
Disconnecting removes the authorisation and stops all future syncing. Meta spend already synced stays in your history, so past periods keep reporting the CAC they actually earned rather than silently rewriting themselves. From the disconnection onwards, no new Paid Social spend arrives — so CAC for the current period will drift down and should not be trusted until you reconnect.
Do I need to reconnect periodically?
Occasionally, yes. Meta authorisations do not last forever and can also be revoked from Meta’s side. MarginOS tells you when it happens rather than leaving you to notice — see why MarginOS would rather flag a gap than fill it.
Related
- Connect Google Ads — the other half of the paid picture.
- Connect your Shopify store — the connection this one builds on.
- How MarginOS resolves blended CAC — what your ad spend becomes.
- How MarginOS assigns each order to a channel — the revenue side Paid Social spend is measured against.
- Read the Growth Engine — where campaign performance is compared.
About the author
Founder of MarginOS, a Profit & Inventory OS for Shopify DTC brands who live and die by margin. Previously 11 years at Google across Ads and Global Business Operations, building large-scale systems. Now focused on giving DTC operators true profit by product, channel, and customer after COGS, 3PL, shipping, returns, and fees, and on showing exactly how much to trust every number behind those decisions.
Read Aron's story