← AdAgntCONTENT HISTORY

Update to AdAgnt

Snapshot Sep 30, 2026 · 23:11 UTC · version 1.0.0

Collection source: not recorded for this historical snapshot.

WHAT CHANGED · RULE-BASED ANALYSIS

First saved snapshot

No earlier snapshot is available to establish a change.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "name": "adagnt-revenue",
  "description": "Connect real revenue sources (GA4, Shopify, Stripe, Klaviyo) and judge campaigns by true ROAS — revenue divided by spend — instead of platform-reported conversion value. Use when the user asks what their ads actually earn, wants to connect a store or analytics source, or questions the numbers their ad platforms report.",
  "included_files": [],
  "skill_md_contents": "---\nname: adagnt-revenue\ndescription: Connect real revenue sources (GA4, Shopify, Stripe, Klaviyo) and judge campaigns by true ROAS — revenue divided by spend — instead of platform-reported conversion value. Use when the user asks what their ads actually earn, wants to connect a store or analytics source, or questions the numbers their ad platforms report.\n---\n\n# AdAgnt Revenue & True ROAS\n\nAd platforms grade their own homework: the conversion value Google or Meta reports is their claim about what they drove. This skill wires in the ground truth — actual revenue from the user's store, payment processor, or analytics — and judges every campaign against it.\n\n## Step 1 — Connect a revenue source\n\nCheck what's already wired up with `list_revenue_sources`. If nothing is connected (or the user mentions a new source), onboard one with `connect_revenue_source`:\n\n- `source` — one of `ga4`, `shopify`, `stripe`, `klaviyo`. Pick whichever is closest to the money: Stripe or Shopify if they charge there, GA4 if e-commerce tracking is solid, Klaviyo for email-attributed flows.\n- `property_id` — the store/property identifier. Optional in sandbox; ask for it on live accounts.\n- `average_order_value` — sandbox only: calibrates the simulated revenue stream. Ask for a realistic figure rather than defaulting, so sandbox numbers look like the user's business.\n\nConnecting is a write, but a safe one — it creates a data connection, not an ad-account change. Still confirm the source and identifier with the user before calling, and verify afterward with `list_revenue_sources` (check sync status, not just presence).\n\nOne source is enough to start. If the user connects several, be explicit that revenue is joined from all of them — don't double-count a Shopify order that also shows up in Stripe; ask which source is authoritative for order revenue.\n\n## Step 2 — Read true ROAS\n\n`get_true_roas` returns per-campaign revenue ÷ spend from the connected sources, ranked worst-to-best, each with a verdict. What the verdicts mean and what to do:\n\n- **kill** — spend with no revenue to show for it over the window. Recommend pausing; the burden of proof is on the campaign now. Check one thing first: is the sales cycle longer than the date range? A 30-day window will condemn a 60-day B2B cycle unfairly.\n- **fix** — real revenue, bad ratio. Something specific is broken: targeting, landing page, bid strategy, or creative. Diagnose before touching budget — `adagnt-performance` has the anomaly tools.\n- **keep** — earning its budget. Leave it alone. Not every campaign needs an intervention this week.\n- **scale** — high true ROAS with headroom. Propose a budget increase in steps (20–30% at a time), not a doubling — efficiency usually falls as spend rises.\n\nSet `min_spend` so tiny campaigns don't pollute the ranking (default 10 is fine; raise it on large accounts). Use the same `date_range` the user's targets are stated in.\n\nPresent the ranking worst-first, exactly as returned — the user's biggest losses are the lede, not the wins.\n\n## Step 3 — Explain the attribution gap\n\n`get_revenue_attribution` returns, per campaign and platform, both the platform-reported conversion value and the actual attributed revenue — and the gap between them. When the user asks why the numbers disagree (they will), the honest explanation:\n\n- **Platforms over-claim.** Each platform attributes any conversion it touched, so the same order is claimed by Google *and* Meta. Summing platform-reported value counts money twice; connected revenue counts it once.\n- **View-through and window inflation.** A platform may claim a sale because someone saw an ad a week before buying through another door. Revenue-side attribution is stricter.\n- **Under-reporting happens too.** Blocked tracking, iOS privacy limits, and offline sales make platforms miss revenue they genuinely drove. A gap in either direction is information.\n\nThe rule of thumb to give the user: **platform numbers for optimizing within a platform, true ROAS for deciding between platforms and for judging total spend.** A campaign is never \"actually profitable\" on platform-reported value alone.\n\n## Step 4 — Act on it\n\nVerdicts are recommendations, not actions. Any pause, budget change, or reallocation that follows goes through the normal write-tool discipline: exact payload shown, explicit yes, one call, verify with a read tool. For cross-platform budget moves based on true ROAS, `optimize_cross_platform_budget` files a plan to the approval queue by default — keep it that way. Record what was decided with `update_strategy` (`append_learning`) so next month's review starts from this one's conclusions.\n"
}

SHA-256: 8f69f6b49942b95515fc2a5e3c95063039e02a47f66cd47a9a06509974af00ea