UgrĂĄs a tartalomhoz
← Back to the journal

Ads — Meta and Google in one console, and why we decided against TikTok

Meta + Google in one console, auto creative variants, merged dashboard. Why we said no to TikTok: audience overlap, creative cost, API instability.

Ads — Meta + Google in one console

The Nortinia Sales AI ads module started with a simple promise: the tenant should not have to manage two admin UIs — only one. Meta Business Manager and Google Ads use so many different concepts for the same thing (audience vs. segment, ad set vs. ad group, creative vs. asset) that our SMB customers lost the plot. We tried to unify it — this piece is about how far we got, and why we do not support TikTok Ads.

The unified campaign builder

The shared admin UI (sales-ai-admin / /campaigns/new) walks the tenant through one wizard:

  1. Objective — lead generation, retargeting, brand awareness, conversion
  2. Audience seed — from a lead bucket, CSV import, or lookalike
  3. Creative — one base creative (headline + body + image), from which the system auto-generates per-platform variants
  4. Budget — daily or total
  5. Schedule — start, end, time slots
  6. Tracking — pixel + UTM auto-configured

At the end, a review page shows what the campaign looks like on Meta and Google side by side. The tenant approves, and the two platform APIs receive a create-call simultaneously.

Per-platform creative variants

This was the most engineering-heavy part. Meta and Google accept different creative formats:

  • Meta Feed: 1:1, 1.91:1 or 4:5 image, max 125 characters of primary text
  • Meta Stories: 9:16, max 25 characters
  • Google Search: no image, 3 headlines (max 30 char), 2 descriptions (max 90 char)
  • Google Display: 1.91:1 or 1:1, max 90 char short headline, 90 char long headline, 90 char description
  • Google YouTube: 16:9 video or thumbnail

The tenant uploads one base creative (4:5 image + headline + body), and the system generates:

  • A Meta Feed variant (original 4:5 image)
  • A Meta Stories variant (4:5 → 9:16 crop, or LLM-rewritten short copy)
  • A Google Search variant (text only, LLM-split into 3 headlines and 2 descriptions)
  • A Google Display variant (image resized to 1.91:1 + LLM-rewritten copy)

Crop and copy rewriting use LLM assistance (gpt-4.1-mini), average cost 0.03 USD per campaign. The tenant can see and override every variant before publishing.

Conversion tracking

Pixel: Meta Pixel + Google Tag (gtag.js). Both go through a common wrapper that the tenant drops into the receiving storefront's _app.tsx. The wrapper:

  • Consolidates events (PageView, AddToCart, Purchase, Lead) onto a common API
  • Adds the tenant id and the campaign id
  • Posts to Meta and Google in parallel
  • Saves to the engine too, for audit

UTM: every campaign link is auto-tagged (utm_source, utm_medium, utm_campaign, utm_content). The landing page and checkout flow carry these forward, so conversions are attributable back to the campaign.

The merged dashboard

The tenant does not want to read two dashboards. The /campaigns/[id] page shows:

  • Spend: Meta + Google total, broken down by platform
  • Impressions: total, by platform
  • Clicks: total, CTR
  • Conversions: from the engine pixel events, with attribution
  • CPL / CPA: cost per lead, cost per acquisition
  • Lead-bucket distribution: the bucket split of leads that arrived from this campaign

Numbers refresh every 15 minutes (Meta Marketing API + Google Ads API polling). It is not real-time — the Meta API itself has a 15-minute lag, no point pretending it is faster.

Why we do not support TikTok Ads

30% of tenants asked. We looked, and chose not to build for three reasons:

1. Audience overlap with Meta. The B2B and B2C SMB audience largely overlaps with Meta. If you also run TikTok, you are not reaching new people — you are reaching the same ones at 2x cost. Retargeting in particular gets messy (duplicate impressions).

2. Creative cost explosion. TikTok's creative format is short-form video. That is not auto-generable from a 4:5 static image. A separate video-generation pipeline (Runway / Pika / in-house) would be needed — +0.5 USD per campaign on top, and quality is inconsistent.

3. API maturity. The TikTok Ads API in 2026 is still not stable. A breaking change a week, schema drifts, documentation lag. For our 14 tenants, two stably supported platforms beats three unstably supported ones.

Maybe in a year we look back and build it. Not now.

Numbers after six months

  • 127 active campaigns across 14 tenants
  • Average CPL B2B Meta: 8.40 EUR; B2B Google Search: 14.20 EUR
  • Average CPA (lead-to-customer): 285 EUR
  • 23% share of campaign-driven leads in the total lead volume

What we do not do

We do not auto-launch a campaign without approval. We do not dynamically adjust the budget with AI (we tried, it was too aggressive, manual control wins). We do not run political or restricted-category (health) campaigns — the wizard rejects them.

Let's talk about your project

Tell us what you are building — we will figure out how to help.

Ads — Meta and Google in one console, and why we decided against TikTok — Nortinia Journal | Nortinia