KAWADER × META · INTEGRATION GUIDE & PITCH

Connecting Claude to the entire Meta business surface — Pixel, Catalog, Ads, Pages, Instagram, WhatsApp, Threads.

A single, opinionated plan to put every Meta API on tap from Claude Code, plug Kawader's existing AI tools (Sparkling, the WhatsApp bot, Gear Insights, Odoo) into the same nerve, and unlock attribution, automation, and content velocity that until now lived behind login walls.

Compiled · 2026‑05‑08 For · Kawader Art Productions & Film Services By · Claude (KAWASIST workspace) Graph API · v25.0 Status · Pre‑provisioning
14APIs
Meta Surfaces Mapped
29tools
Official Meta MCP (live)
5phases
Sequenced Rollout
~3weeks
To Full Production
01 · The Pitch

Why connect Claude to Meta now?

Kawader already operates inside Meta every single day — the Facebook Page, Instagram Business account, WhatsApp customer chats, ad campaigns through Supernova, and a rental catalog that lives on kawader‑cine.com. None of that is reachable from code. Every dashboard reading, audience export, content publish, and conversion event is manual or opaque. This guide closes the gap.

Where the operation hurts today

  • Zero attribution loop — Supernova's ads drive traffic, but kawader‑cine.com has no Pixel and no Conversions API. We don't know which ad turned into a rental.
  • No catalog in Meta Commerce — Instagram Shopping tags, Click‑to‑WhatsApp catalog, and Dynamic Product Ads are all locked off because Meta doesn't have our 367‑product catalog.
  • Posting is manual — every IG post, every Page update, every Threads share is hand‑typed in Meta Business Suite. Sparkling Haven produces Reels but a human still uploads them.
  • Insights live in dashboards — campaign performance, audience growth, lead quality — all readable only if a human logs in and stares at a screen.
  • WhatsApp is split‑brain — Baileys handles Ameer's personal inbox brilliantly. But templates, in‑chat catalog, Click‑to‑WhatsApp ads, and structured Flows (booking forms) are impossible on Baileys. They need Cloud API.

Where the wind is at our back

  • Meta launched an official Ads MCP for Claude on April 29 2026. 29 tools, OAuth, zero infrastructure. The single biggest leverage point in this plan.
  • Graph API v25.0 (Feb 2026) is stable and well‑documented; the facebook-business SDK matches it 1:1.
  • The injection pattern already exists — 17 JS modules ship to kawader‑cine.com via ir.ui.view → website.layout. Pixel is a 18th module on the same rail.
  • The data is already structured — Odoo product templates, the rental master sheet, and exports for the WhatsApp bot are all clean enough to remix into a Meta Commerce feed.
  • The team already pays for Meta — the BM, Pages, IG, ad account, WABA are live. We're not buying anything new. We're activating what we already own.
The thesis in one line: Build a thin Python layer (tools/meta/) that wraps Graph API v25, plug it into Claude's tool use, adopt the official Meta Ads MCP for ad operations, and route every Kawader AI tool's output through this layer. Meta's data becomes a readable, writeable surface — the same way Odoo and Notion already are.
02 · Landscape

The Meta ecosystem at a glance

Meta is not one API; it's a constellation. Everything routes through Graph API v25.0 at graph.facebook.com/v25.0/ (Threads has its own host). Below is every surface relevant to Kawader, with Kawader's current position on each.

Meta Pixel
Browser tracking snippet, fbq() events.
Not installed
Conversions API
Server‑side mirror of Pixel events for ad‑block resilience.
Not installed
Commerce Catalog
Product feed → IG Shopping, Dynamic Ads, WA in‑chat catalog.
Not connected
f
Pages API
FB Page posts, photos, scheduling, insights.
Page exists, no API
Instagram Graph API
Feed, Reels, Stories, carousels via container→publish.
Account exists, no API
Marketing API
Campaign / AdSet / Ad CRUD, Insights, Audiences.
Supernova owns; we read
Custom Audiences
SHA‑256 hashed contact upload, lookalikes.
Not synced
Lead Ads API
Webhook from form submissions, retrieval by leadgen_id.
Not subscribed
WhatsApp Cloud API
Templates, in‑chat catalog, business profile, CTWA attribution.
Baileys only today
WhatsApp Flows
Server‑driven multi‑screen forms inside chat.
Cloud API required
Click‑to‑WhatsApp
Ads → WA chat with ad context payload (ctwa_clid).
Cloud API required
Threads API
Public since 2024; container→publish like IG.
No account yet?
Ad Library API
Public transparency — every active ad globally.
Not querying
Messenger Send API
Page inbox automation (24h window + tags).
Manual replies today
Business Mgmt API
System Users, asset assignments, partner sharing.
BM exists, no system user
Webhooks
Push events for every product (HMAC‑signed).
No subscriptions
Heads‑up on 2026 deprecations: Graph v19 sunsets 2026‑05‑21; v20 on 2026‑09‑24. Page Insights metrics page_impressions + page_fans retire 2026‑06‑15. Webhook mTLS CA cutover happens 2026‑03‑31. Build directly on v25 and pin the new CA, not legacy.
03 · Audit

Where Kawader stands today

A snapshot scan of the workspace shows n8n already ships Meta nodes (idle), Baileys is live but isolated, Supernova drives ads externally, and not a single line of code touches Graph API. The injection pattern for Pixel and the data path for Catalog already exist — the rails are laid, the trains aren't running.

SurfaceWhat existsGapStatus
Meta Pixel Nothing. No fbq on any page. Inject base snippet via website_configure.py as 18th JS module. Greenfield
Conversions API Nothing. No server‑side event sender. n8n webhook ⇄ Odoo automation rule on sale.order. Greenfield
Commerce Catalog Catalog data exists — tools/odoo/export_catalog_for_bot.py already pulls products. Odoo_Rental_Products_Master is canonical. New script tools/meta/catalog_export.py emits Meta‑shaped CSV; serve via Cloudflare Pages scheduled feed. Data ready
FB Page (kawaderart) Page is live and connected to BM. Footer link in website_configure.py. No System User token. No programmatic posting. UI‑only
Instagram Business Account is live, linked to FB Page. No instagram_content_publish scope; needs App Review. UI‑only
Marketing API Supernova/Naeem manages campaigns. outputs/meta_ad/ has 20+ creative batches built locally. Read‑only Insights pull is trivial; campaign CRUD stays with Supernova for now. External vendor
WhatsApp Baileys live on Hostinger VPS. wa-rental-bot PM2. Personal number. tools/whatsapp-bot/. Add Cloud API on a second business number for templates, catalog, CTWA, Flows. Keep Baileys for personal inbox. Half‑live
n8n nodes Facebook Graph API, FB Lead Ads, WhatsApp Cloud nodes shipped — but unused. Activate for Lead Ads webhook, CAPI relay, scheduled catalog refresh. Idle
Supernova creatives outputs/meta_ad/ — 20+ batch directories of static + animated creative. Push these into a Meta‑side ad_image library via Marketing API; tag campaigns by creative ID. Asset surplus
Threads Unknown — needs human check whether @kawaderart exists on Threads. Provision Threads account if not present; container→publish flow. Verify first
04 · Foundation

Auth, tokens, and Business Manager — the only step that's not code

Everything below this section is plumbing. This section is the keys to the building. Without a System User token issued by a Meta App attached to Kawader's Business Manager, nothing works. ~30 minutes in the Meta UI, one time, irreversible (you keep the BM forever).

1. Create Meta App
developers.facebook.com
2. Attach to Kawader BM
Business Settings → Apps
3. Create System User
"kawasist‑claude" · Admin role
6. Store in Keychain
security add‑generic‑password
5. Generate System User Token
12 scopes · long‑lived
4. Assign Assets
Page · IG · Pixel · Catalog · Ad Acct

Required token scopes

ScopePowersReview needed?
pages_show_listDiscover Pages owned by the user.Standard
pages_read_engagementRead Page Insights, posts, comments.Standard
pages_manage_postsPublish to Page; schedule posts.Advanced
pages_manage_metadataSubscribe Page to webhooks.Advanced
instagram_basicRead IG account info.Standard
instagram_content_publishPublish IG feed posts, Reels, Stories.Advanced
instagram_manage_insightsPull post‑level + account‑level IG insights.Advanced
ads_managementCreate/edit campaigns, ad sets, ads, creatives.Advanced
ads_readRead Insights only — safer if we just want reporting.Standard
business_managementManage assets in BM.Advanced
catalog_managementRead/write Commerce Catalog products.Advanced
whatsapp_business_messagingSend/receive on WhatsApp Cloud API.Advanced
whatsapp_business_managementManage WABA, templates, phone numbers.Advanced
leads_retrievalPull lead form submissions.Advanced
threads_basic + threads_content_publishRead/publish on Threads.Advanced
Standard vs. Advanced Access: Standard works on assets owned by your own BM, no review needed. Advanced is required for production use against any user/business. Practically: build everything in Development Mode (admins/devs/testers can use the app for free), only submit App Review when ready to go live with publishing scopes. The non‑publishing scopes (read insights, fetch leads, send CAPI events) work without review.

Token storage — three locations, one source of truth

macOS Keychain (canonical)
For local Claude tools. security add-generic-password -s meta_kawasist -a system_user -w <TOKEN>
n8n Credentials Store
For workflow nodes. Paste once into the Facebook Graph API credential. Never in workflow JSON.
Odoo (Pixel ID only)
Pixel ID is public‑by‑design — embedded in browser source on every Meta‑tracked site. Goes inline next to social links.
05 · Foundation Pillar

Pillars — eight tracks, four priority tiers

From here through section 11, each pillar is a track of work. Priority tier is encoded in the badge: P1 ship first = highest leverage / lowest risk; P4 later = ship after foundations are stable.

01

Pixel + Conversions API P1 · Ship first

Browser fbq events fire on the website; the same events also fire server‑side via Conversions API. Meta dedupes them on a shared event_id. Result: ad attribution that survives ATT, ad blockers, and cookieless browsers. Without this, every dollar Supernova spends is unattributed.

The dedup flow

User on /shop/sony‑fx3
fbq('track', 'ViewContent', {event_id})
Meta Pixel
↑↓ same event_id
Odoo automation
n8n CAPI bridge
CAPI endpoint
Meta dedupes

Events to fire

EventWhereJS ModuleCAPI?
ViewContentProduct page loadbrand/js/product-detail.js (new)Optional
AddToCart"Add to List" successbrand/js/rent-now-btn.js (extend)Yes
ViewCartCart drawer opens / cart pagebrand/js/cart-float.js (extend)No
InitiateCheckout/shop/checkout loadbrand/js/checkout-pixel.js (new)Yes
Purchase/shop/confirmationbrand/js/purchase-pixel.js (new)Yes (priority)
LeadContact form submitbrand/js/address-submit.js (extend)Yes

CAPI request shape

curl -X POST "https://graph.facebook.com/v25.0/$PIXEL_ID/events" \
  -H "Content-Type: application/json" \
  -d '{
    "data":[{
      "event_name":"Purchase",
      "event_time": 1715000000,
      "event_id":"ord_2026_05_08_8347",
      "action_source":"website",
      "event_source_url":"https://www.kawader-cine.com/shop/confirmation",
      "user_data":{
        "em":["<sha256(email)>"],
        "ph":["<sha256(+970...)>"],
        "fbc":"fb.1.<ts>.<fbclid>",
        "fbp":"fb.1.<ts>.<random>",
        "client_user_agent":"...",
        "client_ip_address":"..."
      },
      "custom_data":{
        "value": 450.00, "currency":"ILS",
        "content_ids":["TEMPL_457"], "content_type":"product",
        "order_id":"S00857"
      }
    }],
    "test_event_code":"TEST12345"
  }' \
  -H "Authorization: Bearer $CAPI_TOKEN"
Verification: Open Pixel Helper Chrome extension on the site → see "1 pixel, N events". Open Events Manager → Test Events tab → events appear with both "browser" and "server" markers and matched. Event Match Quality (EMQ) score climbs to ≥6/10 after a day of real traffic.
02

Commerce Catalog Feed P1 · High leverage

Push the 367 published, rentable Odoo products into a Meta Commerce Catalog. Once in, products tag in IG posts and Reels (Instagram Shopping), appear inside WhatsApp chats as carousels, and become eligible for Dynamic Product Ads — Meta auto‑generates ad creative per product based on user intent.

Two methods, both supported

Method A · Scheduled Feed (recommended for v1)

Meta polls a hosted CSV every N hours. Simplest model — error reports surface in Commerce Manager UI. Host on Cloudflare Pages at kawasist-internal.pages.dev/meta-catalog/feed.csv.

Method B · Items Batch API

Push diffs in real time via POST /{CATALOG_ID}/items_batch. Better when rentals turn over fast. Defer to v2 unless we hit feed‑lag pain.

Field mapping (Odoo → Meta Commerce)

Meta columnRequiredOdoo sourceTransform
idYesdefault_codetemplate_<id>Stable across feed runs
titleYesnameUTF‑8, ≤150 chars
descriptionYesdescription_saleHTML strip → plain text
availabilityYesqty_available>0 → "in stock" else "out of stock"
conditionYesConstant "new" (rental gear)
priceYeslist_priceFormat "450.00 ILS"
linkYesComputedhttps://www.kawader-cine.com/shop/{id}
image_linkYesOdoo image APIhttps://www.kawader-cine.com/web/image/product.template/{id}/image_1024
brandYesConstant"Kawader"
google_product_categoryRecommendedcateg_id.nameMap dict in script (Camera→1420, Audio→233, etc.)
item_group_idOptionalcateg_idGroup product variants under one parent

Filter rule

Pull only rent_ok=True AND website_published=True. This mirrors the existing filter in tools/odoo/export_catalog_for_bot.py — reuse that XML‑RPC connection helper rather than reimplementing.

03

Organic Posting — FB Page + Instagram + Threads P3 · After App Review

Meta gives a uniform two‑step "container → publish" pattern across IG and Threads. Page posts are simpler (one POST). Once wired, every Sparkling Reel, Gear Insights digest, IBNS BTS clip, and Gear Talk teaser ships with a single Claude command.

Instagram publish flow

Local mp4/jpg
e.g. Sparkling output
Upload to public CDN
Cloudflare R2 or Pages
POST /{ig_id}/media
→ creation_id
Poll status: FINISHED?
POST /{ig_id}/media_publish
creation_id
Live on @kawaderart

Variants supported

  • Feed image / video — single asset.
  • Reelsmedia_type=REELS + share_to_feed=true for double exposure.
  • Carousel — N child containers (max 10) → one parent container with children=[c1,c2,...].
  • Stories — needs business verification + Advanced access. Defer.

Rate limit

50 published posts per IG account per rolling 24h. Plenty for organic; keep ad‑creative pushes via Marketing API on the Ads track instead.

Threads — separate API, same shape

Threads runs at https://graph.threads.net/v1.0/ (NOT graph.facebook.com). Same container→publish dance. 250 posts per profile per 24h. Out of beta and publicly available since 2024. Useful for repurposing Gear Insights blurbs as text Threads, no extra creative cost.

04

Marketing API — Insights & Audiences P2 · After Pixel

Two halves: read (Insights — what's happening with Supernova's spend) and write (Custom Audiences — push Kawader's customer list back into Meta for retargeting + lookalikes). Insights is read‑only and trivial. Custom Audiences requires care because it's PII.

Insights — async report pattern

# 1. Submit
POST /v25.0/act_$AD_ACCOUNT_ID/insights
  fields=campaign_name,spend,impressions,clicks,ctr,actions,cost_per_action_type
  level=campaign
  time_range={"since":"2026-04-22","until":"2026-05-08"}
# → returns {report_run_id}

# 2. Poll
GET /v25.0/$REPORT_RUN_ID
# → {async_status: "Job Completed"}

# 3. Fetch
GET /v25.0/$REPORT_RUN_ID/insights

Custom Audiences — hashed contact upload

Kawader has a customer list in Odoo (res.partner). Hash emails (lowercase, trim, SHA‑256) and phones (E.164, SHA‑256), then push:

POST /v25.0/$CUSTOM_AUDIENCE_ID/users
{
  "schema": ["EMAIL_SHA256", "PHONE_SHA256"],
  "data": [
    ["abc123...", "def456..."],
    ["xyz789...", "uvw012..."]
  ]
}

Then Lookalike from that audience: POST /act_$ID/customaudiences {subtype:"LOOKALIKE", lookalike_spec:{ratio:0.01,country:"PS"}}. 1% lookalike = closest match. Useful for Supernova's targeting brief.

PII handling: Hashing happens locally in Python before POST — raw emails/phones never leave Kawader. Document this in the privacy notice on kawader‑cine.com (we'll need a small legal pass before going live with audience uploads).
05

WhatsApp Cloud API + Flows + Click‑to‑WhatsApp P1 · Biggest unlock

Today Baileys handles Ameer's personal inbox brilliantly with Gemini 2.5 Pro for Arabic, Odoo catalog awareness, and a 30‑turn memory. What Baileys cannot do: send approved templates without ban risk, serve in‑chat catalog cards, receive Click‑to‑WhatsApp ad attribution, run Flows (multi‑screen forms inside chat). Cloud API does all four.

The recommended split

CapabilityBaileys (today)Cloud API (to add)
Personal inbox triage with Gemini AILiveNot needed
Reply to incoming customer chatsLive
Send promotional templates (utility/marketing)Ban riskDesigned for this
Push catalog as in‑chat carouselImpossibleNative
Receive Click‑to‑WhatsApp ad attributionNo ctwa_clidFull ad context
Run interactive Flows (booking, lead form)ImpossibleServer‑driven
72‑hour free messaging post‑CTWA clickYes
Quality rating / template approvalN/ABuilt‑in

How they coexist: register a second Kawader business number in WABA for Cloud API. Baileys keeps Ameer's personal number. They never share a number. Routing logic in tools/whatsapp-bot/index.js already namespaces by JID, so the bot can stay phone‑number‑agnostic.

Send template message — basic shape

POST https://graph.facebook.com/v25.0/$PHONE_NUMBER_ID/messages
{
  "messaging_product": "whatsapp",
  "to": "970599xxxxxxx",
  "type": "template",
  "template": {
    "name": "rental_quote_ready",
    "language": {"code": "ar"},
    "components": [
      {"type":"body","parameters":[
        {"type":"text","text":"أمير"},
        {"type":"text","text":"سوني FX3"},
        {"type":"text","text":"٤٥٠ شيقل / يوم"}
      ]}
    ]
  }
}

WhatsApp Flows — the killer feature

Flows are server‑driven multi‑screen forms inside the chat. Imagine: customer taps a CTWA ad → drops into chat → bot sends a Flow with screens for "Pick your rental dates · Choose kit · Confirm address". Customer fills it out without ever leaving WhatsApp. No website redirect. Submission lands as a structured webhook payload Kawader can route into Odoo as a quote draft.

Flow templates Kawader should ship in v1:

  • Rental Quote Builder — date range + kit selection + delivery → Odoo sale.order draft.
  • Production Inquiry — project type, budget range, timeline → Notion task in HQ DB.
  • IBNS Casting Form — for episode‑specific casting calls.
Pricing 2026: Service messages and utility templates inside the 24‑hour customer service window are free. Marketing templates billed per delivered message by destination country (rates updated 2026‑01‑01). For Palestine/MENA volume, expect cents per template send.
06

Lead Ads → Custom Audience Loop P2 · Compounds with Pillar 4

Supernova runs Lead Ads (in‑Meta forms users fill without leaving the app). Today those leads arrive in Naeem's inbox, get forwarded, and drop. With the API: webhook fires → Kawader fetches full lead → routes to Odoo as a res.partner + a Notion task for follow‑up + adds them to a "Recent Leads" Custom Audience for retargeting + triggers a WhatsApp template within 1 hour.

User fills FB lead form
Meta webhook
leadgen_id
n8n endpoint
GET /v25/{leadgen_id}
→ field_data
Odoo: create res.partner
Notion: task in Sales DB
WA Cloud API: template "thanks_we_got_your_lead"
Add to "Recent Leads" custom audience
07

Ad Library — Competitive Intelligence P4 · Ongoing

Meta's Ad Library is fully public — every active and historical ad globally, queryable by API. Free.

For Kawader: weekly cron via Claude that pulls ads from competing rental houses (Cinerent, Camera House, Stash, etc.) + competing production companies, summarizes hooks/offers/creative trends, and posts a digest into Notion. Same script could compare Supernova's creative posture against the field.

GET /v25.0/ads_archive
  ?search_terms=cinema+rental
  &ad_reached_countries=['PS','JO','EG']
  &ad_active_status=ALL
  &fields=ad_creative_bodies,ad_creative_link_titles,page_name,ad_delivery_start_time,ad_snapshot_url
12 · Claude Native

The Claude layer — official MCP, community MCPs, and a thin wrapper

The thing that changed the calculus this year: Meta shipped an official Ads MCP server on April 29 2026. It's hosted at mcp.facebook.com/ads, OAuth, 29 tools, no infrastructure to run. For ad operations we adopt it directly. For everything else (Page posts, IG, WhatsApp, Catalog, CAPI), we build a thin local Python tool layer wrapping facebook-business==25.0.1, exposed to Claude via tool‑use. Custom MCP only if the wrapper grows beyond ~10 commands.

Recommended stack

LayerWhat it coversWhy this choice
Official Meta Ads MCP
mcp.facebook.com/ads
Campaigns, ad sets, ads, creatives, audiences, ad insights, account/page diagnostics. 29 tools. Maintained by Meta. OAuth UX. Read‑only / read‑write / financial scope tiers. Free.
Local tools/meta/
Python + facebook-business 25.0.1
Pixel/CAPI events, IG/Page/Threads publishing, Catalog feed export, Lead Ads retrieval, WA Cloud send. What the official MCP does NOT cover. Same auth (system user token). Exposed to Claude as tool‑use schemas.
n8n workflows
(idle nodes already shipped)
Cron jobs (catalog refresh), webhook receivers (Lead Ads, CAPI relay, Page subscriptions). Visual ops surface for things that should run unattended. Not for interactive Claude work.
Community MCPs (optional) WhatsApp Cloud (networkerman/whatsapp-cloud-api-mcp-server), IG (mcpware/instagram-mcp), FB Pages (HagaiHen/facebook-mcp-server). Adopt only if our wrapper is duplicating their work. Vet license + maintainer activity each time.

What the local tools/meta/ layer looks like

tools/meta/
  __init__.py
  auth.py             ← Keychain → System User token (single source)
  graph.py            ← thin Graph client (handles rate limits, retries)
  pixel.py            ← CAPI sender + dedup helper
  catalog.py          ← Odoo → Meta Commerce CSV exporter
  post_fb.py          ← FB Page posts: text/photo/video/scheduled
  post_ig.py          ← IG container→publish (feed/Reels/carousel)
  post_threads.py     ← Threads container→publish
  whatsapp.py         ← WA Cloud: templates, catalog cards, Flows trigger
  insights.py         ← Async insights report → markdown digest
  audiences.py        ← Custom Audience hashed upload + Lookalike create
  leads.py            ← Lead Ads webhook receiver + retrieval
  ad_library.py       ← Ad Library competitor crawler
  whoami.py           ← Token health check (debug_token)

Each module exposes a CLI (so Claude can call them via Bash) and a Python def main(**kwargs) that's wrapped as a Claude tool‑use schema in tools/meta/claude_tools.py. Same pattern as tools/odoo/.

Why not build our own MCP server? Because Meta already ships the highest‑value one (Ads). For the long tail, a local Python toolset wrapped as Claude tools is faster to iterate on, testable in‑repo, and doesn't require a second running process. Promote to a custom MCP only if 3+ sessions repeat the same wrapper boilerplate.
14 · Architecture

Reference architecture

Five layers, one data flow. Existing components in green, partial in gold, new in purple. The whole thing fits on a napkin.

User Surfaces
kawader‑cine.com
Odoo v18
WhatsApp Personal
Baileys, Hostinger VPS
WhatsApp Business
Cloud API · 2nd number
FB Page · IG · Threads
Account live, no API
Browser tracking
Meta Pixel
website.layout injection
17 JS modules
brand/js/, deployed
Server tracking + automations
tools/meta/pixel.py
CAPI sender
Odoo automation rules
sale.order state hooks
n8n on VPS
FB/WA nodes idle
n8n CAPI bridge
webhook → Graph
Data plane
Odoo product.template
367 rentables
Master Sheet
Odoo_Rental_Products_Master
tools/meta/catalog.py
→ feed.csv
Cloudflare Pages
kawasist‑internal · feed host
Claude layer
Official Meta Ads MCP
mcp.facebook.com/ads · 29 tools
tools/meta/* CLIs
Pixel · Catalog · Posting · WA · Insights
Notion HQ
Tasks & pipelines DB
Existing AI tools
Sparkling · WA bot · Gear Insights
Meta cloud
Business Manager
Kawader BM
Meta App + System User
kawasist‑claude
FB Page · IG · WABA
Asset assignments needed
Pixel · Catalog · Custom Audiences
All to provision
15 · Plan

Implementation roadmap

Five phases, ~3 weeks total if App Review goes smoothly. Each phase ends with a verifiable checkpoint, not "and then we keep going". The earlier phases unblock the later ones — don't skip ahead.

PhaseScopeEffortOutputVerification
P0
30 min
Provisioning — Meta App, System User, asset assignments, token to Keychain. Meta UI work, no code. memory/project_meta-integration.md with all IDs. tools/meta/whoami.py returns valid scopes.
P1
2–3 days
Pixel base + browser fbq events on 6 surfaces. Adopt official Meta Ads MCP for read‑only insights smoke test. 1 new ir.ui.view module + 5 JS file edits + MCP setup. Live Pixel + first Insights pulled via MCP. Pixel Helper shows events; MCP returns last 7d Supernova data.
P2
3–4 days
Server‑side CAPI: n8n bridge + Odoo automation rule. Catalog feed export + Cloudflare hosting + Commerce Manager wire‑up. tools/meta/pixel.py, tools/meta/catalog.py, n8n flow JSON, Odoo automation. Deduped events in Events Manager. 367 products live in Catalog. EMQ ≥6/10 after 24h. IG product tagging works.
P3
2 weeks
Submit App Review for publishing scopes (pages_manage_posts, instagram_content_publish, whatsapp_business_messaging). Build Custom Audience sync from Odoo. Build Lead Ads webhook receiver. App Review screencast + business verification + tools/meta/audiences.py + tools/meta/leads.py. Approved app. Audiences syncing nightly. Leads landing in Notion. Test lead end‑to‑end. Audience refreshed in Audience Manager UI.
P4
2 days
Organic posting tools: post_fb.py, post_ig.py, post_threads.py. Wire Sparkling output → IG Reels publish. Three publishing CLIs + Sparkling integration hook. Claude can publish to FB/IG/Threads with one command. Live test post on each surface. Sparkling auto‑publishes a Reel.
P5
3–5 days
WhatsApp Cloud API on second number. Three Flow templates (Quote/Inquiry/Casting). Click‑to‑WhatsApp ad attribution wiring. WABA registration + tools/meta/whatsapp.py + Flow JSON definitions + Odoo intake routing. CTWA ads route into Cloud API; Flows submit to Odoo. Test CTWA click → Flow submit → Odoo quote draft created.
16 · Risk

Risk, governance, & App Review

Three categories of risk: token compromise (operational), Meta policy violation (account safety), and silent breakage (depending on deprecated APIs). Each gets a control.

Token hygiene

  • System User tokens are long‑lived but Meta rotates them when scopes change. tools/meta/whoami.py runs weekly via launchd; alerts via WA bot if expired.
  • One System User token per integration domain (Odoo CAPI, Sparkling publishing, n8n insights) — revoke independently if compromised.
  • App Secret never leaves Keychain. .env.meta is regenerated at boot, never committed.

Policy compliance

  • Pixel + CAPI need a privacy notice update mentioning Meta tracking and CAPI. Pull standard template; one paragraph.
  • Custom Audience hashing happens locally before POST — raw PII never leaves Kawader.
  • WhatsApp templates: only utility/transactional inside 24h CSW; marketing templates respect quality rating.
  • Footer disclosure: "Meta Pixel installed" line per GDPR pattern (does not strictly apply in PS but signals good faith).

Deprecation watch

  • Pin Graph API v25.0; review changelog every quarter.
  • Page Insights metrics shift on 2026‑06‑15 — code uses unified "Page Views" only.
  • Webhook mTLS CA cutover happened 2026‑03‑31; pin Meta's new CA cert in n8n.
  • ASC/AAC API campaign creation retires 2026‑05‑19 — we don't use it; Supernova does. Flag with Naeem.

App Review expectations

Required artifacts for the publishing scopes:

Community reports: 2 days–3 weeks turnaround, average 1 week. Plan accordingly.

17 · Outcomes

What this unlocks — concrete business outcomes

A non‑technical readout of what changes for Kawader after each pillar lands.

Marketing & Sales

  • Real attribution — every rental tied back to the ad / post / campaign that drove it.
  • Dynamic Product Ads — Meta auto‑generates product‑specific ads. Stop hand‑making 367 ad variants.
  • Retargeting — past visitors and existing customers become a retargeting audience automatically.
  • Lookalikes — find new customers similar to the best ones.
  • Lead form recovery — every Lead Ads submission gets a WhatsApp template within 1 hour.

Content velocity

  • Sparkling → IG/Threads — render and publish in the same command.
  • IBNS launches — episode drops auto‑publish a 5‑post bundle.
  • Gear Insights — already daily, now also auto‑syndicates to Threads, IG, Page.
  • Gear Talk Reels — every Reel becomes a shoppable post via Catalog tagging.

Operational

  • WhatsApp Flows — booking forms, casting forms, production inquiries — all in chat.
  • One operator surface — Claude reads insights and posts content via the same tool layer.
  • Catalog single source — Odoo is master; Meta + WhatsApp + IG Shop all derive.
  • Compliance‑safe templates — no more ban risk on broadcast WhatsApp.

Strategic

  • Vendor leverage — Supernova reports become auditable; we know what we're paying for.
  • Compete with bigger shops — automation closes the gap on rental houses 5x our size.
  • Threads beachhead — early presence on Meta's text platform, low cost.
  • Ad Library competitive intel — see every competitor ad globally, summarized weekly.
18 · Sources

References & further reading

Every claim above traceable to a canonical Meta doc or a vetted public source. Pulled fresh 2026‑05‑08.

Foundation

Pixel + Conversions API

Commerce Catalog

Pages, Instagram, Threads

Page Insights deprecation (2025‑08‑15).../blog/post/2025/08/15/page-insights-api-updates
IG media_publish reference.../ig-user/media_publish
IG content_publishing_limit.../ig-user/content_publishing_limit
Threads troubleshooting (rate limits).../threads/troubleshooting

Marketing API

WhatsApp + Messenger

Claude + MCP layer

facebook-business (Python SDK 25.0.1)pypi.org/project/facebook-business
pipeboard meta-ads-mcp (community)github.com/pipeboard-co/meta-ads-mcp
mikusnuz meta-ads-mcp (community)github.com/mikusnuz/meta-ads-mcp
HagaiHen facebook-mcp-servergithub.com/hagaihen/facebook-mcp-server
networkerman whatsapp-cloud-api-mcp-servergithub.com/networkerman/whatsapp-cloud-api-mcp-server
n8n Facebook Lead Ads nodedocs.n8n.io/.../facebookleadadstrigger