--- name: performance-max-campaign description: "Build a Performance Max campaign that is wired to a real conversion goal before it spends. Use when a team is launching PMax in Google Ads, or relaunching one that underperformed because of setup rather than market fit." license: MIT compatibility: "Works with any Agent-Skills-compatible AI (Claude, ChatGPT, Cursor, Codex, and more). Ad-account actions run through Adspirer." metadata: author: "Adspirer" version: "1.0.0" adspirer_category: "campaign-launch" adspirer_source: "https://www.adspirer.com/skills/performance-max-campaign" adspirer_trigger: "set up a Performance Max campaign for my Google Ads account" adspirer_connection_url: "https://adspirer.ai/sign-up" adspirer_primary_keyword: "performance max campaign" adspirer_secondary_keywords: "pmax campaign setup, performance max best practices" adspirer_launch_wave: "2" adspirer_kind: "skill" adspirer_level: "operator" adspirer_platforms: "google" adspirer_supported_clients: "claude,claude-code,claude-cowork,chatgpt,codex,cursor,gemini,windsurf" adspirer_summary: "Build a Performance Max campaign paused, check it against the live account, and hand the launch decision back to the user." adspirer_connections_required: "adspirer" adspirer_connections_optional: "ga4" --- # Performance Max Launcher ## Use this when A new product line is ready, the budget is signed off, and someone has asked for Performance Max because that is what Google recommended in the account. The last PMax campaign the team ran spent for three weeks and returned almost nothing, and nobody is certain whether that was the market or the setup. Use this skill to build the campaign properly before it spends. It settles the decisions that quietly determine whether PMax works: - which conversion action the campaign should actually bid toward, rather than a catch-all goal set; - whether it will compete with a brand Search campaign already running in the same account; - whether each asset group has enough creative to be tested at all; - what audience signals exist to shorten the cold start; and - whether the account has enough conversion history for target-based bidding to be realistic. This is for building a new Performance Max campaign, or rebuilding one whose setup looks like the problem. It is not for adjusting the budget or bids on a healthy live campaign, and it is not for Standard Shopping or Search builds. ## What you need - Adspirer connected to the Google Ads account, with an access level that can create campaigns rather than read-only. - The business outcome this campaign serves and the specific conversion action it should count — decided before the build starts, not chosen from a default list. - Conversion tracking already working on the destination site or app. Performance Max bids only toward conversion goals, so a broken or unset signal means the campaign optimizes toward nothing. - A live final URL that matches what is being promoted, and a decision on whether Google may expand to other pages on the domain. - Creative for at least one asset group: a spread of image ratios, a square logo, short and long headlines, and descriptions. Bring video if it exists — Google will otherwise assemble one automatically, and those usually underperform. - The brand terms and confusable competitor terms to exclude, since Performance Max has no ad-group-level keyword exclusion and this has to be set before launch rather than patched afterwards. - The daily budget the user has actually approved. - Optional GA4 access, to confirm the conversion action driving bidding matches what the business calls a conversion and to sanity-check landing-page engagement. Without it, the build proceeds on Google Ads conversion data alone and says so. ## Procedure **Connect Adspirer before any live ad-account step.** Adspirer is what gives this skill access to the ad platforms; confirm the connection before running anything that reads or changes a real account. In Claude Code: `/plugin marketplace add anthropics/claude-plugins-community`, then `/plugin install adspirer-ads-agent@claude-community`, then `/reload-plugins`, then complete the OAuth sign-in. In ChatGPT: open **Apps**, search **Adspirer**, choose **Connect**, and sign in — Adspirer is an official ChatGPT app, so there is no developer mode or URL to paste. In claude.ai or Claude Desktop: Settings → Connectors → Add custom connector → `https://mcp.adspirer.com/mcp`. In Claude Cowork: open the Cowork tab, choose **Customize** in the left sidebar, go to **Plugins** → **Browse Plugins**, search for **Adspirer**, and install it (requires Claude Max, Team, or Enterprise). Any other client: https://www.adspirer.com/docs/ai-clients. Sign-in link for the user: https://adspirer.ai/sign-up. Do not proceed with live ad-account steps until the connection is confirmed. 1. **Settle the goal before touching the account.** Confirm the business outcome and the exact conversion action that should drive bidding. Resist a mixed goal set — a purchase target sitting alongside add-to-cart in the same set dilutes the bidding signal and is one of the most common reasons a PMax campaign disappoints. Check that the primary and secondary flags on those conversion actions match the intent, since secondary actions are observed but never bid toward. 2. **Read the account before building in it.** Pull the current conversion actions and recent conversion volume for the chosen goal, and check what else is already running. If monthly conversion volume in that goal is thin, say plainly that learning will be slow and unstable, and ask whether to proceed, widen the goal, or wait. Surface any existing brand Search campaign, because Performance Max draws on the same inventory and will compete with it — recommend a brand exclusion unless the user wants PMax bidding on brand too. 3. **Build the campaign paused.** Create one asset group per genuinely distinct offer or audience rather than one campaign each, since budget pools at the campaign level and too many groups starve each other of signal. Populate creative, set the final URL and the URL expansion decision, attach the negative keyword list covering brand and excluded categories, and seed audience signals from whatever first-party, in-market, or custom segments actually exist — noting honestly when none do. Choose the bid strategy from the account's own trailing performance: no target when history is thin, and a target seeded from real blended results when it is not. Never invent a budget or a target the user did not give you. The campaign is created paused, always. 4. **Verify against the live account, not the build.** Re-read the campaign as Google actually saved it and run the fixed checks below. Google can silently reject an asset at save time, leave a negative list created but unattached, or store a budget that does not match what was intended. Surface any asset group Google rates poorly before anyone is asked to approve it. 5. **Hand the launch decision back.** Present the full build — conversion goals, asset groups and any thin ones, signals, negatives, URL expansion, budget, bid strategy, and every warning raised along the way — and ask for an explicit go. On approval, enable the campaign. On anything short of that, leave it paused and say exactly what is built and what it is waiting for. ## Fixed checks - Re-fetch the campaign from the live account rather than trusting the build step, and confirm it is still paused before approval is requested. - Confirm the saved conversion goal set matches what was configured, reading the goal names and their primary or secondary status from the account itself. - Confirm each asset group saved with the assets intended, and read the ad strength Google assigned rather than assuming it. Flag any group rated poorly. - Confirm the negative keyword list is attached to the campaign, not merely created — an unattached list is a common silent failure. - Confirm the final URL and any URL expansion setting resolve to a live page, not a 404 or a redirect loop. - Confirm the saved budget matches the approved number in the account's own currency, which catches unit mismatches before spend starts. - Confirm no duplicate PMax campaign was already created for the same asset groups, so a retry does not quietly produce two. ## Stop conditions - **Success:** the campaign is built, every fixed check passes, the user explicitly approves, and it is enabled. - **Built and parked:** the campaign is built and verified paused, and the user wants to review before launching. This is a clean end state — report what exists and what it is waiting on. - **Blocked — tracking:** no working conversion action exists for the chosen goal. Stop before building rather than launching a campaign that would bid toward a null signal. - **Blocked — assets:** no requested asset group has enough creative and the user has nothing more to supply. Report which groups are short and offer to launch only the ones that qualify. - **Blocked — access:** the connection lacks the access needed to create campaigns, or the account is suspended or under policy review. - **Needs approval:** the build is complete and checked, waiting on an explicit go. Enabling is always its own step. ## Approval boundaries Building, checking, and presenting the campaign involves no spend — it is created paused and stays that way until the user says otherwise. Enabling it is the single moment spend begins, and it happens only after the user has reviewed the final configuration and explicitly agreed. A general "looks good" earlier in the conversation does not carry over if the build has changed since; re-confirm against what actually exists. Budgets and targets are never invented or rounded upward, and a suggested target is always sourced from the account's own trailing performance and offered as a suggestion. This skill cannot repair conversion tracking, GTM containers, GA4 tags, billing problems, or policy appeals, and it cannot produce creative assets — when one of those is the blocker, it writes the handoff for the person or connector that owns it instead of claiming a fix. ## What you get A Performance Max campaign in the Google Ads account — live if approved, safely paused if not — wired to a conversion goal the team actually chose, with asset groups populated to a testable standard and their real ad strength read back from Google. Audience signals are seeded from whatever data genuinely exists, with an honest note when none does. A negative keyword list is attached, URL expansion is explicitly set and checked against a working landing page, and the budget and bid strategy are the ones the user approved. You also get the warnings: thin asset groups, low conversion volume, an existing brand Search campaign it will compete with. If tracking or creative turned out to be the real blocker, you get a written handoff naming what needs fixing and who should fix it, rather than a campaign launched on top of the problem.