> ## Documentation Index
> Fetch the complete documentation index at: https://www.adspirer.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Adspirer Changelog: New Tools, Platforms & Features

> Adspirer changelog — new MCP tools, platform integrations, AI client support, and feature releases for the autonomous advertising agent.

<Update label="July 7, 2026" description="Delete-confirmation safety gate" tags={["Bug Fix", "MCP"]}>
  ## A Hard Gate So "Pause" Never Means "Delete"

  Adspirer now hard-gates every destructive tool. `remove_*` and `delete_*` tools carry a `destructiveHint` and **won't run unless the call explicitly passes `confirm_delete: true`**, and a "pause" request is never routed to a delete tool. This closes a class of error where an ambiguous instruction like "pause these keywords" could be interpreted as a permanent deletion. Read tools still auto-run; only irreversible actions are gated. → [Tool safety model](/mcp#tool-safety-model)
</Update>

<Update label="July 6, 2026" description="Google App campaigns + LinkedIn campaign groups & forecasting" tags={["New Features", "Google Ads", "LinkedIn Ads"]}>
  ## Google App Campaigns + a Much Deeper LinkedIn

  **Google App (Universal App) campaigns.** `create_app_campaign` launches campaigns that drive app **installs, engagement, or pre-registration** across Search, Google Play, YouTube, Display, and Discover — with app-ad creative management. Created PAUSED for review. → [Google App campaigns](/ad-platforms/google-ads)

  **LinkedIn, deepened (now 55 tools).** New this week:

  * **Campaign groups** — create, update, delete, list, search, and batch-create groups with shared budgets and schedules.
  * **Pre-launch forecasting** — `estimate_linkedin_audience_size` and `forecast_linkedin_campaign_supply` project reachable audience and expected impressions/clicks/spend at a given budget, so you size campaigns with data.
  * **Full lifecycle** — archive, reactivate, delete, clone, and batch-update campaigns.

  → [LinkedIn Ads integration](/ad-platforms/linkedin-ads)
</Update>

<Update label="July 4, 2026" description="Google Shopping + Merchant Center + smarter tool discovery" tags={["New Features", "Google Ads", "MCP"]}>
  ## Google Shopping Campaigns Arrive

  Run **Standard Shopping** campaigns straight from your Google Merchant Center feed — no per-product ad building.

  * `link_merchant_center` / `get_merchant_center_links` connect your product feed.
  * `create_shopping_campaign` → `add_shopping_ad_group` → `add_shopping_product_ad` builds the campaign.
  * **Product partition trees** (`add_product_group` and friends) let you subdivide the feed by brand, category, product type, or item ID and bid on each partition independently.

  → [Google Shopping campaigns](/ad-platforms/google-ads)

  **Smarter tool discovery.** As the surface grows past 400 tools, new `search_tools` (find the right tool from a natural-language description) and `get_tool_schema` (fetch a tool's exact parameters) keep the AI accurate. → [How discovery works](/mcp)
</Update>

<Update label="July 3, 2026" description="Google Ads Manager-parity deep management" tags={["New Features", "Google Ads"]}>
  ## Manager-Parity Deep Management for Google Ads

  Google Ads is now Adspirer's deepest integration at **147 tools**, with control down to the ad-group, asset-group, and product-partition level:

  * **Search** — ad-group lifecycle and settings, demographics, audiences, proximity / ad-schedule / device-bid targeting.
  * **Demand Gen** — create campaigns and ads, manage audiences and channel controls across YouTube, Shorts, Discover, and Gmail.
  * **Performance Max** — full asset-group lifecycle, per-asset edits, asset-performance ratings (Best / Good / Low), and listing filters for retail PMax.
  * **Campaign-level depth** — tracking, dates, frequency caps, network settings, and labels.

  Every write is live-verified against a sandbox. → [Google Ads integration](/ad-platforms/google-ads)
</Update>

<Update label="July 2, 2026" description="Cross-platform Ad Ops agents, teach-your-agent + Meta lead forms" tags={["New Features", "Agent Skills", "Meta Ads"]}>
  ## Ad Ops Agents Get Smarter — and Cross-Platform

  * **Cross-platform agents.** One agent can now reason and act across **Google, Meta, TikTok, LinkedIn, and Amazon** from a single goal — e.g. "cap total monthly spend at 10,000 CAD across Meta, Google, and LinkedIn."
  * **Teach your agent.** Upload your own brand rules, target CPAs, seasonal calendars, and SOPs; every run grounds its decisions in your documents.
  * **Evidence-gated impact.** Impact verdicts only make a causal claim when your own data supports it — no more misleading "+54% worse" calls off a tiny sample.
  * **Rejection-reason chips.** One tap tells the agent *why* you rejected a proposal, so the next run is better.

  Also: **Meta native lead-form campaigns** (on-platform Instant Forms, no pixel required) now pass pre-flight. → [Autonomous Ad Ops agents](/agent-skills/ad-ops-agents)
</Update>

<Update label="June 30, 2026" description="Meta Advantage+ Catalog (dynamic product ads)" tags={["New Features", "Meta Ads"]}>
  ## Meta Advantage+ Catalog — Dynamic Product Ads

  Adspirer now runs **Meta Advantage+ Catalog campaigns (dynamic product ads / DPA)** — the way e-commerce advertisers show the exact products from their feed to the right shopper without hand-building an ad per SKU. **16 new Meta tools** (Meta Ads is now 54 tools):

  * **Discover & prepare** — `list_meta_catalogs`, `list_meta_products`, `list_meta_product_sets`, `create_meta_product_set`, and `validate_catalog_readiness` (a pre-flight that tells you whether your catalog + pixel data supports **retargeting** or **prospecting only**, before you spend).
  * **Launch & manage** — `create_meta_catalog_campaign` (prospecting or retargeting, created PAUSED) plus catalog ad-set and ad management.
  * **Optimize** — `analyze_meta_catalog_performance`, `get_meta_product_performance` (per-SKU ROAS), `detect_meta_catalog_waste`, and `diagnose_meta_catalog_funnel`.

  Connect a catalog you already manage in Meta Commerce Manager (or synced from Shopify/WooCommerce) and manage the ads conversationally. → [Meta Catalog ads](/ad-platforms/meta-ads)
</Update>

<Update label="June 24, 2026" description="Ad Ops agent builder, approvals & community playbooks" tags={["New Features", "Agent Skills"]}>
  ## Build, Approve, and Share Ad Ops Agents

  The autonomous Ad Ops agent got a full build-and-run experience:

  * **Gallery + 5-step builder** with active-agent cards, background goal-compile so the builder opens instantly, and per-agent detail panels.
  * **Approvals from the card** — review, approve, or reject each proposal in place, with server-side approval counts and a per-agent inbox.
  * **Impact & Recommendations tabs** — see whether approved changes actually added value (fed back into the next run) and a running list of prioritized, ad-focused suggestions.
  * **Community playbooks** — share an agent's decision logic (goal, rules, and guardrails only — never accounts or budgets) and fork others' proven playbooks onto your own account.

  → [Autonomous Ad Ops agents](/agent-skills/ad-ops-agents)
</Update>

<Update label="June 23, 2026" description="Shareable Dashboards V2 — white-label & adaptive" tags={["New Features", "MCP"]}>
  ## Shareable Dashboards V2 — White-Label & Adaptive

  Shareable dashboards were rebuilt into a data- and platform-adaptive report you can hand to clients:

  * **White-label** — upload your own logo, set a custom title and footer, and hide Adspirer branding.
  * **Adaptive depth** — \~20 analysis blocks (Pareto, anomaly z-scores, efficiency frontier, funnel, treemap, waterfall) that appear only when your data supports them, plus per-platform "signatures" for Google, Meta, TikTok, and LinkedIn.
  * **Prompt-mode** — compose a dashboard's layout from a natural-language prompt.

  Links stay live (fresh data on open), expire per plan tier, and are revocable. → [Shareable dashboards](/knowledge-base/capabilities#shareable-dashboards)
</Update>

<Update label="June 22, 2026" description="Community Plugins — open-source, read-only extensions" tags={["New Features", "Agent Skills"]}>
  ## Community Plugins (v1)

  Adspirer can now be extended with **open-source, community-contributed analysis tools** that appear alongside the built-in ones via the `community_plugins` router. They're **read-only** to your ad accounts, run in a **credential-free, sandboxed** sub-server, and are loaded from a **pinned, reviewed commit** of the public [`Adspirer/adspirer-mcp-community`](https://github.com/Adspirer/adspirer-mcp-community) repo. First example: a keyword clusterer that groups your search terms into themes. → [Community Plugins](/agent-skills/community-plugins)
</Update>

<Update label="June 20, 2026" description="Now in 116 languages + Start Here onboarding" tags={["New Features", "AI Clients"]}>
  ## Adspirer Now Speaks 116 Languages

  The Adspirer dashboard, onboarding, and AI-client setup guides are now localized into **116 languages**, with:

  * **Automatic browser-language detection** and a one-click language switcher.
  * Full **right-to-left (RTL)** support for Arabic, Hebrew, Persian, Urdu, and more.
  * A language preference that's **remembered across devices**.

  And because you manage ads by chatting with an AI, you can give instructions in your own language. → [Localization](/knowledge-base/localization)

  Also new: a redesigned **Start Here** onboarding experience with an interactive, illustrated card carousel and try-it prompts that track real completion from your own account history.
</Update>

<Update label="June 18, 2026" description="Autonomous Ad Ops agents are live" tags={["New Features", "Agent Skills"]}>
  ## Autonomous Ad Ops Agents Go Live

  Adspirer's **autonomous Ad Ops agents** are out of beta. Give an agent a plain-English goal and a cadence, and it monitors your accounts on a schedule and **proposes every change to an approval queue** — find winners to scale, wasted spend to cut, budgets to rebalance, CPA/ROAS drift to correct, or broken conversion tracking to flag. Nothing spends or changes without your approval, enforced server-side. Available on Plus, Pro, and Max. → [Autonomous Ad Ops agents](/agent-skills/ad-ops-agents)
</Update>

<Update label="June 17, 2026" description="ChatGPT Ads — new platform" tags={["New Features", "ChatGPT Ads"]}>
  ## Run Ads Inside ChatGPT — New: ChatGPT Ads (OpenAI Ads)

  Adspirer now supports **ChatGPT Ads (OpenAI Ads)** — pay-per-click "chat card" ads that render inside ChatGPT responses, with **31 tools** to launch, manage, and measure them conversationally from ChatGPT, Claude, or any connected AI client. (This also brings Adspirer's total tool surface to 340+.)

  * **Connect once with an API key.** ChatGPT Ads is Adspirer's first non-OAuth platform: paste your OpenAI Advertiser API key in the Connections tab (one key = one ad account). It's stored encrypted, and the chat agent never sees it.
  * **Launch in one shot, or manage granularly.** `launch_chatgpt_ad` builds the whole ad from a description (URL, headline, body, image, budget, geo), or use full campaign/ad-group/ad controls (list, get, create, update, pause, resume, archive).
  * **Paused by default.** Nothing serves or spends until you resume the campaign, and the agent always speaks in dollars, not micros.
  * **Honest review status.** Adspirer reports OpenAI's ad-review state (in review → approved/rejected) and flags policies up front — notably that third-party AI services are disallowed.
  * **Conversions** via the OpenAI pixel and Conversions API, with a built-in test event to verify tracking.

  → [ChatGPT Ads integration guide](/ad-platforms/chatgpt-ads)
</Update>

<Update label="June 16, 2026" description="Meta conversions reconcile with Ads Manager" tags={["Bug Fix", "Meta Ads"]}>
  ## Meta Performance: Conversions That Reconcile With Ads Manager

  The Meta performance dashboard now shows a **full conversion-action breakdown** and highlights the **purchase-class event** that matches the "Results" column in Meta Ads Manager. Meta's `total_conversions` sums every pixel action (add-to-cart, initiate-checkout, purchase, and more), which could make the dashboard headline look far higher than Ads Manager's purchase count. Now you can see exactly which figure reconciles — no more chasing a phantom discrepancy. CPA, ROAS, and deltas are unchanged.
</Update>

<Update label="June 12, 2026" description="Google ad-level performance & creative export" tags={["New Features", "Google Ads"]}>
  ## Google Ads: Per-Ad Performance, Creative Export & Complete Asset Discovery

  * **`get_ad_performance`** — a per-ad breakdown (one row per ad) with impressions, clicks, CTR, cost, conversions, conversion value, CPC, CPA, ROAS, video views, ad strength, and a live flag — plus a head-to-head comparison when an ad group has multiple ads. Covers Search, Display, Demand Gen, and YouTube.
  * **`get_ad_creative`** — export the creative composition of existing ads: YouTube video IDs and thumbnails, downloadable image URLs with roles and dimensions, every headline/description/CTA, and carousel cards.
  * **`discover_existing_assets`** is now **paginated** across all asset types, returning your complete asset inventory instead of silently capping — with downloadable image URLs and a clear path forward when a square logo is missing (previously a dead end for Performance Max).

  The OpenClaw plugin (v2026.6.12) bundles these too.
</Update>

<Update label="June 11, 2026" description="Claude Cowork OAuth self-serve fix" tags={["Bug Fix", "AI Clients"]}>
  ## Claude Cowork: Self-Serve Fix for "No OAuth Flow Is in Progress"

  If Claude's desktop/Cowork app shows *"No OAuth flow is in progress"* when connecting Adspirer, that's a known client-side bug in the Claude app — not an Adspirer problem. The fix takes about 30 seconds: in Claude, go to **Settings → Connectors → Add custom connector**, enter `https://mcp.adspirer.com/mcp`, and connect from there. → [Claude Cowork setup](/ai-clients/claude-cowork)
</Update>

<Update label="June 10, 2026" description="Amazon Ads — new platform" tags={["New Features", "Amazon Ads", "Meta Ads"]}>
  ## Amazon Ads Joins Adspirer — 61 Tools for Sponsored Products, Brands & Display

  Amazon Ads is now a fully supported ad platform, with **61 tools** spanning **Sponsored Products, Sponsored Brands, and Sponsored Display**.

  * Connect via **Login with Amazon**; Adspirer discovers your advertiser profiles across **North America, Europe, and the Far East** and imports each as an ad account.
  * Full Sponsored Products lifecycle (campaigns → ad groups → product ads → keywords / targets / negatives), all 7 Sponsored Brands ad types (Brand Registry required), and Sponsored Display.
  * Amazon-native analytics: **ACOS / ROAS**, per-ASIN performance, wasted-spend detection, budget optimization, and a purchased-products cross-sell view. Reporting runs asynchronously via `get_amazon_report`.

  → [Amazon Ads integration guide](/ad-platforms/amazon-ads)

  ### Meta: EU DSA support + an extra Google extension tool

  * Meta ad sets that target the **EU/EEA** now accept the required **DSA disclosure** fields (`dsa_beneficiary` / `dsa_payor`), so EU-targeted campaigns no longer dead-end. The fields are sent only when an ad set actually targets the EU/EEA.
  * Google Ads adds **`remove_structured_snippets`** to clear stale snippet values before adding fresh ones.

  The OpenClaw plugin (v2026.6.10) adds the Amazon Ads router.
</Update>

<Update label="June 9, 2026" description="In-chat dashboards overhaul" tags={["New Features", "AI Clients", "MCP"]}>
  ## In-Chat Dashboards: Tabs, Date Ranges, Working Buttons & Mobile

  The interactive widgets in ChatGPT and Claude got a major upgrade:

  * **Tabbed performance dashboard** — Overview / Campaigns / Insights, with KPI tiles, period-over-period deltas, charts, "needs attention" highlights, and **7 / 14 / 30 / 60 / 90-day plus custom date-range** switching that re-runs the query live.
  * **Redesigned conversion-audit and connections widgets** — a graded scorecard with an action plan, and an account switcher with a quota meter.
  * **Action buttons now work** — "pause this campaign" or "draft a message for my developer" post straight back into the chat.
  * **Mobile rendering** — widgets now render in the Claude mobile app, with a clean text fallback on clients that don't support them.
</Update>

<Update label="June 8, 2026" description="Google agency-level Standard Access" tags={["New Features", "Google Ads", "Agency"]}>
  ## Approved at the Agency Level for the Google Ads API

  Google reviewed and classified Adspirer as an **agency, full-service ad platform** for the Google Ads API and granted **Standard Access** — which lifts the daily operations cap. Bulk builds, large account restructures, and account-wide optimization now run at full speed, with no daily ceiling on Google Ads work.
</Update>

<Update label="June 6, 2026" description="Connection Health on Usage & Billing" tags={["New Features", "Billing"]}>
  ## See Your Connection Health on Usage & Billing

  The Usage & Billing page now shows a **Connection Health** card: whether your AI assistant is connected via MCP, and — per ad account — whether the OAuth link is healthy or needs reconnecting. A **Test now** button re-checks live, so you can confirm everything's wired up before you start a session.
</Update>

<Update label="June 5, 2026" description="TikTok targeting fix + redesigned setup guide" tags={["Bug Fix", "TikTok", "AI Clients"]}>
  ## TikTok Targeting Search Fixed + Redesigned Setup Guide

  * **TikTok targeting search works again.** `search_tiktok_targeting` had been failing for every caller; it's fixed. Interest keywords are targeted by **numeric ID** (from that search), not by plain keyword strings — the tool docs now make this explicit.
  * **Redesigned setup guide.** The per-client setup experience now has a screenshot carousel synced to the step list and a walkthrough video for Claude Cowork and ChatGPT, plus a standalone Setup Guide you can revisit any time from the web app.
</Update>

<Update label="June 2, 2026" description="Local targeting & support chat" tags={["Bug Fix", "Meta Ads"]}>
  ## Meta Local Targeting Lands Correctly + Screenshots in Support Chat

  ### City + radius targeting now reaches Meta

  Targeting a city with a radius — "everyone within 20 miles of Austin" — now reaches Meta as a real city-and-radius instead of being mis-sent as an invalid country code and silently dropped. Local campaigns on image, video, and carousel ads were effectively running nationwide (or failing) before this fix.

  * **Multiple cities, each with its own radius**, now work in a single ad set.
  * **Location reach modes** — choose who in a location you reach: people who **live** there, were **recently** there, or are **traveling to / interested in** it.
  * **Safer location edits** — updating an ad set's locations now merges onto its existing targeting instead of replacing everything, so a location-only change no longer wipes the rest of your targeting.

  ### Attach screenshots to the support chat

  The in-app support chat widget now accepts **PNG/JPEG screenshots** — click the paperclip, paste, or drag-and-drop. Support reads the image and runs its diagnostics on it, which is far faster for visual issues. Up to 5 images per message (5 MB each); screenshots are processed in-memory and never stored. Conversations also now **resume where you left off for up to 7 days** (previously 48 hours).
</Update>

<Update label="June 1, 2026" description="Onboarding & billing" tags={["New Features", "Billing"]}>
  ## Onboarding & Billing Refresh

  A polish pass across sign-up and plan management:

  * **App Store connect tabs** on the onboarding connection screen, matching how you actually install Adspirer in ChatGPT and Claude.
  * **Redesigned pricing step** — an animated tool-call hero, clearer active-account messaging, and a full-width tier ladder so the plan differences are easy to scan.
  * **Congrats screen** confetti and copy polish once you finish setup.
  * **"Manage Subscription"** now reliably opens the Stripe billing portal from the account menu.
</Update>

<Update label="May 31, 2026" description="Account switching" tags={["New Features", "Agency", "MCP"]}>
  ## Switch Your Active Ad Account From Chat

  You can now change which ad account Adspirer acts on **by just asking** inside ChatGPT or Claude — including switching between child accounts under the same Google Ads manager (MCC) — without opening the web app.

  ```
  Use my Sahaayak Google Ads account instead
  ```

  * `list_connected_accounts` now surfaces connected-but-not-yet-activated accounts (including live MCC child accounts), so the agent can resolve a business name to the right account and switch to it.
  * Switching respects your plan's [active-account cap](/knowledge-base/multi-account): on single-account tiers the new account **replaces** the active one; on multi-account tiers (annual plans and Max) it's **added** to the active set.
  * Account switching is a session operation — it never costs a tool call.

  Previously this switch silently failed over MCP. It now works end-to-end from any connected AI client.
</Update>

<Update label="May 30, 2026" description="Diagnostic & Helper tools" tags={["New Features", "AI Clients", "Agent Skills"]}>
  ## Diagnostic & Helper Tools — and Interactive Widgets in ChatGPT & Claude

  A new group of **13 read-only "get unstuck" tools** is now live across every AI client, on Free and up. They're **quota-free** — calling them never counts against your monthly tool calls.

  ### Get started, pre-flight, diagnose, and see your value

  | When                     | Tools                                                                                         | What they do                                                                                                                                                                               |
  | ------------------------ | --------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
  | **Getting started**      | `start_here`, `suggest_next_action`, `list_what_i_can_do`                                     | Personalized "what should I do next" based on your real connected accounts and data                                                                                                        |
  | **Before launching**     | `get_campaign_spec`, `preflight_campaign`, `validate_campaign_draft`                          | Check an account is launch-ready and dry-run a campaign against the platform's rules before anything is created                                                                            |
  | **When something fails** | `explain_platform_error`, `why_did_this_fail`, `diagnose_my_setup`, `verify_campaign_is_live` | Turn a cryptic platform error into a plain-language fix, run a full connection health check, and confirm a campaign is actually serving — a **real live check against all four platforms** |
  | **See your value**       | `whats_changed_since_last_visit`, `weekly_opportunities`, `usage_value_summary`               | What moved since you were last here, 1–3 concrete optimization opportunities, and what your plan delivered                                                                                 |

  `diagnose_my_setup` is especially useful when you're not sure whether a problem is your AI-client connection or your ad-platform sign-in — it tells them apart. → [Full Diagnostic & Helper reference](/agent-skills/diagnostic-helper-tools)

  ### Answers render as interactive cards

  In **ChatGPT and Claude**, these tools now render as branded, interactive cards — setup checklists, usage meters, opportunity lists, an account switcher — instead of a wall of text. The cards adapt to light/dark themes and fall back gracefully to plain text on any client that doesn't render widgets.

  ### OpenClaw plugin v2026.5.30

  The OpenClaw plugin now bundles the diagnostic & helper tools too (tool count 139 → 140). Reinstall with `openclaw plugins install openclaw-adspirer` to pick them up.
</Update>

<Update label="May 30, 2026" description="Google Ads reliability" tags={["New Features", "Bug Fix", "Google Ads"]}>
  ## Google Ads: Clearer Bidding Errors, Reliable Keyword Metrics, Full Ad Extensions

  ### Bid-strategy changes explain themselves

  Changing a campaign's bid strategy when it's attached to a **shared (portfolio) bid strategy** used to fail with Google's opaque "operation not allowed for the given context." Adspirer now detects the portfolio strategy up front and tells you exactly what to do — detach it from the campaign, or edit the shared strategy itself. Smart Bidding errors (Target CPA / Target ROAS) now include the conversion-tracking prerequisites you're missing.

  ### Keyword research metrics reach your AI reliably

  `research_keywords` now surfaces **per-keyword search volume, competition, average CPC, and top-of-page bid range** in the structured data your assistant reads — so it stops claiming "per-keyword data isn't available" when Google Keyword Planner returned it all.

  ### Ad copy edits stop failing on duplicates

  Editing a Responsive Search or Display ad no longer fails with "Assets are duplicated across operations" — Adspirer automatically de-duplicates identical headlines/descriptions before submitting, and if that leaves you short of Google's minimum, it tells you exactly how many more unique lines to add.

  ### Full ad-extension control

  Sitelinks, callouts, and structured snippets now have complete add / remove / list coverage, including the new `remove_structured_snippets` tool for clearing out stale snippet values. Sitelinks also accept natural field names (`text`/`headline`, `url`/`link`) and are now suggested whenever you ask about "extensions" or "making my ads better" — you don't have to know the word "sitelinks."
</Update>

<Update label="May 29, 2026" description="Meta conversions & creatives" tags={["New Features", "Bug Fix", "Meta Ads", "Agency"]}>
  ## Meta Ads: Conversion Reporting You Can Trust, Plus Creative & Agency Fixes

  ### Conversions Meta actually reports now count

  If your campaigns showed real conversions in Meta Ads Manager but **zero in Adspirer**, this fixes it. Adspirer now counts:

  * **Pixel custom-event conversions** (e.g. a Calendly booking) — the most common "0 conversions" cause
  * **Lead-form submissions** and **Messenger conversations**
  * **Offline conversions**, with a **per-event-name breakdown** ("5 *invitee\_select\_time* events", not "5 custom conversions")

  Lead-gen and sales campaigns are now correctly treated as conversion campaigns in wasted-spend, anomaly, and budget analysis — no more "Meta is optimizing blind" when it isn't.

  <Note>
    This applies to newly collected performance. Historical numbers for affected accounts backfill separately as data is re-collected.
  </Note>

  ### Creating ads with fewer dead ends

  * **Carousel ads** accept your existing assets (the same `existing_image_hash` Adspirer's discovery returns) and validate each card up front — needs an image, headline, and landing URL — with a clear message instead of an opaque Meta rejection.
  * **Dynamic creative (DCO)** ads now accept multiple headlines and body texts directly, and Adspirer auto-enables dynamic creative on the target ad set for video as well as image.
  * **Conversion ad sets** now warn you about a **missing pixel** before Meta rejects the campaign with "promoted object fields missing."

  ### Agency-grade cross-account safety

  If you manage multiple ad accounts and ask the agent to add an ad to an ad set that belongs to a *different* account, Adspirer now catches the mismatch, names both accounts, and points to the right tool — instead of a misleading "missing image" loop. Deselected (inactive) accounts can no longer be written to until you re-activate them.
</Update>

<Update label="May 29, 2026" description="ChatGPT App Store" tags={["New Features", "AI Clients"]}>
  ## Adspirer Is Now in the ChatGPT App Store

  Adspirer is now an **official ChatGPT app** — no more Developer mode, custom connectors, or pasted server URLs. Open **Apps** in ChatGPT, search **"Adspirer,"** click **Connect**, and sign in. Setup takes under a minute, and you invoke it in any chat by mentioning **@adspirer**.

  * **One-click install** — find Adspirer in the ChatGPT App Store and connect with OAuth; ChatGPT manages the connection for you.
  * **No elevated-risk warning** — the old Developer-mode + "I understand and want to continue" flow is gone for ChatGPT users.
  * **Same account, same tools** — all 190+ tools across Google Ads, Meta Ads, LinkedIn Ads, and TikTok work exactly as before. If you previously added Adspirer as a custom connector, remove it and reconnect through the App Store; your account and ad platform connections carry over.

  [ChatGPT App Store setup guide →](/ai-clients/chatgpt)
</Update>

<Update label="May 26, 2026" description="v2.23.1" tags={["Bug Fix"]}>
  ## Platform Hardening & Resilience Fixes

  * **MCP base image hardening** — all six MCP sub-servers (hub + Google + Meta + TikTok + LinkedIn + Monitoring) pinned to `python:3.11-slim-trixie` with audit-pass cryptography and authlib dependencies.
  * **Container scanning by digest** — vulnerability scans resolve images to their content digest instead of the floating `:latest` tag, so the report can't drift between scan time and image promotion.
  * **Tool routing resilience** — tighter input handling on Google Ads tool routing and a longer hub timeout for slow Meta calls.
  * **Watch Agent stability** — finding classifier no longer cascades a stuck SQL transaction into a noisy false-positive.
</Update>

<Update label="May 25, 2026" description="v2.23.0" tags={["New Features", "Meta Ads", "Google Ads", "Agency"]}>
  ## Multi-Google-OAuth, Meta Account Improvements & Per-Platform Cap Messaging

  ### Connect Multiple Google Logins to One Adspirer Account

  A single Adspirer account can now hold **multiple Google OAuth grants**, each with its own non-overlapping set of Google Ads customer IDs. Agencies and consultants who manage Google Ads across separate Google identities no longer need a second Adspirer account.

  * Adds a second (or third) Google login from the **Connections → Google Ads → Add another Google login** flow.
  * Each grant tracks its own customer IDs; the agent routes tool calls to the right OAuth based on the customer you reference.
  * Available on **Max annual** today; rolling to the rest of the paid tiers behind a feature flag.

  ### Meta Ads — Account Discovery & Asset Handling Overhaul

  A set of improvements to how Adspirer works with Meta Business Manager and ad-account-scoped assets.

  * **Business Manager-wide import** — when you connect Meta, Adspirer discovers **every ad account inside the Business Manager** you grant access to, not just the one you happened to click during OAuth. The Manage Accounts modal lists them all so you can pick which ones to activate.
  * **Per-account asset scoping** — image, video, and creative discovery is now scoped to the specific ad account you're targeting. Eliminates the "this asset was discovered but Meta says it's not in this ad account" error class.
  * **Opt-in auto-copy of creatives** — when you reuse a creative from a sibling ad account, Adspirer offers to copy it into the target account before launching the campaign (opt-in per call) so the launch doesn't stall on asset placement.
  * **Clearer "no account" error** — when a tool call can't find a Meta account, the response distinguishes a stale token from a missing-row state so you (or your AI client) know whether to reconnect or just re-select.

  ### Per-Platform Active-Account Messaging

  The active-account cap is **per platform** — every plan card across pricing and the Manage Accounts modal now states up front how many active accounts you get per platform (Google + Meta + LinkedIn + TikTok each counted independently). When you're at the cap, the modal shows an inline upsell that links directly into the Adspirer plan picker.

  ### Smaller Improvements

  * **Sidebar rename** — "Account Setup" is now **Home**. Same page, more accurate label for users past initial setup.
  * **Brief coverage** — scheduled performance briefs are scoped to your selected accounts (not just the primary), with full multi-OAuth coverage so a second Google identity's accounts no longer show up empty.
  * **Live-tail merge** for Google Ads in the brief data fetchers so spend that hit the API after the nightly sweep still lands in your brief.
</Update>

<Update label="May 24, 2026" description="v2.22.0" tags={["New Features", "Billing", "Agency"]}>
  ## Plan Limits, Cap Rework & Connections Panel Refresh

  ### Active-Account Caps — New Per-Tier Limits

  The big change: **annual plans now activate up to 5 accounts per platform**, not 1. Monthly plans (except Max) still cap at 1 per platform. Full table:

  | Plan | Monthly | Annual |
  | ---- | ------: | -----: |
  | Free |       1 |      1 |
  | Plus |       1 |  **5** |
  | Pro  |       1 |  **5** |
  | Max  |   **5** |      5 |

  * "Account" means an ad account on a single platform — Plus annual customers can activate up to 5 Google Ads accounts **and** 5 Meta accounts **and** 5 LinkedIn accounts **and** 5 TikTok accounts.
  * Every Stripe webhook now reconciles down-tier moves automatically: if you downgrade from Max monthly to Plus monthly, excess actives demote to inactive (deterministically — primary-set-first, then most-recently-synced).
  * Caps live in a new `subscription_plan_limits` table so we can adjust without redeploys, and every change is written to a `tier_limit_changes` audit log.
  * **Defense in depth:** the MCP hub also truncates account lists at the tier cap before returning them, so any reconciliation gap can't accidentally let a downgraded user keep agent access to more accounts than their plan allows.

  ### Onboarding & Connections — Smoothed Out

  * **Onboarding Step 5 stays put** — fixed an issue where the Congrats screen would bounce users back to Step 1 if their AppUser stub hadn't finished writing after Stripe checkout. You always land on Step 5 post-payment now.
  * **Connections panel — unified stacked rows** — Available Platforms restyled to compact rows that match the Pipedream integration cards below. The Google Analytics + Klaviyo cards no longer hide below the fold.
  * **OAuth modal always opens** — after a successful OAuth, the account-selection modal opens regardless of how many accounts are under your OAuth identity. No more silent auto-pick when you have multiple accounts and didn't realize.
  * **Tier-aware Manage Accounts modal** with an inline Edit button and a Connections-panel mirror so the active-account picker shows the same state in both surfaces.
  * **Admin: Plan Limits page** with a dry-run preview that counts affected users before you commit a cap change.

  ### Bug Fixes

  * "Add another Google login (coming soon)" placeholder is replaced with a Max-annual upsell that explains how to unlock it today.
  * `get_ad_accounts` now filters out deselected (inactive) accounts so they stop rendering as green Active in the Connected Platforms UI.
</Update>

<Update label="May 22, 2026" description="v2.21.0" tags={["New Features", "Integrations", "Billing"]}>
  ## Google Analytics & Klaviyo Integrations

  Adspirer's first non-ad-platform integrations are live. Plus, Pro, and Max users can now connect **Google Analytics 4** and **Klaviyo** alongside their ad accounts, and the agent can read and act on those properties through chat.

  ### What You Can Do

  | Integration            | Tool               | What it does                                                                                                                                         |
  | ---------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
  | Google Analytics (GA4) | `google_analytics` | Read property data — sessions, conversions, traffic sources, landing-page performance — so the agent can correlate paid ad spend with site behavior. |
  | Klaviyo                | `klaviyo`          | Read campaigns, flows, segments, profiles, and metrics so the agent can pull email/SMS performance alongside paid media.                             |

  Each is a **router tool** — `action="list_tools"` first to discover what's available, then `action="execute"` with the specific Pipedream tool name to call it. The agent handles this two-step automatically.

  ### How It Works

  * Connect from the **Connections** tab at [adspirer.ai](https://adspirer.ai/connections) — each integration has its own OAuth popup powered by Pipedream Connect.
  * Gated to **Plus and above**. Free users see the integration card with a "Upgrade" prompt that links into the Adspirer plan picker.
  * Disconnect anytime from the same panel; idle connections (>90 days) get pruned automatically to keep the integration list tidy.

  ### Self-Serve Account Deletion in the Chat Widget

  Free-tier users can now ask the in-app chat widget to delete their account end-to-end — no email round-trip required. The widget confirms before executing and runs the full GDPR delete (hard-delete + pseudonymize + retain per Article 17(3)(b)).

  ### OpenClaw Plugin v2026.5.12

  Bumped to expose the new integration tools plus 9 additional Google Ads tools (PMax search themes, audience signals, ad group management) and 3 monitoring tools.
</Update>

<Update label="May 21, 2026" description="v2.20.1" tags={["Bug Fix", "Watch Agent", "Monitors"]}>
  ## Watch Agent Polish & Support Widget UX

  ### Watch Agent Briefs

  * **Conversion-tracking caveat** — briefs now include a "conversion data is reported through your platforms" caveat so anomalies in conversion volume aren't read as Adspirer numbers.
  * **Paused vs active classification** — briefs no longer call a paused campaign "underperforming" — paused campaigns are explicitly flagged as paused.
  * **Account names cleaned** — fixed a template placeholder that was occasionally showing up in account labels.
  * **Dead dashboard link replaced** — the in-brief "open dashboard" link is now a copy-paste AI prompt you can run in your AI client to drill into the finding.
  * **Recommendations de-alarmed** — toned down "URGENT" language on routine recommendations so high-severity callouts read as actually high severity.

  ### Monitors & Alerts

  * **`create_monitor` returns 409** when you try to create a duplicate alert instead of silently writing two.
  * **Digest email values corrected** — the daily digest now reports the same value the alert evaluated against, not a stale snapshot.

  ### Support Chat Widget

  * **Address by name** — the in-app support widget greets you by name from turn 1.
  * **Panel state persists** — the widget stays open across page navigations and refreshes, with a time-aware "welcome back" greeting when you return.
</Update>

<Update label="May 20, 2026" description="v2.20.0" tags={["New Features", "Automation", "Watch Agent", "Monitors"]}>
  ## Watch Agent, Monitors & Alerts Web UI, and 8 New MCP Tools

  ### Watch Agent — Proactive Signal

  The **Watch Agent** is a server-side AI agent that scans your connected ad accounts every 15 minutes, identifies issues, and emails you a copy-paste re-entry prompt so you can act immediately inside your AI client. No more waiting for weekly reviews to catch a broken campaign.

  **What the Watch Agent does:**

  * Analyzes ROAS, CPA, CTR, spend, and conversion rate across all connected platforms
  * Distinguishes true anomalies from normal variance (noise suppression built in)
  * Stages pre-validated fix actions (pause campaign, adjust bid, add negatives) alongside each finding
  * Sends a finding email with a ready-to-paste prompt when severity ≥ medium is detected

  **MCP tools for the Watch Agent:**

  | Tool                   | Type  | Description                                                                               |
  | ---------------------- | ----- | ----------------------------------------------------------------------------------------- |
  | `run_watch_now`        | Read  | Trigger an on-demand Watch Agent scan immediately — don't wait for the next scheduled run |
  | `get_signal_briefing`  | Read  | Pull the advisory briefing and pre-staged fixes for a specific Watch Agent finding        |
  | `apply_signal_actions` | Write | Apply the pre-staged fixes from a finding — approve with one call                         |
  | `list_pending_actions` | Read  | See all actions staged by the Watch Agent waiting for your approval                       |
  | `manage_action`        | Write | Approve or reject an individual staged action                                             |

  **Example:**

  ```
  "Run the watch agent on my accounts now"
  → run_watch_now

  "Show me the briefing for signal abc123"
  → get_signal_briefing(signal_id="abc123")

  "Apply the staged fixes"
  → apply_signal_actions(signal_id="abc123")
  ```

  The Watch Agent runs automatically for all connected accounts — no setup required.

  ### Monitors & Alerts — Web UI

  A new **Monitors** page at [adspirer.ai/monitors](https://adspirer.ai/monitors) lets you create and manage performance alerts without opening your AI client. Every alert you create on the web goes to the same backend as the MCP `create_monitor` tool — the Watch Agent reads from one unified table regardless of which surface created the alert.

  **What you can do on the Monitors page:**

  * Create alerts for CPA, ROAS, CTR, CPC, spend, conversions, impressions, clicks, cost per lead, conversion rate, or budget utilization
  * Set thresholds with "goes above" or "drops below" operators
  * Optional: trigger only after N consecutive days (1–14) — filter out one-off noise
  * Scope to specific platforms (Google Ads, Meta, LinkedIn, TikTok) or all connected
  * Edit, pause, resume, test (dry-run), and delete alerts in the dashboard

  **Supported alert metrics:**

  | Metric              | Example threshold                       |
  | ------------------- | --------------------------------------- |
  | CPA                 | Alert when CPA goes above \$50          |
  | ROAS                | Alert when ROAS drops below 2x          |
  | CTR                 | Alert when CTR drops below 1%           |
  | Spend               | Alert when daily spend goes above \$500 |
  | Budget utilization  | Alert when pacing exceeds 110%          |
  | Conversions         | Alert when conversions drop below 1     |
  | Clicks, Impressions | Volume monitoring                       |

  ### 3 More New Monitoring Tools

  | Tool                    | Type  | Description                                                                                |
  | ----------------------- | ----- | ------------------------------------------------------------------------------------------ |
  | `get_monitor_history`   | Read  | See all past trigger events for a specific alert — when it fired, what values triggered it |
  | `test_monitor`          | Read  | Dry-run a monitor against today's data — see whether it would fire without waiting         |
  | `manage_scheduled_task` | Write | Unified pause, resume, or delete for any brief, monitor, or scheduled task                 |

  ### PDF Reports for Scheduled Briefs

  Scheduled performance briefs now **attach a PDF** to the email. The PDF contains the same tables and charts as the email body — useful for sharing with stakeholders who don't have Adspirer access.

  **Monitoring tool count: 8 → 16**
</Update>

<Update label="May 16, 2026" description="v2.19.0" tags={["Billing"]}>
  ## Annual Plans & Max Quota

  ### Annual Quota Pooling

  Annual subscribers now get a **single pooled allowance for the full year** instead of per-month caps. No monthly resets — use your calls whenever you need them.

  | Plan | Annual Price | Annual Pool  | Monthly Equivalent |
  | ---- | ------------ | ------------ | ------------------ |
  | Plus | \$485/year   | 1,800 calls  | \~150/month        |
  | Pro  | \$999/year   | 7,200 calls  | \~600/month        |
  | Max  | \$2,000/year | 50,000 calls | \~4,167/month      |

  * Pool renews on your subscription anniversary date. Unused calls do **not** roll over.
  * Annual subscribers are **never charged overage** — the yearly pool is your total budget for the year.
  * Max annual (50,000) is intentionally higher than 12× monthly (36,000) as the upgrade incentive for high-volume months.

  ### Max Plan: 3,000 calls/month

  The Max plan monthly limit is now formalized at **3,000 calls/month** (previously displayed as "unlimited"). This aligns with the Stripe product metadata and all enforcement layers. Max annual subscribers retain the 50,000/year pool with no monthly cap.

  See the updated [Pricing & Tool Calls](/knowledge-base/pricing) page.
</Update>

<Update label="May 15, 2026" description="v2.18.2" tags={["Bug Fix"]}>
  ## GDPR Article 17 — Right to Erasure

  Account deletion requests (submitted via **[support@adspirer.com](mailto:support@adspirer.com)**) now correctly pseudonymize all associated audit log rows, satisfying GDPR Article 17 right-to-erasure requirements. A bug in the deletion pipeline previously left historical audit rows intact. A one-time backfill also pseudonymized rows from prior deletion requests that had been processed without full erasure.

  <Note>
    Account deletion is handled by the Adspirer support team. To request account deletion, email **[support@adspirer.com](mailto:support@adspirer.com)**.
  </Note>
</Update>

<Update label="May 14, 2026" description="v2.18.1" tags={["TikTok", "Bug Fix"]}>
  ## TikTok: 3 Customer-Blocking Fixes

  Three bugs from live tool call logs that were causing TikTok campaign creation failures.

  ### Local Currency for Budget Floors

  TikTok campaign budget pre-flight checks were using USD as the hardcoded currency regardless of the advertiser's local currency. This caused incorrect minimum budget enforcement for non-USD accounts. The fix fetches the correct currency and timezone from TikTok's API at OAuth connect time, and backfills existing accounts. A one-time database backfill corrected 167 of 170 affected accounts (3 had expired tokens).

  ### Disclaimer Text Format

  Ad disclaimer text must be passed as a structured object (`{"text": "..."}`) rather than a plain string per TikTok's API requirements. Campaigns with a `disclaimer_text` were silently failing at TikTok's server even though the tool accepted the input. The fix wraps string input into the correct object format automatically. Disclaimer text is also now enforced at a max of 90 characters (TikTok's hard limit).

  ### CTA Autocorrect & Full Whitelist

  The `call_to_action` field on TikTok ads previously accepted stale values that TikTok's API would reject at campaign creation time. The field is now backed by:

  * **30-value authoritative whitelist** extracted from TikTok's rejection response
  * **14-alias autocorrect map** for commonly used old values:

  | Old (accepted, now autocorrected) | New (correct)  |
  | --------------------------------- | -------------- |
  | `DOWNLOAD`                        | `DOWNLOAD_NOW` |
  | `BUY_NOW`                         | `SHOP_NOW`     |
  | `INSTALL`                         | `INSTALL_NOW`  |
  | `WATCH`                           | `WATCH_NOW`    |
  | `GET_OFFER`                       | `GET_QUOTE`    |
  | `BOOK`                            | `BOOK_NOW`     |

  Autocorrect applies to all 4 CTA schema fields (campaign creation, video ads, `add_tiktok_ad`, carousel). Invalid values that don't map to an alias return a clear error with the full allowed list.
</Update>

<Update label="May 12, 2026" description="v2.18.0" tags={["New Features", "Google Ads"]}>
  ## Google Ads: Campaign Control Expansion

  18 new capabilities across campaign management, search campaign creation, and asset tools, resolving the top customer-reported gaps from production.

  ### Ad Group Pause / Resume

  Two new tools give you ad group-level control without touching the parent campaign:

  * **`pause_ad_group`** — Pause an individual ad group while leaving the campaign running
  * **`resume_ad_group`** — Resume a paused ad group

  ### `update_campaign` — Expanded Controls

  `update_campaign` now accepts 6 new parameters:

  | Parameter                 | What it does                                                                                                                                                        |
  | ------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | `search_partners`         | Enable or disable the Google Search Partners network                                                                                                                |
  | `display_expansion`       | Enable or disable Display Expansion for Search campaigns                                                                                                            |
  | `language_codes`          | **Replace** the campaign's language targeting (ISO-639-1 codes like `"en"`, `"es"`, `"fr"` or `languageConstants/<id>` resource names from `list_google_languages`) |
  | `locations_to_add`        | Append geo targets (free-text or `geoTargetConstants/<id>` resource names)                                                                                          |
  | `locations_to_remove`     | Remove geo targets by criterion resource name                                                                                                                       |
  | `audience_targeting_mode` | Set `OBSERVATION` (bid adjustments only) or `TARGETING` (targeting restriction)                                                                                     |
  | `ai_max_enabled`          | Enable or disable AI Max for eligible Search campaigns                                                                                                              |

  ### `create_search_campaign` — Per-Keyword Match Types

  Initial keywords in `create_search_campaign` now accept a mixed format:

  * Plain strings default to BROAD (backward compatible)
  * Objects like `{"text": "running shoes", "match_type": "PHRASE"}` set EXACT or PHRASE on individual keywords

  Previously, all initial keywords were forced to BROAD match — requiring a separate `add_keywords` call to set correct match types.

  ### New Asset Tools

  Three new tools for attaching assets to Search campaigns:

  * **`add_business_name_asset`** — Attach a business name text asset (max 25 characters) at the campaign level
  * **`add_call_asset`** — Attach a phone number call asset with country code. Accepts an optional `call_conversion_action` resource name to enable call conversion tracking.
  * **`add_search_campaign_image`** — Attach image assets to Search campaigns (logo, landscape, square, portrait). Accepts HTTP URLs or base64-encoded data URIs.

  ### `get_campaign_structure` — Expanded Fields

  `get_campaign_structure` now surfaces `network_settings` (Search Partners, Display Expansion), EU political content eligibility, and geo target type for each campaign. `get_campaign_targeting` responses now include `resource_name` on each criterion row so you can pass exact IDs to `locations_to_remove`.

  ### Callout Extension Policy

  CTA words in callout extensions (e.g., "Learn More", "Sign Up") were previously silently dropped. They now generate a **warning** in the tool response instead of being removed — giving you visibility into which callouts were affected without blocking campaign creation.

  **Google Ads tool count: 89 → 92**
</Update>

<Update label="May 9, 2026" description="v2.17.3" tags={["New Features", "TikTok", "Google Ads", "Meta Ads", "Billing"]}>
  ## TikTok Deep Overhaul, Google Ads Conversion Tools, and Meta Adset Performance

  ### TikTok Ads — Full SDK Overhaul + Layer 2

  The TikTok integration received its largest overhaul since launch — every customer-blocking bug from production logs was closed and the platform's full API depth is now accessible.

  **Phase 0 — bug fixes (all customer-blocking):** Ad group spec re-architected to 86 fields; creative spec to 59 fields. Image direct-path skips base64 conversion. Slideshow (unsupported by TikTok) removed from code paths. ffmpeg added to Cloud Run for video frame extraction. 5 prod-harness-discovered bugs (pause schema, ValueError hints, image path, envelope, deletes) fixed.

  **Phase 1 — full SDK depth:** All 86 ad-group fields and 59 creative fields from TikTok's marketing API are now surfaced through `add_tiktok_ad_group` and `add_tiktok_ad`. Previously only a subset was accessible.

  **Layer-1 — validity matrix:** 6 common error classes are now caught *before* the API call — saving tool call quota and eliminating confusing API rejection messages.

  **Layer-2 — new tool and rich targeting:**

  | Tool                       | Type | Description                                                                                                                                                                         |
  | -------------------------- | ---- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | `explain_tiktok_objective` | Read | Given your goal (leads, sales, traffic, app installs), returns the correct TikTok campaign objective, recommended ad format, and validity constraints — eliminating trial-and-error |

  **Rich targeting** for `add_tiktok_ad_group` now supports interest filters, behavioral keywords, action categories, carrier/device targeting, and language filters — all available through `search_tiktok_targeting`.

  **Atomic rollback:** If campaign creation fails at any sub-step (ad group or ad level), previously-created resources are automatically rolled back. No more partial campaigns left in your account.

  ### Google Ads — Conversion Tracking Tools

  Two new tools for conversion analysis — separate from the existing `audit_conversion_tracking` health check:

  | Tool                                | Type | Description                                                                                                                       |
  | ----------------------------------- | ---- | --------------------------------------------------------------------------------------------------------------------------------- |
  | `list_conversion_actions`           | Read | List all conversion actions in your Google Ads account (purchases, form fills, phone calls, etc.) with status and tracking method |
  | `get_conversion_action_performance` | Read | Pull conversion metrics (volume, value, CPA) broken down by conversion action — see which actions are actually driving results    |

  `get_campaign_targeting` is also expanded: it now returns all criterion types (location, language, audience, device, ad schedule, topic, content label) instead of just locations and languages.

  ### Google Ads — Ad-Group Extensions

  `add_sitelinks`, `add_callout_extensions`, and `add_structured_snippets` now accept an optional `ad_group_id` parameter. Extensions attached at the ad-group level override campaign-level extensions for that specific ad group — useful for ad groups targeting different products or audiences.

  ### Meta Ads — Ad Set Performance

  A new middle-layer analytics tool between campaign and ad level:

  | Tool                         | Type | Description                                                                                                                                                                                      |
  | ---------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
  | `get_meta_adset_performance` | Read | Pull spend, clicks, CTR, CPA, ROAS, and conversions broken down by ad set within a campaign — see which audience segments and placements are driving results before going to individual ad level |

  Previously, Meta performance tools showed either campaign-level (too broad) or ad-level (too granular) data. Ad set performance fills the gap for budget allocation decisions.

  ### Billing — Plan Management UI

  The **Billing** page now supports plan changes without contacting support:

  * **Downgrades** — Switch from Pro → Plus or Plus → Free directly from the billing page
  * **Interval switching** — Toggle between monthly and annual billing mid-cycle
  * **Max plan visibility** — Max plan capabilities and tool call limits are now shown inline on the billing page

  All plan changes go through Stripe Checkout (same flow as upgrades) for consistent billing history.
</Update>

<Update label="April 30, 2026" description="v2.17.2" tags={["Bug Fix"]}>
  ## Reconnect now resumes metric collection

  Fixed an issue where reconnecting an ad account after an authentication error wouldn't actually resume background metric collection. Previously, if Adspirer auto-paused an account because the platform returned a 401/403 (expired token, revoked permissions), reconnecting through the connections page issued a fresh OAuth token but left `metrics_collection_enabled` set to false — so daily collection kept skipping the account. Customers were effectively reconnecting for nothing.

  Reconnect flows for **Meta Ads, Google Ads, TikTok Ads, and LinkedIn Ads** now automatically clear auth-error pauses on the same user and platform once the new token is saved, restoring daily metric collection without manual intervention. Admin pauses, free-tier pauses, and other auto-pause types are untouched.
</Update>

<Update label="April 29, 2026" description="v2.17.1" tags={["New Features", "Billing", "Agency"]}>
  ## Sequential sub-agents for Max plan

  Max plan users can now run sequential sub-agents across multiple active ad accounts in a single conversation. Instead of switching primary accounts one at a time, mark multiple accounts as active and let Adspirer fan out tool calls across each — perfect for agencies running cross-account audits, weekly briefs, or bulk optimizations from a single prompt.

  ### What's new

  * **Active accounts model** — Max users can have multiple ad accounts marked active per platform simultaneously. Lower tiers continue with the primary-account model.
  * **`list_connected_accounts`** — New system tool that returns every active account across platforms with IDs, names, and status. Reads directly from the database (zero API calls, doesn't count against your quota).
  * **Cross-account workflows** — A single prompt like "run last week's performance brief across all my Google Ads accounts" now triggers per-account sub-agents that aggregate into one consolidated response.
  * **Active set management** — Add or remove accounts from your active set at [adspirer.ai/connections](https://adspirer.ai/connections).

  ### Who this is for

  Agencies, portfolio managers, and anyone managing 3+ ad accounts who currently bounces between primaries. See the updated [Multi-Account Management guide](/knowledge-base/multi-account#sequential-sub-agents-max-plan).
</Update>

<Update label="April 23, 2026" description="v2.17.0" tags={["New Features", "Google Ads"]}>
  ## Google Display Ads — end-to-end CRUD

  Full Google Display Network support joins Search, PMax, YouTube, and Demand Gen. Ships with 27 new MCP tools verified live against Google Ads API v21. Standard Display (full manual control) and Smart Display (Google-managed) are both supported. [Display Ads guide →](/ad-platforms/google-display-ads)

  ### What's new

  * **`create_display_campaign`** — Standard Display (channel=DISPLAY) and Smart Display (sub\_type=DISPLAY\_SMART\_CAMPAIGN) with a single flag. Creates campaign + default ad group + Responsive Display Ad, all PAUSED.
  * **5 targeting surfaces — GET / ADD / REMOVE on each:**
    * `add_display_audiences` — In-market, affinity, custom audiences, user lists, combined audiences
    * `add_display_topics` — Google content categories
    * `add_display_placements` — Specific websites, apps, YouTube channels, YouTube videos
    * `add_display_keywords` — Contextual (always BROAD match on Display)
    * `update_display_demographics` — Age, gender, parental status, income exclusions
    * `remove_display_criteria` — Unified removal across all 5 surfaces
  * **Full CRUD:** `add_display_ad_group`, `add_display_ad`, `update_display_ad_creative` (colors, CTA, images, videos, promo, format\_setting), `update_display_ad_group`, `update_display_campaign_schedule`, `update_display_frequency_caps`, plus remove variants
  * **Geo + language resolvers** — `resolve_google_locations` and `list_google_languages` reject ambiguous inputs ("Baja" surfaces 5 candidates) instead of silently falling back to US. All Google campaign types benefit.
  * **RSA + RDA dispatch** — `update_ad_headlines`, `update_ad_descriptions`, and `update_ad_content` now dispatch on ad type. Responsive Search Ads (3–15 headlines, 2–4 descriptions) and Responsive Display Ads (1–5 headlines, 1–5 descriptions, plus `long_headline`) work side-by-side.
  * **`select_google_campaign_type`** — Now includes `'display'` and `'demandgen'` alongside `'search'`, `'pmax'`, and `'youtube'` with full decision-tree workflows.

  ### OpenClaw plugin update

  OpenClaw bumps to **v2026.4.13**. Tool count goes from 95 → 119 — adds all 22 Display Ads tools + 2 helpers. [OpenClaw agent guide →](/agent-skills/openclaw-agent)

  ### Regressions

  None. RSA users see identical behavior plus clearer validator errors. PMax, Demand Gen, and YouTube still hit the same unchanged paths.
</Update>

<Update label="April 22, 2026" description="v2.16.0" tags={["New Features"]}>
  ## REST API Reference now live

  Every Adspirer tool is now callable over plain HTTP and documented at [adspirer.com/docs/api-reference](/api-reference/introduction). Same 178 endpoints as the MCP server — same auth, same quota, same write-guards — but over request/response JSON so consumers that can't speak SSE (n8n, Zapier, Make, cron jobs, GitHub Actions, your own backend) can use them.

  ### What's included

  * **178 auto-generated endpoint pages** grouped by platform: Google Ads (51), Meta Ads (36), LinkedIn Ads (45), TikTok Ads (29), monitoring (13), general (3), audit (1)
  * **Interactive "Try it" playground** — authorize once with your `sk_live_...` key, call any endpoint from the browser against the real API
  * **REST API overview** with use-case patterns for Slack ChatOps, daily account briefings, portfolio rollups, alert / auto-pause, SaaS product embedding, and headless CI
  * **Architecture sequence diagrams** for each pattern showing how ingress → Adspirer → egress wires up

  ### Base URLs

  |              |                                                                      |
  | :----------- | :------------------------------------------------------------------- |
  | Endpoints    | `https://api.adspirer.ai/api/v1/tools/<tool_name>/execute`           |
  | Swagger UI   | [api.adspirer.ai/docs](https://api.adspirer.ai/docs)                 |
  | OpenAPI spec | [api.adspirer.ai/openapi.json](https://api.adspirer.ai/openapi.json) |

  ### Auth

  Pass your API key as `Authorization: Bearer sk_live_...` — same keys you already use for headless MCP. Generate one at [adspirer.ai/keys](https://adspirer.ai/keys). Free tier includes 15 calls / month.

  ### Idempotency

  Write operations accept an `Idempotency-Key` header. Strongly recommended for n8n, Zapier, and any retry-prone client — a repeated call with the same key returns the cached result instead of creating duplicates.
</Update>

<Update label="April 20, 2026" description="v2.15.5" tags={["Billing"]}>
  ## Pay-as-you-go overage for Plus subscribers

  Plus plan subscribers no longer hit a hard stop at 150 tool calls. After your included calls are used, you can keep working at **$0.50 per additional call**, capped at **$50/month** in overage charges.

  ### How it works

  * Overage billing is **auto-enabled** for all Plus subscribers
  * Your first 150 calls are included in your \$49/month subscription
  * After 150 calls, each additional call is billed at \$0.50 through Stripe
  * Monthly overage is capped at $50 — your maximum bill is $99/month
  * Disable overage anytime from your billing page to revert to the previous behavior (hard stop at 150 calls)

  ### Usage notifications

  * At **135 calls** (90%): one-time notification that overage billing kicks in after 150
  * At **151 calls**: one-time notification that you're now on usage-based billing
  * All other overage calls: no interruptions — just keep working

  ### Tier-specific messaging

  * **Plus:** Minimal notifications during overage — you're paying for usage, so no nagging
  * **Pro:** Usage stats shown without upgrade prompts
  * **Max:** No usage hints — high included limit, don't worry about it

  See the updated [Pricing & Tool Calls](/knowledge-base/pricing#overage-billing-plus-plan) page.
</Update>

<Update label="April 16, 2026" description="v2.15.4" tags={["New Features", "Google Ads", "Meta Ads", "LinkedIn", "TikTok"]}>
  ## Raw data mode for all performance tools

  All 29 performance and analytics tools across Google Ads, Meta Ads, LinkedIn Ads, and TikTok Ads now accept a `raw_data` parameter. When set to `true`, tools return a compact JSON code block with only raw metrics (spend, clicks, impressions, conversions, CPA, CPC, CTR, CVR, ROAS) — stripped of severity labels, suggested bids/budgets, industry benchmarks, and optimization recommendations.

  **Default behavior is unchanged.** Existing markdown output with recommendations is returned unless you explicitly pass `raw_data=true`.

  ### When to use raw data mode

  * You run your own attribution model and want raw numbers only
  * You want to minimize token usage in AI client responses
  * You're piping metrics into a spreadsheet, dashboard, or external tool

  ### Supported tools

  | Platform   | Tools with `raw_data` support                                                                                                                                                                                                                                       |
  | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
  | Google Ads | `get_campaign_performance`, `analyze_wasted_spend`, `optimize_budget_allocation`, `analyze_search_terms`, `explain_performance_anomaly`                                                                                                                             |
  | Meta Ads   | `analyze_meta_campaign_performance`, `analyze_meta_ad_performance`, `analyze_meta_wasted_spend`, `optimize_meta_budget`, `analyze_meta_audiences`, `detect_meta_creative_fatigue`, `optimize_meta_placements`, `explain_meta_anomaly`, `get_meta_audience_insights` |
  | LinkedIn   | `get_linkedin_campaign_performance`, `analyze_linkedin_engagement`, `get_linkedin_audience_insights`, `analyze_linkedin_wasted_spend`, `optimize_linkedin_budget`, `explain_linkedin_anomaly`, `analyze_linkedin_creative_performance`                              |
  | TikTok     | `get_tiktok_campaign_performance`, `get_tiktok_ad_performance`, `analyze_tiktok_wasted_spend`, `optimize_tiktok_budget`, `detect_tiktok_creative_fatigue`, `explain_tiktok_anomaly`, `get_tiktok_audience_insights`, `analyze_tiktok_geo_performance`               |

  ### Example

  ```
  "Show me last 30 days campaign performance with raw data"
  ```

  The tool returns a fenced JSON block like:

  ```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
  {
    "campaigns": [
      {
        "name": "Brand Search - US",
        "spend": 1250.00,
        "clicks": 3400,
        "impressions": 45000,
        "conversions": 85,
        "cpa": 14.71,
        "cpc": 0.37,
        "ctr": 0.0756,
        "roas": 4.2
      }
    ]
  }
  ```

  ### Free tier access fix

  Free-tier users who previously had a failed or paused Stripe subscription attempt were incorrectly blocked from using MCP tools. This is now fixed — free-tier users are gated only by their usage quota, as intended.
</Update>

<Update label="April 16, 2026" description="v2.15.3" tags={["TikTok", "Bug Fix"]}>
  ## TikTok Ads: correct optimization event values

  The `optimization_event` parameter on `create_tiktok_campaign`, `add_tiktok_ad_group`, and `add_tiktok_ad` previously listed invalid values (`SUBMIT_FORM`, `ADD_TO_CART`, `VIEW_CONTENT`, `COMPLETE_REGISTRATION`, `DOWNLOAD`, `CONTACT`, `BUTTON_CLICK`) that TikTok's API would reject.

  **Correct values you should use:**

  | Old (invalid)           | New (correct)        | Meaning                     |
  | ----------------------- | -------------------- | --------------------------- |
  | `SUBMIT_FORM`           | `FORM`               | Form submission             |
  | `ADD_TO_CART`           | `ON_WEB_CART`        | Add to cart                 |
  | `VIEW_CONTENT`          | `ON_WEB_DETAIL`      | View content / product page |
  | `COMPLETE_REGISTRATION` | `ON_WEB_REGISTER`    | Registration                |
  | `DOWNLOAD`              | `DOWNLOAD_FINISH`    | App or file download        |
  | `CONTACT`               | `CONSULT`            | Contact / consultation      |
  | `BUTTON_CLICK`          | `CLICK_LANDING_PAGE` | Landing page click          |

  Additional supported values: `COMPLETE_PAYMENT`, `CONVERSION_LEADS`, `PAGE_VISIT`, `PHONE_CONNECT`, `SEARCH`, `SUBSCRIBE`, `INITIATE_ORDER`, `ON_WEB_SUBSCRIBE`.

  If you were passing the old values and getting TikTok API errors, update to the new values above.
</Update>

<Update label="April 13, 2026" description="v2.15.2" tags={["TikTok", "Meta Ads", "Bug Fix"]}>
  ## TikTok Ads: campaign creation reliability

  5 fixes to TikTok campaign creation from production testing.

  * **Spark Ads now work with `create_tiktok_campaign`** — creating campaigns with a `tiktok_item_id` (Spark Ads) or `card_id` (Carousel) no longer fails with "Unknown error". Spark and Carousel ads are now created directly without requiring an image upload.
  * **All TikTok CTAs accepted** — previously, only 6 call-to-action values (like LEARN\_MORE and SHOP\_NOW) were allowed. Now any CTA supported by TikTok works — including CONTACT\_US, BOOK\_NOW, GET\_QUOTE, and others. TikTok validates CTAs server-side.
  * **Automatic placement fix** — campaigns using automatic placement no longer fail with "Missing required field(s): placements."
  * **TikTok page URL detection** — passing a TikTok page URL (e.g., `https://tiktok.com/@user/video/123`) as a video URL now returns a clear error explaining you should use `tiktok_item_id` for Spark Ads or provide a direct MP4/MOV link.
  * **CTA auto-default** — when creating an ad with a `landing_page_url` but no `call_to_action`, Adspirer now defaults to LEARN\_MORE instead of failing with "External\_URL and Call\_to\_action must exist together."

  ## Meta Ads: disclaimer acceptance before connecting

  When connecting your Meta Ads account, you now see a disclaimer checkbox after entering your email. You must accept the disclaimer — confirming you understand that Adspirer operates independently from Meta's account enforcement systems — before the Connect button becomes available. Acceptance is recorded for compliance purposes. See [Connecting Meta Ads](/ad-platforms/meta-ads#connecting-meta-ads).

  The Meta Ads page and [Security](/knowledge-base/security#what-this-means) page also now confirm Adspirer has Meta approved **Ads Management Standard Access**, so users know the app is verified by Meta to use the Marketing API.

  ## Platform Terms & Conditions

  New users now accept Platform Terms & Conditions as part of onboarding before connecting ad accounts. The terms cover account authorization requirements, rate limit safeguards, platform enforcement policies, financial responsibility, and liability. This replaces the previous per-platform disclaimer prompts with a single, comprehensive agreement.

  ## Faster email support

  Email support response time improved from 1 business day to **2–4 hours** (San Francisco / PST). Reach us at [support@adspirer.com](mailto:support@adspirer.com).
</Update>

<Update label="April 8, 2026" description="v2.15.1" tags={["New Features", "Meta Ads", "Monitors"]}>
  ## Meta Ads: expanded tool coverage (21 → 36)

  Meta Ads now has **36 tools** (up from 21), covering the full campaign lifecycle — from browsing and creation to ad set management, creative rotation, and lead form submissions.

  ### New tools

  * **Ad set & ad management:** `add_meta_ad_set`, `add_meta_ad`, `update_meta_ad_set`, `update_meta_ad`, `list_meta_ad_sets`, `list_meta_ads`
  * **Campaign management:** `list_meta_campaigns`, `get_meta_campaign_details`, `duplicate_meta_campaign`, `resume_meta_campaign`
  * **Creative & lead gen:** `create_meta_dco_ad` (Dynamic Creative Optimization), `get_meta_ad_creatives`, `list_meta_lead_forms`, `get_meta_lead_form_submissions`
  * **Account discovery:** `list_meta_instagram_accounts`, `list_meta_pixels`
  * **Analytics:** `analyze_meta_wasted_spend`, `get_meta_audience_insights`

  ### Monitoring improvements

  * `create_monitor` now lists all 15 supported metrics (roas, ctr, cpc, cpa, cpm, cpv, spend, conversions, impressions, clicks, cost\_per\_lead, conversion\_rate, budget\_utilization, video\_views, engagement\_rate)
  * Advanced monitoring: AND/OR logic across multiple conditions, consecutive-day triggers, relative thresholds, percentage change detection, campaign-level targeting, and auto-actions (pause campaign, adjust budget)

  ## Meta Ads: ad set parity and custom audience reliability

  ### `add_meta_ad_set` now supports all campaign-level features

  When adding ad sets to existing Meta campaigns, you can now use the same parameters that were previously only available at campaign creation:

  * **Lifetime budgets** — set `budget_lifetime` on individual ad sets
  * **End dates** — set `end_time` on ad sets (required when using lifetime budgets)
  * **Multi-advertiser opt-out** — control `multi_advertiser` per ad set
  * **Granular placements** — set `publisher_platforms`, `facebook_positions`, and `instagram_positions` per ad set

  ### Custom conversion tracking fix

  `custom_conversion_id` is now properly decomposed into its underlying pixel and event configuration before being sent to Meta. Previously, passing a custom conversion ID could cause a Meta API error on campaign or ad set creation. Adspirer now automatically resolves the conversion via the Meta API and applies the correct pixel ID and event type.

  ### `list_meta_custom_audiences` reliability

  * Timeout increased from 30 seconds to 90 seconds — accounts with 1,000+ audiences no longer time out
  * Audience status now displays as clean labels ("Active", "Paused") instead of raw SDK objects
</Update>

<Update label="April 7, 2026" description="v2.15.0" tags={["New Features", "TikTok"]}>
  ## TikTok Ads: full performance analytics

  8 new performance analytics tools bring TikTok to parity with Google and Meta for campaign analysis. Total TikTok tools: 4 → 31.

  ### New analytics tools

  | Tool                              | Description                                                        |
  | --------------------------------- | ------------------------------------------------------------------ |
  | `get_tiktok_campaign_performance` | Campaign summary with TikTok-specific video and engagement metrics |
  | `get_tiktok_ad_performance`       | Ad-level analysis with hook rate, video completion, and engagement |
  | `analyze_tiktok_wasted_spend`     | ROAS-based waste detection with campaign status awareness          |
  | `optimize_tiktok_budget`          | LP-based budget allocation recommendations                         |
  | `detect_tiktok_creative_fatigue`  | Hook rate decline as the primary fatigue signal                    |
  | `explain_tiktok_anomaly`          | Statistical deviation detection with TikTok-specific metrics       |
  | `get_tiktok_audience_insights`    | Age/gender breakdown with CPA ranking                              |
  | `analyze_tiktok_geo_performance`  | Country-level performance analysis                                 |

  ### TikTok now fully available

  TikTok Ads is no longer marked "Coming Soon" during onboarding. You can connect your TikTok Ads account directly from the setup flow.
</Update>

<Update label="April 5, 2026" description="v2.14.1" tags={["New Features", "TikTok", "Google Ads"]}>
  ## TikTok campaign management and creation

  19 new tools for full campaign lifecycle management on TikTok — from campaign creation through ad group and ad management, including Spark Ads, Carousel, and APP\_PROMOTION support.

  ### New campaign management tools (12)

  * `list_tiktok_campaigns` — List all campaigns with status, objective, and budget
  * `get_tiktok_campaign_details` — Detailed campaign info
  * `pause_tiktok_campaign` / `resume_tiktok_campaign` — Control campaign status
  * `update_tiktok_campaign` — Update name, budget, budget mode
  * `list_tiktok_ad_groups` / `pause_tiktok_ad_group` / `resume_tiktok_ad_group` / `update_tiktok_ad_group` — Full ad group management
  * `list_tiktok_ads` / `pause_tiktok_ad` / `resume_tiktok_ad` — Ad-level management

  ### New campaign creation tools (7)

  * `add_tiktok_ad_group` — Add ad groups with full targeting to existing campaigns
  * `add_tiktok_ad` — Add ads to existing ad groups (image, video, Spark Ads, Carousel)
  * `create_tiktok_carousel_card` — Create carousel cards from multiple images
  * `upload_tiktok_images` — Upload images to TikTok Asset Library
  * `search_tiktok_targeting` — Search interests, keywords, regions, languages, action categories, carriers, and device models

  ### New ad formats

  * **Spark Ads** — Boost existing TikTok organic posts as ads
  * **Carousel Ads** — Multi-image carousel format
  * **APP\_PROMOTION** — App install campaign objective with app ID configuration

  ### Campaign Budget Optimization (CBO)

  TikTok campaigns now support `budget_optimize_on` for campaign-level budget optimization. TikTok CBO is on by default — set to `false` to manage budgets per ad group manually.

  ### Google Ads fixes

  * `get_campaign_targeting` — New tool to view location targeting on existing campaigns
  * `get_campaign_structure` — Now paginated for large accounts
  * `analyze_search_terms` — New `raw_report` mode shows actual search terms users type into Google
  * Keyword removal now validates IDs before attempting deletion, with per-keyword error reporting
</Update>

<Update label="April 3, 2026" description="v2.13.1" tags={["New Features", "LinkedIn", "Meta Ads"]}>
  ## LinkedIn Ads overhaul + Meta Ads gaps closed

  ### LinkedIn campaign hierarchy and targeting

  Complete overhaul of LinkedIn campaign tools with campaign group support, rollback logic, and 14 new targeting facets.

  * **Campaign groups** — `campaign_group_id` and `campaign_group_name` on all create tools. New `add_linkedin_campaign_to_group` tool for adding campaigns to existing groups.
  * **Carousel creatives** — New `add_linkedin_carousel_creative` tool
  * **Creative naming** — `creative_name` field added to all 4 campaign creation tools
  * **14 new targeting facets** — skills, job functions, interests, degrees, fields of study, employers, groups, age ranges, genders, schools, member behaviors, years of experience, followed companies, and buyer groups. All facets work on both create and update.
  * **Video discovery** — Now finds videos uploaded via LinkedIn Campaign Manager UI, not just API uploads
  * **Rollback logic** — Failed campaigns are automatically archived to prevent duplicates on retry
  * **Campaign filtering** — `list_linkedin_campaigns` now filters by campaign group

  ### Meta Ads: 6 critical gaps

  * **Lifetime budgets** — Set `budget_lifetime` at campaign creation (mutually exclusive with daily budget)
  * **End dates** — `end_time` support on campaigns and ad sets
  * **Custom audiences** — New `list_meta_custom_audiences` tool for viewing database lists, lookalikes, website, and engagement audiences
  * **Granular placements** — Control `publisher_platforms`, `facebook_positions`, and `instagram_positions` at campaign creation
  * **Multi-advertiser opt-out** — New `multi_advertiser` field to opt out of Meta's multi-advertiser ads
  * **Custom conversion tracking** — Fixed `custom_conversion_id` being silently dropped on image and carousel campaigns

  ### Monitoring

  * New `delete_monitor` tool — Previously, deleting monitors required knowing about `manage_scheduled_task`, which AI clients couldn't discover
</Update>

<Update label="April 3, 2026" description="v2.13.0" tags={["AI Clients"]}>
  ## Gemini CLI Extension

  Adspirer is now available on the [Gemini CLI Extensions Gallery](https://geminicli.com/extensions/?name=amekalaads-mcp). Google's terminal-based AI tool can now manage your ad campaigns across all 4 platforms.

  ### Install

  ```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
  gemini extensions install https://github.com/amekala/ads-mcp
  ```

  ### What's Included

  * **MCP Server** — 100+ tools across Google Ads, Meta Ads, LinkedIn Ads, and TikTok Ads
  * **5 Slash Commands** — `/adspirer:setup`, `/adspirer:performance-review`, `/adspirer:write-ad-copy`, `/adspirer:wasted-spend`, `/adspirer:refresh`
  * **OAuth authentication** — browser opens automatically on first use

  See the full [Gemini CLI Setup Guide](/ai-clients/gemini-cli).
</Update>

<Update label="March 30, 2026" description="v2.12.0" tags={["AI Clients"]}>
  ## Official Claude Plugin

  Adspirer is now an **official plugin** in the Claude plugin marketplace (`claude-plugins-official`). Available on both [Claude Code](/ai-clients/claude-code) and [Claude Cowork](/ai-clients/claude-cowork).

  ### What Changed

  * **No more custom marketplace setup.** Previously, you had to manually add the `amekala/ads-mcp` marketplace before installing. Now just search for "adspirer" in the plugin browser.
  * **Claude Code:** Type `/plugin`, search "adspirer", and install `adspirer-ads-agent` directly. Or run `/plugin install adspirer-ads-agent`.
  * **Claude Cowork:** Go to Customize → Browse Plugins and search for "adspirer" — install with one click.
  * **Plugin page:** [claude.com/plugins/adspirer-ads-agent](https://claude.com/plugins/adspirer-ads-agent)

  ### What's Included

  The official plugin bundles everything in a single install:

  * **MCP Server** — 100+ tools across Google Ads, Meta Ads, LinkedIn Ads, and TikTok Ads
  * **5 Slash Commands** — `/setup`, `/performance-review`, `/write-ad-copy`, `/wasted-spend`, `/refresh-brand-context`
  * **2 Skills** — Ad campaign management and best practices
  * **1 Agent** — Performance marketing agent with safety rules

  Updated setup guides for [Claude Code](/ai-clients/claude-code) and [Claude Cowork](/ai-clients/claude-cowork) to reflect the simplified installation flow.
</Update>

<Update label="March 25, 2026" description="v2.11.0" tags={["New Features", "Google Ads", "Meta Ads"]}>
  ## Lead Gen Campaign Support

  Full lead generation support across Google Ads and Meta Ads — performance analysis, wasted spend, and audience tools now handle lead gen campaigns correctly.

  ### Google Ads Lead Gen

  * Performance analysis, wasted spend, and audience tools now work for campaigns optimized for leads. Previously, tools could crash or show incorrect metrics for lead gen campaigns.
  * Conversion metrics now use primary conversions only (`metrics.conversions`), matching what you see in the Google Ads UI. Previously, Adspirer reported all conversions including secondary actions, which inflated numbers.
  * PMax search themes now correctly apply to the specified asset group, not the first one found.

  ### Meta Ads Lead Gen

  * All performance tools — `analyze_meta_campaign_performance`, `analyze_meta_ad_performance`, `get_meta_wasted_spend`, and audience analysis — now support lead gen campaigns (OUTCOME\_LEADS optimization).
  * CPA calculation now uses the ad set's optimization event instead of dividing by total conversions. If you're optimizing for leads, CPA reflects cost-per-lead, not cost-per-all-actions.
  * Audience CPA sort order now shows lowest CPA first for lead gen campaigns.

  ### Audience Search Fix

  * `search_audiences` now returns results for multi-word queries (e.g., "digital marketing" or "home improvement"). Previously, multi-word searches returned zero results, causing AI clients to fabricate audience IDs.
  * DemandGen and YouTube tools now validate audience segment IDs against the API instead of accepting AI-generated IDs that don't exist.

  ### OpenClaw Plugin Fix

  Fixed empty-argument bug affecting all 143 tools. The OpenClaw plugin now ships complete input schemas, so tools receive the parameters you provide instead of empty objects.

  ### Faster Tool Responses

  * Google Ads account list cached in Redis (3-minute TTL) — subsequent tool calls skip the account discovery API call.
  * All Google Ads data cache TTLs increased to 10 minutes — repeat queries (e.g., checking campaign performance twice) return instantly from cache.
</Update>

<Update label="March 24, 2026" description="v2.10.0" tags={["Bug Fix", "Google Ads", "Meta Ads"]}>
  ## Google Ads Rate Limit Fix & MCC Reliability

  ### Rate Limit Resolution (P0)

  Fixed a critical issue where Google Ads API rate limits (HTTP 429) could block **all users** — not just the affected account. The system now caches account list responses and includes an emergency recovery endpoint. Users who were seeing "Resource has been exhausted" errors should no longer be affected by other accounts' API usage.

  ### MCC Account Fixes

  * Child accounts under MCC (My Client Center) manager accounts now correctly resolve their `login_customer_id` during onboarding and tool calls. Previously, some MCC child accounts would fail with "The caller does not have permission" errors.
  * Direct (non-MCC) accounts are no longer incorrectly mapped to an MCC manager, which caused "customer not found" errors for users with standalone ad accounts.
  * `login_customer_id` is now stored in the database, eliminating a `ListAccessibleCustomers` API call on every tool call — faster and more reliable.

  ### Meta Ads CPA Fix

  CPA for Meta campaigns now uses the ad set's optimization event (e.g., cost per lead, cost per purchase) instead of dividing spend by total conversions. This was especially inaccurate for lead gen campaigns where secondary events inflated the denominator.
</Update>

<Update label="March 22, 2026" description="v2.9.7" tags={["Bug Fix", "Google Ads", "LinkedIn", "Meta Ads"]}>
  ## Error Clarity, LinkedIn & Meta Fixes

  ### Google Ads Error Messages

  * Centralized error parsing across all 18 Google Ads write operations. Errors now show the specific field and issue (e.g., "headline exceeds 30 characters") instead of raw API codes.
  * `add_keywords` now detects policy violations (trademark, restricted content) and provides specific guidance.
  * `update_bid_strategy` returns actionable error details when a strategy change fails, instead of just the strategy name.

  ### LinkedIn Improvements

  * `search_linkedin_targeting` now uses LinkedIn's typeahead API for better, faster targeting search results. Facet names (job title, company, industry) are correctly mapped to LinkedIn's API format.
  * Fixed parameter mismatches, null handling, and error parsing across LinkedIn Ads tools.

  ### Meta Ads Fixes

  * `add_meta_ad` and `add_meta_ad_set` now honor the name you provide. Previously, the user-provided name was silently ignored.
  * `add_keywords` routing fix — calls now use the correct code path with policy violation detection.

  ### OAuth Fix

  Fixed a 500 error on the OAuth authorization page. Users connecting via ChatGPT or Claude would see a server error instead of the consent screen.
</Update>

<Update label="March 21, 2026" description="v2.9.6" tags={["New Features", "LinkedIn", "Google Ads"]}>
  ## LinkedIn Creatives & Campaign Enhancements

  ### LinkedIn Creatives

  * Fixed `list_linkedin_creatives` returning empty results for large accounts (22,000+ creatives). Pagination now handles all account sizes correctly.
  * Fixed duplicate creatives appearing in results due to pagination overlap.
  * Rewrote creative filtering to use LinkedIn's server-side FINDER API, eliminating timeouts on campaign-level creative lookups.
  * Fixed LinkedIn metrics silently dropping to zero, MCP timeout on large result sets, and pagination breaking on no-match scenarios.

  ### Google Ads Campaign Extensions

  * Added `MAXIMIZE_CONVERSION_VALUE` as a supported bidding strategy for all campaign types.
  * Extensions (sitelinks, callouts, snippets) are now added in a single batch operation instead of individually, reducing API calls and errors.
  * Automatic retry on `CONCURRENT_MODIFICATION` errors when multiple operations target the same campaign.

  ### PMax, Demand Gen & YouTube

  Your business logo is now automatically injected into PMax, Demand Gen, and YouTube campaigns during creation — no need to provide it manually if one exists at the account level.

  ### Monitoring

  Fixed `create_monitor` using a 30-minute default check interval, which was below the API minimum of 1,440 minutes (24 hours). Monitors now default to a valid interval.
</Update>

<Update label="March 21, 2026" description="v2.9.5" tags={["AI Clients"]}>
  ## Perplexity Computer Support

  ### New AI Client: Perplexity

  Adspirer now supports [Perplexity](/ai-clients/perplexity) as an AI client via MCP connector. Connect Adspirer to Perplexity Computer — the autonomous AI agent — and combine real-time web research with 100+ advertising tools.

  * **OAuth setup** — Add Adspirer as a custom connector in Perplexity Computer → Connectors. OAuth auto-discovery means zero configuration beyond the URL.
  * **Search + ads** — Perplexity's native web search lets you research competitors and market trends, then immediately act on that research using Adspirer tools. No other client combines real-time search with ad management this seamlessly.
  * **Perplexity Computer** — Max subscribers get autonomous multi-step workflows: research → create → optimize, all from a single prompt.
  * **Requires** Perplexity Pro ($20/mo), Max ($200/mo), or Enterprise.

  Updated all documentation pages, Knowledge Base, and cross-references to include Perplexity as a supported AI client.
</Update>

<Update label="March 21, 2026" description="v2.9.4" tags={["Bug Fix", "Google Ads"]}>
  ## Audience Targeting Fixes for Demand Gen, YouTube & PMax

  ### Custom Interest Audiences Now Work in Demand Gen & YouTube

  Custom interest audiences (custom segments) were not being applied when creating Demand Gen or YouTube campaigns — even though the tool response showed them as set up. Remarketing audiences worked correctly, but custom interest targeting was silently dropped. This is now fixed. All audience segment types (in-market, affinity, custom audiences, and remarketing lists) work consistently across PMax, Demand Gen, and YouTube campaigns.

  ### PMax: No More Unwanted Search Themes on Remarketing Campaigns

  When creating a PMax campaign with only remarketing audiences and no search themes, the system was auto-generating search themes from your ad headlines. If you only ask for audience targeting, search themes will no longer be added automatically.
</Update>

<Update label="March 19, 2026" description="v2.9.3" tags={["Bug Fix"]}>
  ## Stable MCP Sessions

  ### No More Intermittent "Invalid Token" Errors

  Fixed an issue where some tool calls would randomly fail with "Invalid or expired token" — especially after being idle for a while. Sessions are now resilient to Clerk session expiry. If a session token becomes stale, the system automatically recovers without requiring you to reconnect.
</Update>

<Update label="March 18, 2026" description="v2.9.2" tags={["Billing", "Bug Fix"]}>
  ## Billing & Onboarding UX

  ### Billing Page

  * Fixed pricing display and plan comparison layout
  * Fixed broken navigation between billing sections
  * Improved upgrade/downgrade CTA logic

  ### Onboarding

  * Fixed layout and scroll issues on onboarding screens
  * Plan tier messaging now accurately reflects current pricing
  * Save badge visibility fixed
</Update>

<Update label="March 17, 2026" description="v2.9.1.1" tags={["Bug Fix", "Automation"]}>
  ## Automation Tools: Multi-Platform Fix

  Scheduled briefs, monitoring alerts, and on-demand reports now work correctly for **all platforms** — Meta Ads, LinkedIn Ads, and TikTok Ads. Previously, automation tools only worked reliably for Google Ads. Monitors set to track "all platforms" were silently resolving to zero accounts.
</Update>

<Update label="March 16, 2026" description="v2.9.1" tags={["AI Clients", "Bug Fix"]}>
  ## Persistent MCP Sessions & Faster Auth

  ### No More Frequent Reconnects

  MCP access tokens now last **1 week** instead of 1 hour. Claude, ChatGPT, Codex, and Cursor sessions stay authenticated much longer — no more "Error occurred during tool execution" after stepping away for an hour.

  Diagnostic tools (`get_usage_status`, `get_connections_status`) remain available even when your quota is exhausted, so you can always check your account status.

  ### Faster Tool Responses

  Added an in-process auth cache that eliminates repeated token verification overhead. Subsequent tool calls in the same session resolve authentication instantly instead of re-verifying on every request.

  ### Manus AI Client Support

  New setup guide for connecting Adspirer to [Manus](/ai-clients/manus) — the autonomous AI agent. Manus connects via API key authentication with Streamable HTTP transport. Import Adspirer skills directly from GitHub for campaign management workflows.

  ### Meta Ads Fix

  Meta tools now always pass the correct connected ad account ID. Previously, some Meta tools could fail with "No ad account found" even when an account was connected.

  ### LinkedIn Ads Fix

  Fixed currency formatting for LinkedIn campaign metrics. Campaigns with non-USD currencies now display correctly instead of showing raw API values.

  ### Faster Google Ads Account Loading

  Google Ads account connections now load with lazy pagination and parallel processing. The connections page loads instantly instead of waiting for all accounts to resolve.
</Update>

<Update label="March 15, 2026" description="v2.9.0" tags={["Billing", "Bug Fix"]}>
  ## Quota Experience & Error Clarity

  Completely overhauled how Adspirer communicates quota limits and errors across all AI clients.

  ### Usage Warnings Before You Hit the Wall

  Tool responses now include a visible usage footer when you're approaching your quota limit:

  * **75%+ usage** — `📊 12/15 free calls used (80%) — 3 remaining. Upgrade: ...`
  * **90%+ usage** — `🚨 2 calls remaining! Upgrade now to avoid interruption: ...`

  Previously, usage warnings were only visible in ChatGPT's widget. Now they appear on **all clients** — Claude, Claude Code, Cursor, Codex, and ChatGPT.

  ### Diagnostic Tools Always Available

  `get_usage_status`, `get_connections_status`, and `echo_test` now work even when your quota is exhausted. You can always check your usage and connection status regardless of your remaining calls. These tools don't count against your quota.

  ### Clear Error Messages

  * **Quota exceeded** — shows a clean upgrade message with pricing and payment link (previously showed a generic "Error occurred during tool execution" on Claude)
  * **Session expired** — now tells you exactly what happened and how to reconnect (previously showed the same generic error)
  * **Server errors** — include the actual error details and retry guidance
</Update>

<Update label="March 14, 2026" description="v2.8.2" tags={["New Features", "Google Ads", "Meta Ads"]}>
  ## Demand Gen: Multi-Region Ad Groups

  Add ad groups to existing Demand Gen campaigns with `add_demandgen_ad_group`:

  * Each ad group can target **different locations** (e.g., US cities vs India cities vs UAE cities)
  * Each ad group can have its own **audience signals** (in-market + affinity segments)
  * Reuse existing account images and YouTube videos across ad groups
  * Different creative variations per ad group

  ### Meta Ads: City Targeting & Placement Creatives

  * **City-level targeting** — target specific cities in Meta campaigns with `search_meta_targeting`
  * **Placement-specific creatives** — upload different images for Feed, Stories, and Reels placements
  * **Emoji support** — use emoji in Meta ad headlines and descriptions

  ### AI Client Input Resilience

  Adspirer now handles common input mistakes from AI clients automatically:

  * JSON strings sent as text instead of objects are auto-parsed
  * Integer IDs sent instead of strings are auto-coerced
  * Extra whitespace and unknown fields are silently handled
  * Works across all 100+ tools — no more validation errors from formatting issues
</Update>

<Update label="March 12, 2026" description="v2.8.1" tags={["New Features", "Google Ads"]}>
  ## PMax: Multiple Asset Groups & Bidding Control

  * **Multiple asset groups per campaign** — create campaigns with distinct asset groups for different product lines or audiences
  * **Bidding strategy control** — your explicit bidding choice (Maximize Conversions, Target ROAS, etc.) is now always honored
  * **Auto-derived search themes** — search themes are automatically suggested from your headlines and descriptions
  * **Post-creation nudge** — after creating a PMax campaign, you're prompted to add search themes and audience signals
</Update>

<Update label="March 10, 2026" description="v2.8.0" tags={["New Features", "Google Ads", "Meta Ads"]}>
  ## Demand Gen Campaign Creation

  Full support for Google Demand Gen campaigns — reach users across YouTube, Discover, Gmail, Display, and Maps from a single campaign.

  Create Demand Gen campaigns with `create_demandgen_campaign`:

  * **Multi-asset format** — landscape, square, and portrait images with headlines and descriptions
  * **Video responsive format** — YouTube videos with text overlays
  * Automatic sitelink, callout, and structured snippet extensions
  * Location and language targeting at the campaign level
  * All bidding strategies supported: Maximize Clicks, Maximize Conversions, Target CPA, Target ROAS

  ### Audience Targeting

  * In-market and affinity audience segments via `search_audiences`
  * Reuse existing audiences from Google Ads UI
  * Per-ad-group audience customization

  ### Meta Ads Fixes

  * Fixed lead form handling for OUTCOME\_LEADS and OUTCOME\_ENGAGEMENT campaigns
  * Fixed Meta page and Instagram account lookup for business accounts
  * Wasted spend analysis now respects learning phase and minimum spend thresholds
</Update>

<Update label="March 11, 2026" description="v2.7.0" tags={["New Features", "Google Ads"]}>
  ## PMax Search Themes & Audience Signals

  Added 7 new tools for managing search themes and audience signals on Google Ads Performance Max campaigns. These PMax-only features give you direct control over how Google's automation targets search queries and audience segments.

  ### New Tools

  | Tool                          | Type  | Description                                                                         |
  | ----------------------------- | ----- | ----------------------------------------------------------------------------------- |
  | `add_pmax_search_themes`      | Write | Add search themes to guide PMax targeting (max 50 per asset group)                  |
  | `get_pmax_search_themes`      | Read  | View current search themes on a PMax campaign                                       |
  | `remove_pmax_search_themes`   | Write | Remove specific search themes                                                       |
  | `add_pmax_audience_signal`    | Write | Add audience signal combining in-market, affinity, custom audiences, and user lists |
  | `get_pmax_audience_signals`   | Read  | View current audience signals                                                       |
  | `remove_pmax_audience_signal` | Write | Remove an audience signal                                                           |
  | `search_audiences`            | Read  | Search for audiences by keyword across all Google Ads audience types                |

  ### Search Themes

  Short phrases (max 50 per asset group) that tell Google which search queries your PMax campaign should target. They supplement Google's automated targeting with explicit intent signals. Supports add and remove operations — to update, remove and re-add.

  ### Audience Signals

  Tell Google which audience segments are most likely to convert. Combine multiple segment types in a single signal:

  * **In-market audiences** — users actively researching products in a category
  * **Affinity audiences** — users with sustained interests and habits
  * **Custom audiences** — account-level custom audience segments
  * **User lists** — first-party data (website visitors, customer lists, CRM uploads)

  Only one audience signal per asset group. Signals are suggestions, not hard targeting — Google uses them as starting points and expands.

  ### Agent Skills Updated

  The Ad Campaign Management skill and Performance Marketing Agent now include search themes and audience signals in the PMax campaign creation workflow (steps 9-10). The agent will automatically recommend search themes based on keyword research and suggest relevant audience segments.

  ### Bug Fixes

  * Fixed GAQL query syntax for asset group signals (`campaign.id` instead of `asset_group.campaign.id`)
  * Fixed audience search returning zero results (replaced case-sensitive GAQL LIKE with client-side filtering + `taxonomy_type` enum)
  * Added `user_list_ids` support for remarketing lists in audience signals
  * Increased max search themes from 25 to 50 (Google's actual limit)
</Update>

<Update label="March 7, 2026" description="v2.6.0" tags={["New Features", "Security"]}>
  ## API Key Authentication (Personal Access Tokens)

  Adspirer now supports **Personal Access Tokens** for headless and remote server authentication. Generate API keys from the dashboard and use them on remote servers, Docker containers, and CI/CD pipelines where browser-based OAuth isn't available.

  ### What's New

  * **API Key Management UI** — Generate, name, and revoke API keys from [adspirer.ai/keys](https://adspirer.ai/keys)
  * **OpenClaw `--token` flag** — `openclaw adspirer login --token sk_live_...` for headless authentication
  * **`ADSPIRER_API_KEY` env var** — Set the environment variable for zero-config server authentication
  * **Tier-based key limits** — Free: 2 keys, Plus: 5, Pro: 10, Max: 20
  * **Key expiration** — Optional expiration (30 days, 90 days, 1 year, or never)
  * **Admin controls** — Admin dashboard for API key analytics, per-user key management, and emergency revocation
  * **Auth method tracking** — Tool call logs now track whether each call used OAuth or an API key

  ### Security

  * Keys use `sk_live_` prefix for easy identification
  * SHA-256 hashed storage — raw tokens never stored server-side
  * Instant revocation with audit trail
  * Keys cannot be used to create other keys (prevents privilege escalation)

  ### Documentation

  * [OpenClaw Remote Server Setup](/ai-clients/openclaw#remote-server-setup) — Step-by-step guide
  * [Security — API Key Authentication](/knowledge-base/security#api-key-authentication) — Security model and comparison
  * Updated [How MCP Works](/mcp) — Authentication section
  * Updated [FAQ](/knowledge-base/faq) — Remote server and API key questions
</Update>

<Update label="March 5, 2026" description="v2.5.0" tags={["AI Clients"]}>
  ## Claude Cowork Setup Guide

  New documentation page with step-by-step visual guide for connecting Adspirer to [Claude Cowork](/ai-clients/claude-cowork). Includes 9 annotated screenshots covering the full flow: plugin install from marketplace, connector setup, OAuth authentication, and brand folder workspace.

  ### Claude Connector Simplified

  [Claude Chat setup](/ai-clients/claude) no longer requires manual OAuth configuration. Just paste the URL — Claude auto-discovers the server name and authentication settings.

  ### ChatGPT Setup Updated

  [ChatGPT setup](/ai-clients/chatgpt) updated to match current UI: new field names, OAuth advanced settings callout, "I understand and want to continue" checkbox, and the new **Reference memories and chats** preferences screen.
</Update>

<Update label="March 3, 2026" description="v2.4.0" tags={["New Features", "LinkedIn"]}>
  ## LinkedIn Exhaustive Campaign Features

  Extended LinkedIn campaign tools with exhaustive targeting and management capabilities. Fixed Google `list_campaign_extensions` returning incorrect data.

  ### Database Performance

  Phase 1 database performance improvements for faster query execution across campaign metrics and user analytics.

  ### Documentation: Agent Pages & Support

  Added 8 new documentation pages:

  * **[Claude Code Agent](/agent-skills/claude-code-agent)**, **[Cursor Agent](/agent-skills/cursor-agent)**, **[Codex Agent](/agent-skills/codex-agent)**, **[OpenClaw Agent](/agent-skills/openclaw-agent)** — per-client agent architecture docs
  * **[How It Works](/how-it-works)** — 5-layer architecture page
  * **[FAQ](/knowledge-base/faq)**, **[Glossary](/knowledge-base/glossary)**, **[Support](/knowledge-base/support)** — knowledge base expansion
  * Added Support tab to top navigation
</Update>

<Update label="February 28, 2026" description="v2.3.0" tags={["Billing"]}>
  ## Pricing V2

  Updated pricing across all tiers:

  | Plan     | Price    |  Tool Calls |
  | -------- | -------- | :---------: |
  | **Free** | \$0/mo   |   15/month  |
  | **Plus** | \$49/mo  |  150/month  |
  | **Pro**  | \$99/mo  |  600/month  |
  | **Max**  | \$199/mo | 3,000/month |

  * Annual pricing option now available with savings
  * Tool call counter resets to 0 on tier upgrade
  * Fixed subscription cancellation on upgrade to prevent double-billing
  * Stripe webhook handlers now sync quota correctly

  ### MCC/Manager Account Warnings

  Connections page now warns users attempting to connect MCC (Google) or Business Manager (Meta) accounts instead of individual ad accounts.

  ### OpenClaw Plugin Updates

  * `openclaw adspirer uninstall` CLI command added
  * OAuth retry logic improved
  * Skill metadata updated with security section and privacy policy
</Update>

<Update label="February 27, 2026" description="v2.2.1" tags={["New Features", "Agent Skills"]}>
  ## Skill Reference & Performance Marketing Agent Docs

  Added 2 new pages to the Agent Skills section:

  * **[Skill Reference](/agent-skills/skills)** — Complete reference for all 5 Adspirer skills with invocation commands per IDE (Claude Code, Cursor, Codex), step-by-step execution details, and example prompts
  * **[Performance Marketing Agent](/agent-skills/agent)** — How the agent orchestrates skills with brand knowledge, strategy persistence, and memory across sessions

  ### Strategy-Aware Execution

  Skills now read `STRATEGY.md` before executing — a persistent file where strategic decisions (AVOID, PREFER, CONSTRAINT, REQUIRE directives) survive across sessions:

  * **Campaign creation** loads strategy directives at Step 0 and flags conflicts with research results
  * **Keyword research** cross-references results against AVOID/PREFER directives
  * **Performance review** flags "Strategy Drift" when campaigns violate active directives
  * **Wasted spend** prioritizes campaigns violating strategy as waste sources

  ### Agent Documentation Highlights

  * Mermaid architecture diagram showing Agent → Context + Strategy + Memory → Skills → Tools → Platforms
  * IDE comparison table for agent features across Claude Code, Cursor, and Codex
  * Brand Workspace setup flow and context file structure
  * Cursor Rules and Codex Safety Rules explained with before/after examples
</Update>

<Update label="February 26, 2026" description="v2.2.0" tags={["New Features", "AI Clients"]}>
  ## Asset Discovery & PMax Validation

  * Fixed asset discovery across platforms
  * YouTube logo upload support for PMax campaigns
  * Mandatory extensions enforcement for Google Ads
  * PMax logo validation improvements

  ### CLI OAuth Fix

  Resolved OAuth failures for CLI clients (Claude Code, Codex). Loopback redirect now correctly routes web vs CLI authentication flows.

  ### Cross-Domain Attribution

  Added referrer-based UTM fallback for cross-domain tracking between adspirer.com and adspirer.ai.

  ### Help & Contact Page

  Added in-app Help page with documentation link and contact options.
</Update>

<Update label="February 22, 2026" description="v2.1.0" tags={["New Features", "Google Ads", "Automation"]}>
  ## YouTube Ads Campaign Support

  Added YouTube Ads campaign creation to the Google Ads toolset. Create video ad campaigns targeting YouTube viewers with budget controls and audience targeting.

  ### Automation Tools

  Launched 8 automation tools:

  * **Scheduled briefs** — automated performance summaries on a recurring schedule
  * **Performance monitors** — alerts when campaigns cross KPI thresholds
  * **Cross-platform reports** — unified reporting across Google, Meta, and LinkedIn

  ### UI Redesign

  Mobile dropdown and desktop tab redesign for the main app. Removed trial language from onboarding flow.

  ### Documentation Updates

  * Enhanced Mintlify components: Frame, Badge, Check, Info, Tooltip across all pages
  * Tabbed install methods for Claude Code setup
  * Resend-style navbar redesign
  * GA4 tracking added to docs site
  * 6 new Knowledge Base articles, MCP explainer page, Mermaid workflow diagrams
  * UTM tracking on all CTA links
</Update>

<Update label="February 16, 2026" description="v2.0.1" tags={["AI Clients"]}>
  ## Expanded Onboarding Setup Guides

  Onboarding now includes 6 platform-specific setup tabs with step-by-step instructions for connecting Adspirer to each AI client.

  ### OpenClaw Plugin v0.3.0

  Fixed OpenClaw OAuth client registration and plugin authentication flow.
</Update>

<Update label="February 2026" description="v2.0.0" tags={["New Features", "AI Clients"]}>
  ## Documentation Site Launch

  Launched comprehensive documentation at [adspirer.com/docs](/introduction) with 24 pages covering all AI clients, ad platforms, agent skills, and in-depth guides.

  * **AI client guides** for ChatGPT, Claude, Claude Code, Cursor, Codex, OpenClaw, and Windsurf
  * **Ad platform guides** for Google Ads (39 tools), Meta Ads (20 tools), LinkedIn Ads (28 tools), and TikTok Ads (4 tools)
  * **Agent skills documentation** with workflows, tool catalog, and safety rules
  * **7 in-depth guides** covering keyword research, automation, and strategy
  * Auto-generated `llms.txt`, `llms-full.txt`, and `skill.md` for AI agent discovery
  * Contextual sharing to ChatGPT, Claude, Cursor, and VS Code

  ## ChatGPT MCP Connector

  Added native MCP connector support for ChatGPT Plus and Pro users. Connect Adspirer directly in ChatGPT Settings with OAuth 2.1 authentication.

  ## Claude MCP Connector

  Added native MCP connector for Claude Pro, Max, Team, and Enterprise. Includes progress streaming for real-time updates during campaign creation.

  ## Codex Agent Support

  Added autonomous agent setup for OpenAI Codex with YAML configuration and skill files.

  ## OpenClaw Plugin

  Released zero-configuration OpenClaw plugin with bundled 14.4KB skill file. Install with `openclaw plugins install openclaw-adspirer`.
</Update>

<Update label="January 2026" description="v1.9.0" tags={["AI Clients", "Bug Fix"]}>
  ## ChatGPT MCP Connector Fix

  Fixed dynamic client registration to correctly detect Claude vs ChatGPT during OAuth. Claude clients now receive the correct redirect URIs instead of ChatGPT credentials.

  ### OpenAI Apps SDK Integration

  Added domain verification, OAuth protected resource endpoints, MCP annotations for tool hints, and OpenAI Platform redirect URI for app submission.

  ### LinkedIn Campaign Fixes

  Fixed LinkedIn campaign creation and update workflows. Resolved API version errors.

  ### Conversion Tracking

  Set up end-to-end conversion tracking infrastructure for measuring signup-to-paid funnel. Multiple fixes to Google Ads metrics accuracy.

  ### Onboarding Revamp

  Redesigned onboarding flow with mobile-responsive screens, auto-completion logic, and MCP OAuth gating to prevent onboarding bypass.

  ### Enterprise Readiness

  Account lifecycle management, metrics pause for inactive accounts, and sign-in/sign-up page revamp.

  ### Meta Ads Traffic Management

  Added Meta video and carousel campaign creation, ad management workflows, and traffic management tools.

  ### GTM Cross-Domain Tracking

  Added Google Tag Manager (GTM-PQGBFK5Q) to frontend. GA4 sessions now persist across domains via the `_gl` parameter.
</Update>

<Update label="December 2025" description="v1.8.0" tags={["New Features", "LinkedIn", "Meta Ads"]}>
  ## LinkedIn Ads Full Integration

  Complete LinkedIn Ads integration across 8 phases:

  * LinkedIn account setup and OAuth
  * Single image sponsored content campaigns
  * Campaign performance analytics
  * Unified tools for cross-platform management

  ### Meta Video & Carousel Campaigns

  Added video campaign creation and carousel ad support for Meta Ads.

  ### Local Currency Support

  Fixed currency handling across all MCP tools and backend APIs. Campaigns now display metrics in the user's local currency.

  ### Smart Metric Collection

  Automated background metric collection for historical performance tracking.
</Update>

<Update label="November 2025" description="v1.7.0" tags={["New Features", "MCP"]}>
  ## Asset Reuse & PMax Improvements

  * Smart asset discovery and reuse for Performance Max campaigns
  * Domain filtering for sitelinks
  * Location targeting fix for MCP/ADK PMax campaigns

  ### Account Tier System

  Account tier infrastructure with 120-day metric backfill for new users. Accurate daily metrics via `segments.date` in queries.

  ### ChatGPT Apps SDK Widgets

  In-app quota widget and account management tools for ChatGPT users. OAuth improvements for API routes.

  ### Custom GPT Support

  Added ChatGPT Actions support with OAuth compatibility for Custom GPT configurations.

  ### MCP Protocol Improvements

  * Progress streaming (MCP 2025-03-26) for real-time updates during campaign creation
  * False success message elimination
  * OAuth token rotation on reconnect
  * JWT expiry fix and performance routing improvements
</Update>

<Update label="October 2025" description="v1.6.0" tags={["New Features", "TikTok", "MCP"]}>
  ## TikTok Ads Integration

  Complete TikTok Ads platform integration:

  * OAuth setup and multi-platform architecture
  * In-feed video campaign creation
  * Image upload and asset validation
  * Session handling and location targeting

  ### MCP Server Launch

  Initial MCP server deployment at `mcp.adspirer.com`:

  * OAuth 2.1 with PKCE authentication
  * Complete PMax campaign creation via ChatGPT
  * Modular architecture for multi-platform support

  ### Creative Canvas

  Multi-image upload UX improvements and character limit enforcement for PMax campaigns.
</Update>

<Update label="September 2025" description="v1.0.0" tags={["New Features"]}>
  ## Adspirer Launch

  Initial release with 100+ tools across Google Ads and Meta Ads.

  ### Google Ads (39 tools)

  * Keyword research with real CPC data from Google Keyword Planner
  * Search and Performance Max campaign creation
  * Wasted spend analysis, budget optimization, and ad extensions
  * Asset discovery, validation, and ad copy generation

  ### Meta Ads (20 tools)

  * Image, video, and carousel campaign creation
  * Audience targeting and creative fatigue detection
  * Placement optimization and performance analysis

  ### Core Features

  * OAuth 2.1 authentication with PKCE
  * Multi-platform account management
  * Agent skills system with SKILL.md instruction files
</Update>

{/* changelog reviewed against adstudio production-deployment on 2026-05-21 — all customer-facing changes accounted for */}
