ppc_connection_list first. If a platform isn’t linked yet, start at Connecting Ad Accounts.
Two conventions to know first
Two-step confirm. Any tool that spends money, changes live delivery, or does something irreversible follows the same pattern: the first call executes nothing — it returns a preview withrequires_confirm: true. Repeat the identical call with confirm: true to execute. You’ll meet it on customer-list uploads (ppc_customer_match_upload, ppc_offline_conversion_upload), live-audience edits (ppc_meta_ad_set_audiences_update, LinkedIn segment updates and ABM uploads), archiving (ppc_meta_archive, LinkedIn campaign and creative archive), and the Tag Manager publish step on the SEO side.
Nothing new serves by itself. Creations land inert: Google Performance Max asset groups and Meta ad sets/ads are created paused, Microsoft Advertising campaign shells are created paused, and LinkedIn campaigns and creatives are created as drafts that no tool can activate — a person launches those in Campaign Manager. Enabling is always a separate, explicit step.
Google Ads: the extended lane
Seven tools extend the coreppc_* set. Each takes a connection_id, an operation, and operation-specific params.
A Performance Max campaign created on its own can never serve — it needs at least one asset group. Build the group with
ppc_google_pmax, upload images first through ppc_google_asset_upload (the response names which slot each image fits), and enable the group and the campaign as two separate approvals.Microsoft Advertising (the ppc_bing_* family)
The Microsoft lane mirrors the Google depth: campaign build-out, the full targeting-criterion surface, audiences, conversion tracking, ad extensions, shared negatives, and three account-wide reports. Writes that need entity ownership checks require a prior ppc_sync (and ppc_bing_pull_ad_groups / ppc_bing_pull_ads on large accounts).
Build-out: ppc_bing_push_campaign creates a paused Search campaign shell; ad groups, keywords, ads, budgets, bids, and status flips ride the cross-platform ppc_platform_* lane (ppc_platform_ad_group_create, ppc_platform_keyword_add, ppc_platform_responsive_search_ad_create, ppc_platform_budget_update, ppc_platform_pause_resource / ppc_platform_enable_resource, and more).
Targeting criteria: ppc_bing_location_search resolves places to location ids for ppc_bing_location_criterion_add; ppc_bing_radius_criterion_add covers “20 miles around the shop”; ppc_bing_location_intent_set fixes Microsoft’s leaky default (people searching about an area also see the ads); ppc_bing_ad_schedule_add dayparts (adding any schedule stops serving in unlisted hours); ppc_bing_device_criterion_set and ppc_bing_demographic_criterion_add adjust bids by device, age, and gender; ppc_bing_criterions_list reads everything and feeds ppc_bing_criterion_delete.
Audiences: ppc_bing_audience_list reads what exists (audience creation and uploads are deliberately not exposed), ppc_bing_audience_criterion_add / ppc_bing_audience_criterion_remove attach and detach, ppc_bing_audience_associations_list shows targeted vs excluded, and ppc_bing_audience_target_setting_set switches between bid-only and target-and-bid (the only mode where reach collapses to the audience).
Conversion tracking: ppc_bing_uet_tag_list / ppc_bing_uet_tag_create manage the UET measurement snippet (a tag not recording is the top reason a Microsoft account reports zero conversions), ppc_bing_conversion_goal_list / ppc_bing_conversion_goal_create manage goals, and ppc_bing_conversion_tracking_status gives a plain-language readiness verdict — run it before switching any campaign to a conversion-based bid strategy.
Extensions and negatives: ppc_bing_sitelink_extension_create and ppc_bing_callout_extension_create create extensions that show nothing until ppc_bing_ad_extension_associate attaches them (ppc_bing_ad_extension_list reads them); ppc_bing_shared_negative_list_create / ppc_bing_shared_negative_list_items_add / ppc_bing_shared_negative_list_associate / ppc_bing_shared_negative_list_list are the shared blocklist, with additions taking effect immediately on every associated campaign.
The three Microsoft reports
All three take
connection_id with optional days (default 30) and limit; summaries are always computed over the full report even when returned rows are capped.
Meta depth
Reads:ppc_meta_insights_breakdown (Meta’s most flexible report — combine up to three breakdowns like age, placement, or publisher platform at account, campaign, ad set, or ad level), ppc_meta_creative_list, ppc_meta_pages_pixels, ppc_meta_targeting (search and browse targeting options, plus delivery estimates for a targeting spec), ppc_meta_leadgen (pull instant-form leads into the CRM), ppc_meta_audiences_list (custom and lookalike audiences, the account-wide audience map, and one ad set’s include/exclude lists), and ppc_meta_advantage_status.
Writes: ppc_meta_media_upload and ppc_meta_adcreative_create (link, video, and carousel formats — a creative alone spends nothing), ppc_meta_ad_set_create and ppc_meta_ad_create (always created paused), ppc_meta_advantage_create (both halves of an Advantage+ buy, also paused), ppc_meta_audience_create (rule-based and lookalike audiences), ppc_meta_custom_audience_upload (pre-hashed identifiers into an existing custom audience, confirm-gated, with consent requirements), ppc_meta_campaign_update and ppc_meta_ad_set_update (targeting replaces the whole spec — read it first, edit, send it back whole), ppc_meta_ad_set_audiences_update (confirm-gated, re-enters learning), ppc_meta_campaign_push (push a local draft to Meta, paused), and ppc_meta_archive (irreversible, confirm-gated — pause instead to stop delivery temporarily).
LinkedIn depth
ppc_linkedin_demographics_report is LinkedIn’s signature read: performance pivoted by job title, industry, seniority, function, company size, company, or geo — the “which job titles converted?” diagnostic. Around it: ppc_linkedin_campaign_groups_list / ppc_linkedin_campaign_group_create / ppc_linkedin_campaign_group_update (group budgets live only here), ppc_linkedin_campaign_update, ppc_linkedin_campaign_push (drafts only — LinkedIn hard-requires a budget and at least one location facet at create time), ppc_linkedin_creatives (list, detail, pause/enable with confirm on enable, archive), ppc_linkedin_creative_create (single-image Sponsored Content end to end, as a dark post), ppc_linkedin_boost_post, ppc_linkedin_media_image_upload, ppc_linkedin_targeting (facets, entity search, audience counts), ppc_linkedin_leadgen, ppc_linkedin_conversions (rules plus Conversions-API events with pre-hashed emails), ppc_linkedin_audience_segments, ppc_linkedin_matched_audience_upload (pre-hashed member lists), and ppc_linkedin_abm_segment (company segments — business identifiers, never person-level data).
Disapproval reads on every platform
A disapproved ad spends nothing and silently starves its campaign, so these are the first reads to run when traffic drops:
All four return the same shape — a
disapproved_count plus items with policy reasons where the platform provides them (LinkedIn and TikTok sometimes return status-only rows, flagged with reasons_available: false, with the detail living in the native ads manager). The daily guardrail sweep also watches for new disapprovals and can trigger the Ad Disapproval Triage playbook.
The budget guardrail
Each ad connection can carry a monthly budget target that a daily sweep enforces. Configure it throughppc_connection_update on the connection’s settings object:
Related pages
- SEO Delivery Tools — the rank tracker, GSC, and the Tag Manager publish flow that closes the conversion-tracking loop
- Client Reporting & Approvals — where guardrail alerts land and how staged actions get approved
- Standing Playbooks — the scheduled loops that run these tools every week
- AI Advertising Strategist — the docked chat surface over the same campaigns