Apps · Marketing

Paid ads

Two apps, one job: build a paid campaign in your workspace, push it to the ad platform, and get spend, clicks and conversions back where the rest of your numbers live. Social Ads runs Meta. Google Ads runs Google.

User guideApps › Paid ads

Two separate apps

Social Ads and Google Ads are two different apps. You install them separately, they have separate sidebar entries, separate campaigns and separate numbers. Installing one does not give you the other. This page covers both — Social Ads first, Google Ads second — but never mix them up in your head: a campaign built in one is invisible to the other.

AppWhereRuns on
Social Ads/social-adsMeta — Facebook and Instagram.
Google Ads/google-adsGoogle — Search, Display, YouTube and Performance Max.

Both live under the Marketing menu, and both are channel apps that Omni marketing pulls in when you install it. Unpaid posting to your own feeds is a third, separate app — Social media.

Audiences must be installed

Both ad apps require the Audiences app. It's what turns "the people who match this" into a list an ad platform can target, and the install will pull it in for you if it isn't there already.

What's true of both apps

  • A campaign is created paused. Launching pushes the campaign to the platform in a paused state. It only starts spending when you explicitly activate it. That's deliberate — you get to check the thing on the platform before money moves.
  • Building and launching are different permissions. Build ad campaigns lets someone draft; Launch ad campaigns lets them spend. Both are granted per person under Settings → Module Access — see Permissions.
  • Numbers arrive hourly. Neither platform pushes results at you; the workspace pulls a snapshot each hour and stores it. A campaign activated two minutes ago will read empty until the next pull.
  • Connections are set up once, by an administrator, on the Integrations page — see Integrations.

Social Ads — Meta (Facebook & Instagram)

Campaigns · Analytics · Pixel

The app has three surfaces: Campaigns (/social-ads), Analytics (/social-ads/analytics) and Pixel (/social-ads/pixel).

Connecting and finding your ad account

  1. Connect the Meta Ads card On the Integrations page, under Advertising, the card is Meta Ads — "Run paid Facebook & Instagram ad campaigns — uses your Meta connection. Requires an Ad Account." It rides the same Meta connection as messaging and page publishing, so connecting it doesn't undo either.
  2. Let it find your ad accounts Ad accounts are discovered when you connect. If one is missing — you were added to a new account, say — use Refresh ad accounts on the Meta Ads card.
  3. Check the composer can see it Open New campaign. If Ad account reads "No ad account — connect Meta Ads + refresh accounts on Integrations.", step 2 hasn't taken effect yet.
Meta must approve ad management before campaigns run live

Managing ads through a third-party app is something Meta reviews and grants. Until that's in place for your workspace you can connect, draft campaigns and save them, but a launch will not go through. Treat live Meta launching as gated, not as something you can switch on yourself.

Building a campaign

  1. Campaigns → New campaign
  2. Name it and pick an objective Campaign name, then Objective: Awareness, Traffic, Engagement, Leads, Sales or App promotion.
  3. Pick the ad account Ad account — required. You'll be told "Pick an ad account." if you try to save without one.
  4. Choose who sees it Audience (optional) lists your shared audiences. Leave it on Broad (no custom audience) to let the platform find people itself. Choosing an audience here is the whole of targeting as implemented — there is no age/geo/interest builder in the workspace; anything finer is done on Meta.
  5. Turn on where it runs Under Run on, enable Meta (FB + IG). At least one is required — "Enable at least one network."
  6. Write the creative Headline, Primary text, Call to action and Destination URL, plus Media → Add image / video.
  7. Or run your catalog instead Product catalog (Advantage+ dynamic ads) — "Renders each product from your connected Meta catalog as its own ad card. Pick a product set (All products = the whole synced catalog)." Leave it on None — standard link ad for a normal single-creative ad.
  8. Set budget and bidding Daily budget, Lifetime budget, Currency, and Bidding — Lowest cost, Cost cap, Bid cap or Target ROAS. Cost cap, Bid cap and Target ROAS also want a Bid / cost cap figure.
  9. Schedule (optional) A start time. As the hint says: "Leave empty to launch on demand. Campaigns are created paused — nothing spends until you activate them."
  10. Save draft Nothing has reached Meta yet.

Launching, activating, pausing

Launch now creates the campaign on Meta. It confirms first: "Create this campaign on the ad platform now? It will be created PAUSED — no spend until you activate it." Behind the scenes it builds the campaign, its ad set and its ad in order.

When it's up, Activate starts it — and warns you: "Activate this campaign? It will start spending against your budget." Pause stops it again. A campaign that has been launched is read-only in the composer.

StatusMeaning
DraftExists only in your workspace. Nothing on Meta.
ScheduledArmed to be created at its start time.
LaunchingBeing created on the platform right now.
ActiveLive and spending.
PausedOn the platform, not spending.
EndedFinished.
FailedThe platform rejected it. Open the campaign — Status shows the error per network.

Relaunching a campaign that's already on Meta won't duplicate it — a campaign that already has a remote id is skipped.

The lifetime-budget guardrail

As the Analytics page states: "Campaigns are auto-paused when lifetime spend reaches the lifetime budget." Filling in Lifetime budget is therefore a real brake, not just a label — leave it blank and nothing in the workspace will stop the campaign for you.

Where spend shows up

Analytics — "Spend, reach and conversions across your launched campaigns, polled hourly." It reports Spend, Impressions, Clicks, Conversions and Campaigns.

If it's empty you'll see "No launched campaigns with metrics yet. Launch + activate a campaign and check back after the next hourly poll." A campaign that is launched but still paused has, correctly, nothing to report.

The pixel: telling Meta what converted

Pixel — "Track conversions on your site and forward them to the ad platforms (Conversions API)." Conversions are forwarded server-side rather than from the visitor's browser.

  1. Switch it on Forward events to the Conversions API.
  2. Fill in the Meta side Meta Pixel ID and Meta Conversions API token — the field tells you where to get the token: "Paste the CAPI token from Meta Events Manager." An already-saved token shows as set; leave the box blank to keep it. Test event code (optional) is there for verifying in Meta's test tool.
  3. Save Save pixel settings.
  4. Put the snippet on your site Install snippet — add to your site gives you the tag to paste.
  5. Check it's arriving Recent events lists what's come in. "No events captured yet. Add the snippet to your site or fire a test event." means nothing has reached the workspace.

Retargeting audiences — your own links only

At the bottom of the Pixel page, Retargeting audiences builds a Meta audience "from people who opened one of your own public links. First-party only — no website URLs."

  1. Pick a public link The Public link dropdown lists your own public forms. There is no URL box anywhere, by design — you can only retarget traffic to links this workspace issued and you own. If it's empty: "No public forms yet — create a public form to retarget its openers."
  2. Set the window Opened in last (days). A live count of matchable openers appears underneath as you change it.
  3. Name it and create Audience name, then Create audience.
  4. Push it to Meta Pick the ad account on the row and press Sync to Meta. The row then shows its sync state, and any error if it didn't take.

Once synced, the audience is selectable in the composer's Audience dropdown like any other.

Google Ads — Search, Display, YouTube, Performance Max

Campaigns · Analytics · Audiences

A different app with its own surfaces: Campaigns (/google-ads), Analytics (/google-ads/analytics) and Audiences (/google-ads/audiences). It has no pixel page — Google conversions are tracked differently, see below.

Connecting and finding your account

  1. Connect the Google Ads card On the Integrations page the card is Google Ads — "Run paid Google Search, Display, YouTube & Performance Max campaigns — uses your Google connection. Requires a Google Ads account." It's a separate grant from Google sign-in, Gmail or Calendar; connecting it doesn't disturb those.
  2. Discover your accounts Back on Campaigns, press Refresh accounts. It reports "Discovered n Google Ads account(s)."
  3. If nothing appears You'll see "No Google Ads accounts yet. Connect Google (Ads) from Integrations, then Refresh accounts." — repeat step 1.
"Campaigns can be drafted but not launched"

The Campaigns page shows a banner when the Google Ads API developer token isn't configured for the platform. Everything up to launch works — you can build and save campaigns — but launching won't go through. This is platform-level configuration and Google's own approval process, not something you fix per campaign; talk to whoever administers your deployment. See Integrations.

Building a campaign

  1. Campaigns → New campaign
  2. Name and account Name (required — "Give the campaign a name.") and Google Ads account (required to launch — "Pick a Google Ads account first.").
  3. Pick the channel Channel offers SEARCH, DISPLAY, VIDEO and PERFORMANCE_MAX.
  4. Bidding and budget Bidding offers maximize_clicks, maximize_conversions, target_cpa, target_roas and manual_cpc. Then Daily budget and Lifetime budget (guardrail) — the second is the auto-stop, same idea as on the Meta side.
  5. Targeting Customer Match audience picks one of the lists you've synced on the Audiences page (see below), or None. That's the targeting the workspace controls; everything else is Google's own matching.
  6. Landing page and copy Final URL (landing page), then the responsive search ad itself: Headlines (up to 15) and Descriptions (up to 4), each added a line at a time with Add.
  7. Keywords Keywords — comma-separated.
  8. Save

Launching, activating, pausing

Launch confirms first: "Launch this campaign? It's created PAUSED on Google — no spend until you activate it." It then reports "Campaign launching (created paused on Google)." The launch builds the budget, the campaign, the ad group, the responsive search ad and the keywords in sequence, and attaches your Customer Match list if you picked one.

From the Campaigns list, each row has Launch, Pause, Activate and Delete. Activating is what starts spend. Once launched, the composer is read-only: "This campaign has been launched and can't be edited." Relaunching an already-launched campaign is skipped rather than duplicated.

Where spend shows up

Analytics — "Spend, clicks and conversions per campaign" — shows Impressions, Clicks, Conversions and Spend per campaign. If it's blank: "No metric snapshots yet — they're polled hourly once the campaign is active."

Customer Match audiences

Audiences — "Push your shared audiences to Google as Customer Match lists."

  1. Name the list Name.
  2. Pick the source Shared audience — one of your Audiences. Both are required: "Pick a name and a shared audience."
  3. Sync it Sync to Google. It reports "Synced n member(s) to Google Customer Match." and stamps Last synced on the row.

Contacts are matched by a one-way hash of their email — Google never receives the plain address. An empty list reads "No Customer Match audiences yet."

Conversions

Google conversions are reported server-side from what the workspace already knows: when a contact converts, the conversion is uploaded against the matching conversion action, keyed by a hash of their email. There's no browser tag and no cookie involved, which is why this app has no pixel page.

Who can do what

Both apps split building from spending, and both grant it per person under Settings → Module Access:

PermissionWithout it
Build ad campaignsSave is greyed out with a tooltip pointing at Settings → Module Access. The person can look, not draft.
Launch ad campaignsThe launch and activate buttons are replaced with "You don't have permission to launch campaigns." Exactly what you want for someone who plans campaigns but shouldn't commit budget.

Because launching is real money, give Launch ad campaigns to as few people as the work allows. More on how grants work: Permissions.

How ads fit with the rest of marketing

  • Audiences are the shared source of targeting for both apps — Audiences.
  • Automations and journeys can launch, pause, resume and (for Meta) adjust the budget of a campaign you've already drafted, and can record a conversion. They never invent spend, creative or destination URLs — a campaign has to exist as a draft first. See Campaign lifecycle.
  • Cross-channel reporting rolls both ad apps up alongside your other channels in Omni marketing.
  • Unpaid posting to your own Facebook, Instagram, LinkedIn and X feeds is the separate Social media app.

When something goes wrong

What you seeWhat it means
No ad networks connected. Connect Meta Ads on the Integrations page first. Social Ads has no usable connection. Connect the Meta Ads card — Integrations.
No ad account — connect Meta Ads + refresh accounts on Integrations. The connection exists but no ad account has been discovered. Use Refresh ad accounts on the Meta Ads card.
No Google Ads accounts yet… Same situation on the Google side. Connect the Google Ads card, then press Refresh accounts.
Campaigns can be drafted but not launched (Google banner) Platform-level Google Ads API configuration is missing. Drafting works; launching won't until it's in place.
A LinkedIn or X ad target fails on launch Only Meta is supported for paid campaigns today — the launch says so explicitly. Use Meta, or run those networks organically via Social media.
Campaign status is Failed The platform rejected it. Open the campaign and read Status — the error is shown against the network that refused it.
Analytics is empty on a launched campaign Either it's launched but still paused (nothing has spent), or the hourly pull hasn't run since it went live.
A campaign paused itself Lifetime spend reached the lifetime budget. Raise the lifetime budget and activate again if that's what you want.