# Meta Ads spend and ROAS in Keel HQ for Shopify brands

> Connect Meta Ads to Keel HQ with read-only ads_read access. Ad performance syncs daily and monthly campaign spend feeds MER, blended ROAS and CM3.

Source: https://keelhq.io/integrations/meta-ads · Published 2026-10-27 · Last verified 2026-10-27

**TL;DR:** Keel HQ connects to Meta Ads through Facebook Login with a single read-only permission, ads_read. A daily pull imports ad performance for the Ads dashboard, and monthly campaign spend feeds blended ROAS, MER and the CM3 margin layer. Meta Ads is in a limited beta and isn't available to every workspace yet.

Ad spend is the number every margin layer past CM2 depends on. Keel HQ imports it directly from Meta, so [blended ROAS and MER](/features/profit) are computed from your Shopify revenue and the spend Meta reports, not a figure you type in.

**Limited beta** Meta Ads is not generally available yet. Until it opens up, the Ads dashboard and the ad-based figures stay empty for workspaces that haven't been given a connection.

## What syncs

**Ad performance, daily.** A pull at 10:00 UTC for every connected organization, covering through yesterday. Each day's rows are overwritten if the pull runs again, so a re-run never double-counts.

**Campaign spend, by month.** Spend, ROAS, conversions and reach per campaign, stored per calendar month.

**What it feeds.** Blended ROAS, MER and the CM3 margin layer on Overview, and the Ads dashboard.

**Read-only** Keel HQ requests `ads_read` and nothing else. It reads ad account insights; it can't create or edit anything in Meta.

## Connect Meta Ads

**Open Settings → Integrations**

Find the **Meta Ads** card. If your workspace isn't part of the beta yet, the card says connections aren't available.

**Connect**

Click **Connect**, and in Facebook Login for Business select the ad account Keel HQ should read. The card then shows the connected account id.

**Wait for the first pull**

Spend appears once the daily pull and monthly sync have run. Until then, an unknown spend reads as unknown, with a reason, never as $0.

**Open Ads**

Performance and scoring live on the Ads page. Blended ROAS and MER update on Overview.

## When something looks wrong

**Reconnect needed.** The Meta token expired or was revoked. The card says so, and imports resume after you connect again.

**This month's spend is partial.** A month synced before it ends is marked partial until the finalizing run.

**Spend shows as unknown.** Nothing has synced for that month yet. Keel HQ shows the reason instead of a zero.

## What this doesn't do

No campaign management: it doesn't create, pause or budget ads.

No daily campaign breakdown in the monthly spend figures; campaign spend is stored per calendar month.

Meta Ads is in a limited beta, so not every workspace can connect it yet.

Pair it with [Google Ads](/integrations/google-ads) for platform spend across both channels.

## FAQ

### Can Keel HQ change my ads or budgets?

No. The only permission it requests is ads_read, which lets it read ad account insights. It can't create, pause or edit campaigns, ads or budgets.

### How often does Meta Ads sync?

A daily pull at 10:00 UTC for every organization with an active connection, covering through yesterday. Monthly campaign spend is synced separately.

### Is Meta Ads available to every workspace?

Not yet. It's in a limited beta, and workspaces that don't have a connection can't start one until it opens up. The page for ad spend shows a clear reason, never a zero, when nothing has synced.

### Why did my connection stop?

Meta access tokens expire. The card warns before the expiry date, and asks you to reconnect when the token can no longer be used, so imports don't silently stop.

### What if I also run Google Ads?

Connect Google Ads too. Platform spend from both lands in the same Overview, blended ROAS and MER figures.

## Sources

- [Permissions reference (ads_read)](https://developers.facebook.com/docs/permissions), Meta for Developers (accessed 2026-10-27)
