--- name: shopify-ads description: "Run a standing loop between a Shopify catalog and Meta and Google campaigns, judged against margin rather than platform ROAS. Use for a DTC brand that wants a repeatable cycle, not a one-off audit." 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: "full-stack-playbooks" adspirer_source: "https://www.adspirer.com/skills/shopify-ads" adspirer_trigger: "show me which Shopify products my ads actually make money on" adspirer_connection_url: "https://adspirer.ai/sign-up" adspirer_primary_keyword: "shopify ads" adspirer_secondary_keywords: "shopify advertising, google ads for shopify" adspirer_launch_wave: "2" adspirer_kind: "skill" adspirer_level: "operator" adspirer_platforms: "meta,google" adspirer_supported_clients: "claude,claude-code,claude-cowork,chatgpt,codex,cursor,gemini,windsurf" adspirer_summary: "Keep catalog, campaigns and profitability in one loop, so spend follows margin rather than platform-reported return." adspirer_connections_required: "adspirer,shopify" adspirer_connections_optional: "klaviyo" --- # Shopify Ads ## Use this when The store is doing well on paper. Platform ROAS looks healthy, revenue is up, and the accountant has just pointed out that the products selling hardest are the ones the business makes the least on. Nobody has connected the ad accounts to actual margin, so every optimization so far has been pushing budget toward whatever converts cheapest. Use this skill to run the loop properly. It works out: - whether the catalog the ads are selling from matches what the store can actually ship; - what each product really earns after cost, rather than what the platform reports as revenue; - which campaigns are profitable at the product level rather than at the account level; - where returns and discounts quietly erase the reported return; and - what to change next, on a cadence rather than in a panic. This is a standing loop for a Shopify brand running Meta and Google. It is not a one-off audit, and it does not replace a proper finance view of the business. ## What you need - Adspirer connected to the Meta and Google accounts, with enough history to see a trend rather than a week. - Shopify connected, so product data, prices, stock, and completed orders come from the store rather than from platform-reported conversions. - Cost of goods at whatever granularity exists. Per product is ideal; per category still works. Without any cost data the loop can compare revenue but cannot speak to profitability, and it will say so rather than implying otherwise. - A profitability bar the business actually uses — a target margin, a contribution threshold, or a blended return floor. Without one, "good" has no definition and the loop degrades to reporting. - Optional Klaviyo access, so repeat purchase and retention can inform whether a thin first order is acceptable or genuinely unprofitable. ## 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. **Reconcile the catalog against what is actually sellable.** Read the live catalog and compare it with what the campaigns are promoting. Out-of-stock products still being advertised, price mismatches between store and feed, and products excluded from the feed for reasons nobody remembers are all common and all waste spend directly. Report the discrepancies before any performance question, since a campaign selling something unavailable is not an optimization problem. 2. **Anchor performance to store orders, not platform conversions.** Pull completed orders and revenue from the store for the same window as ad spend, and put them beside platform-reported conversions. Name the gap rather than reconciling it away. Where returns and discounts are visible, subtract them — a reported return that ignores refunds systematically overstates how well the account is doing. 3. **Judge products and campaigns against margin.** Bring cost data alongside revenue to work out what each product actually contributes, then attribute spend to see which campaigns are profitable rather than merely high-revenue. Expect this ranking to disagree with the platform's, sometimes sharply. Where cost data is missing for part of the catalog, report those products as unassessable rather than assuming a margin for them. 4. **Decide what changes, and what is simply too early.** Identify products worth more budget, products that should stop being pushed, and campaigns whose apparent success rests on discounting or returns. Where Klaviyo is connected, check whether a thin first order is redeemed by repeat purchase before recommending a cut. Exclude anything without enough orders to judge, and say so rather than acting on a handful. 5. **Prepare changes and set the cadence.** Present the findings with their arithmetic, prepare any budget or campaign change for explicit approval, and agree how often this loop runs. The value is in it repeating — a catalog drifts, costs change, and a single audit goes stale within a quarter. ## Fixed checks - Reconcile the live catalog against advertised products before any performance analysis, and report stock and price mismatches. - Pull orders from the store rather than relying on platform-reported conversions, and align both to the same window, timezone, and currency. - Subtract returns and discounts where the data exposes them, and state whether it does. - Confirm cost data coverage and name the products it does not cover rather than assuming a margin. - Exclude products and campaigns with too few orders to judge, and list them explicitly. - State the attribution basis on both sides when comparing platform conversions with store orders, and name the gap instead of averaging. - Confirm the profitability bar with the user rather than applying a default definition of good. ## Stop conditions - **Success:** catalog reconciled, performance anchored to store orders, products and campaigns judged against margin, changes prepared, cadence agreed. - **No change needed:** spend already follows margin and the catalog is in sync. - **Blocked — no cost data:** profitability cannot be assessed. Report revenue and say plainly that the margin question is unanswerable until costs exist. - **Blocked — catalog:** the feed is materially out of sync with the store, which must be fixed before performance means anything. - **Blocked — access:** the ad accounts or store cannot be reached. - **Needs approval:** budget or campaign changes are prepared and waiting on explicit authorization. - **Needs a handoff:** feed configuration, product data, pricing, or fulfilment problems belong to someone else. ## Approval boundaries This skill reads ad accounts and the store, and prepares changes. It does not move budget, change bids, pause campaigns, or edit the catalog — every change is presented for explicit, per-item approval. It cannot edit products, prices, or stock in the store, fix a broken product feed, change fulfilment, or alter cost data; where one of those is the blocker it is named with its owner. It does not assume a margin for products without cost data, and it does not present platform-reported return as profit. Any campaign it would create is created paused. ## What you get A loop that connects what the ads sell to what the business actually earns. The catalog is reconciled first, so spend is not going toward products that are out of stock or priced differently than the feed claims — a category of waste that no amount of bid optimization fixes. Performance is anchored to completed store orders rather than platform-reported conversions, with the gap named rather than smoothed, and with returns and discounts subtracted where the data allows. Products and campaigns are then ranked by contribution rather than revenue, which is the ranking that usually disagrees with the platform's and explains why a healthy-looking account can be shrinking margin. Anything without enough orders to judge, or without cost data behind it, is listed as unassessable rather than quietly assigned a number. Changes arrive prepared for approval, with a cadence agreed — because a catalog drifts and a one-off audit is stale within a quarter.