SKILL DETAIL
ad-bidding-strategy
mbfinotti/advertising-skills/ad-bidding-strategy
Choose the bidding policy per platform and goal - manual vs automated, cost-goal vs value/return-goal, when to switch, and how to set and move the target - written up as a policy with an evaluation window, change discipline, and a rollback trigger. Use whenever the user mentions a bid strategy, target CPA or target ROAS, smart or automated bidding, bid cap vs cost cap, portfolio bid strategies, seasonal bid adjustments, value-based bidding readiness, or delivery collapsing after a target change - even if they never say 'bidding'. Covers B2B and B2C. Do NOT use to split budgets across campaigns (mbfinotti/advertising-skills@ad-spend-allocation) or to track spend against a budget (mbfinotti/advertising-skills@ad-budget-pacing).
Installation
npx skills add https://github.com/mbfinotti/advertising-skills --skill ad-bidding-strategy
スキルファイル
SKILL.md
最終同期 · 2026/10/23
evals/evals.json›
{
"skill_name": "ad-bidding-strategy",
"evals": [
{
"id": 1,
"prompt": "We run Google Search ads for Corvid Systems, a B2B compliance software company. We get about 9 demo-request conversions a month from search, at roughly $370 per demo, on a $120/day budget. Our new agency says we have to stay on manual CPC until we hit 15 conversions in a 30-day window because that's Google's requirement for Target CPA, and ideally 50 before it works properly. Is the agency right, and what should we do in the meantime?",
"expected_output": "Corrects the threshold folklore (Target CPA has no conversion minimum; 15/30d belongs to Target ROAS; 50 is guidance), reframes low volume as a variance problem, derives what the budget can support, and lays out ranked options for thin volume with a trailing-actual starting target.",
"files": [],
"expectations": [
"States that the cost-goal strategy (Google Target CPA) has no documented minimum conversion volume and can be started with no conversion history",
"Attributes the '15 conversions in 30 days' minimum to Target ROAS (the return-goal strategy), not to Target CPA",
"Identifies '50 conversions' figures as reliability recommendations or guidance, not enablement gates",
"Distinguishes enablement thresholds from evaluation samples as two different kinds of published number that folklore merges",
"Does not advise waiting until 15 or 50 conversions before adopting Target CPA",
"States that low conversion volume costs variance and slow diagnosis (a bad target cannot be separated from bad luck), not eligibility or access",
"Applies the volume-budget derivation (required budget ≈ target cost × volume threshold ÷ period) to the account's own numbers, e.g. showing what $120/day at ~$370 supports",
"Presents consolidation, optimizing an upstream event with downstream outcome import, and accepting slower diagnosis as the options for thin volume",
"Ranks those thin-volume options rather than listing them flat, with consolidation leading on efficiency",
"Notes that importing downstream outcomes requires consent/privacy/legal review before customer or deal data is sent to a platform",
"Recommends setting the initial Target CPA at or near the trailing actual (~$370), not at a goal or aspirational number",
"Labels cited thresholds with an evidence tier or as-of date, or advises re-verifying them against live platform documentation",
"Treats manual CPC as a durable strategy with legitimate long-term uses rather than dismissing it as only a bootstrapping phase"
]
},
{
"id": 2,
"prompt": "I manage Meta ads for Loam & Ember, a DTC candle brand. Three weeks ago I set a Cost Per Result Goal of $28 on our main purchase campaign. Looking at individual purchases in the export, several cost $47 and one even $63. The average across the campaign is $29.50. This looks broken to me - the whole point of the setting is that results stay under $28, right? I'm about to open a support ticket, or switch to Bid Cap at $28 so Meta actually respects the number. Which should I do?",
"expected_output": "Explains average-based control vs hard per-auction ceiling, concludes the campaign is working as designed, and warns against the Bid Cap swap and the learning reset it would trigger.",
"files": [],
"expectations": [
"Explains that Cost Per Result Goal is an average-based control: individual conversions can and will exceed the target while the average lands near it",
"Concludes the campaign is working as designed (average $29.50 near the $28 target), not malfunctioning",
"Does not endorse opening a support ticket or the bug framing",
"Distinguishes average-based cost goals from hard per-auction ceilings as two structurally different control types",
"Identifies Bid Cap as the hard per-auction ceiling that never bids above the cap in any single auction",
"Warns that a hard cap at $28 carries under-delivery risk (delivery can drop sharply)",
"Notes that platforms position hard bid caps as expert-only controls",
"States this misreading ('my cost cap was exceeded') is a common conflation rather than a rare malfunction",
"Does not recommend switching to Bid Cap as the fix for the observed spread",
"Warns that a strategy switch is a material change that restarts a learning period",
"Advises judging the target over an evaluation window expressed in conversion cycles, not on individual conversions",
"Treats the platform label as an observed capability (noting label churn such as Cost Cap being renamed) rather than assuming the name describes a hard cap"
]
},
{
"id": 3,
"prompt": "Finance at Pellwright, our B2B payroll software company, set next quarter's plan around a $95 cost per demo. Our trailing 60-day actual is $240 per demo, and the best month we've ever had was $210. Last Tuesday I changed our search campaign's target from $240 to $95, and since then spend has dropped almost to zero while the platform reports a beautiful $102 CPA on the trickle that's left. Finance says the target is working and we should keep it. For context: a closed deal is worth about $3,500 in contribution and roughly 4% of demos become customers. What do I do?",
"expected_output": "Diagnoses a target-choke delivery collapse, computes break-even at $140, declares economics and history irreconcilable (unit-economics problem, not a bidding problem), restores the target to trailing actual, and sets change discipline.",
"files": [],
"expectations": [
"Diagnoses the spend collapse as a target-too-aggressive delivery choke: the platform stops bidding rather than lose money",
"Identifies the reported ~$102 CPA on near-zero spend as the signature symptom of the choke (under-delivery with great-looking reported efficiency), not as success",
"Names the discriminating under-delivery signals to check, such as spend well below budget or impression share lost to rank",
"Computes break-even cost per demo as $3,500 × 4% = $140",
"Compares the $140 break-even against the $210-240 achieved history and states the account has never operated at or below break-even",
"Declares this a unit-economics problem (offer, pricing, funnel conversion, or channel fit), not a bidding problem",
"Refuses to pursue the $95 target through any bid-strategy change",
"Recommends restoring the target to or near the trailing actual ($240) to recover delivery",
"Recommends tightening only in modest steps (about 10-15%), labelled as practitioner convention rather than platform documentation",
"Requires a full evaluation window between steps, expressed in conversion cycles",
"Names or quantifies a margin buffer between break-even and the live target",
"Corrects finance's reading rather than endorsing 'the target is working'",
"Attaches a refresh cadence or date to the derived inputs (e.g. re-derive the close rate from CRM actuals quarterly)"
]
},
{
"id": 4,
"prompt": "Velora Home, our e-commerce store, does a big Black Friday-Cyber Monday sale - conversions usually triple that weekend, and November overall runs hot compared to October. My plan: apply a +200% seasonality adjustment in Google Ads for all of November, and add a data exclusion over the sale weekend itself so learning doesn't get polluted by the unusual data. We also run 25% off sitewide during the sale. Sanity-check this before I set it up?",
"expected_output": "Resizes the adjustment to conversion-rate lift, limits the spike tool to the short event window, re-derives the seasonal target for the month-long pattern, rejects data exclusions for demand swings, and flags the discount's effect on margin-derived targets.",
"files": [],
"expectations": [
"Sizes the seasonality adjustment to the expected conversion-rate lift, not the conversion-count multiple",
"Explains that conversions tripling does not mean conversion rate triples, since traffic also rises during the sale",
"Warns an oversized adjustment causes overspend or budget exhaustion early in the day",
"Restricts the seasonality-adjustment tool to a short event window (roughly 1-7 days), not a full month",
"For the month-long November pattern, recommends re-deriving the target from seasonal actuals instead of stretching the spike tool",
"Rejects using data exclusions for a demand swing",
"States data exclusions exist for broken or corrupted tracking, not unusual demand",
"Warns that frequent data exclusions degrade the bidder",
"Recommends restoring normal targets/settings after the sale window ends",
"Distinguishes a temporary demand swing (loosen, then restore) from a permanent efficiency change (re-derive the target permanently)",
"Flags that the 25% sitewide discount changes contribution margin and therefore the break-even/target derivation for the promo period",
"Advises against other concurrent target changes during the promo window"
]
},
{
"id": 5,
"prompt": "Our CEO at Brightquay, a marketplace for boat rentals, read that eBay proved brand search ads are a waste because organic picks up the clicks anyway, and he wants all brand bidding stopped this week. Meanwhile our retargeting campaigns show a 5.8x ROAS, the best in the account, and he wants that budget doubled instead. Our agency says brand always pays. Who's right, and what do I tell him?",
"expected_output": "Refuses both blanket positions, frames eBay as an upper bound against the opposing replication, prescribes a holdout/geo incrementality test for brand and retargeting alike, and moves scaling decisions to marginal rather than average return.",
"files": [],
"expectations": [
"Refuses both blanket positions (stop all brand bidding, and 'brand always pays')",
"Frames the eBay finding as an upper bound driven by exceptional brand strength, not a general law",
"Cites the replication that found the opposite (Edmunds: substitution under 50%, paid brand traffic economically meaningful)",
"States the operative instruction as 'test, don't assume'",
"Recommends a holdout or geo test as the way to detect non-incremental buying",
"Explains that a bidder rewarded on attributed conversions will buy conversions that would have happened anyway",
"States a strategy can perform well against its own objective while destroying money (platform metrics healthy, lift near zero)",
"Applies the same incrementality gate to retargeting before doubling its budget, treating the 5.8x attributed ROAS as unproven lift",
"Advises scaling decisions on marginal return, not average return",
"Notes average return can hold high while the marginal return on the next dollar sits below break-even",
"Requires incrementality or attribution measurement before any budget move rather than deciding this week from platform reporting alone"
]
},
{
"id": 6,
"prompt": "Halden Grove Software sells facilities-management software to universities. Six months ago we moved our search campaigns to automated bidding on demo-request form fills. Cost per form fill is down 30% and volume is up, but our SDR team says most of the new leads are students and job seekers, not facilities directors. Half the marketing team wants to go back to manual bidding because the algorithm is a black box we can't trust; the other half says never fight the machine. Sales cycle is about 4 months. How should we settle this?",
"expected_output": "Applies Vallaeys' Pilot/Doctor/Teacher framework, diagnoses a failing Teacher job (junk signal), fixes the optimization event and offline loop before touching the strategy, and rejects the manual revert while layering monitoring on the bidder.",
"files": [],
"expectations": [
"Applies the automation-layering framework of the three human jobs: Pilot, Doctor, and Teacher",
"Attributes the framework to Frederick Vallaeys (or Optmyzr)",
"Reframes the manual-vs-automated debate into which of the three jobs the account is currently failing",
"Diagnoses this account as failing the Teacher job: junk conversion signal feeding the bidder",
"States the fix is the signal/optimization event, not the bid strategy",
"States that an improving cost per form fill alongside junk leads means the tracked event is wrong, not the bidder",
"Does not recommend reverting to manual bidding as the remedy",
"Requires measurement repair (a deeper funnel event or offline outcome import) before any bidding change",
"Identifies closing the offline loop - pushing CRM stage outcomes with real deal values back to the platform - as the highest-impact B2B move",
"Recommends matching the conversion window to the ~4-month sales cycle rather than platform defaults",
"Recommends monitoring rules layered on top of the automated bidder as a complement, not a competition",
"Acknowledges legitimate durable homes for manual bidding (e.g. brand-defense terms, tiny audiences) while rejecting them as grounds in this case"
]
},
{
"id": 7,
"prompt": "Tinderbox Apparel is a DTC clothing brand. Our premium line runs about a 55% contribution margin, our basics line about 22%, and blended it's roughly 40%. Our new agency wants one account-wide target ROAS of 4x because that's the industry standard for e-commerce. We're currently at 2.6x trailing 30 days, and the founder wants 10% net profit on ad-driven revenue. Purchase values flow back server-side. What target should we actually set?",
"expected_output": "Derives break-even ROAS from margin instead of accepting 4x, splits the blended target by margin band, starts at trailing actual and tightens toward the profit-goal number with a named buffer, refund netting, and a refresh trigger.",
"files": [],
"expectations": [
"Rejects 4x as an industry standard: break-even return depends on margin, not convention",
"States or shows that the folk 4x figure is correct specifically for a 25%-margin business",
"Computes blended break-even ROAS as 1 ÷ 0.40 = 2.5x",
"Computes per-line break-evens (premium ≈ 1.8x, basics ≈ 4.5x)",
"Flags that one blended target averages a high-margin and a near-break-even line into one meaningless number",
"Recommends splitting the policy or campaign structure by margin band before tightening",
"Applies the profit-goal form 1 ÷ (margin − desired net margin) = 1 ÷ 0.30 ≈ 3.3x as the tightening destination",
"Sets the initial target at trailing actual (2.6x), not at 4x or the 3.3x goal",
"For a return target, starts at or slightly below trailing actual (the looser-than-achieved direction)",
"Names the margin buffer between the live target and blended break-even (~0.1x) and flags it as thin",
"Tightens toward the profit-goal number in modest steps with a full evaluation window per step",
"Requires values net of refunds (or checks refund materiality) before trusting a return target",
"Attaches a margin refresh trigger: re-derive on any pricing change and at least quarterly"
]
},
{
"id": 8,
"prompt": "I run marketing at Ferrostat, a B2B industrial-sensors company. On Google Search we have three campaigns: branded (120 conversions/month), competitor prospecting (14/month), and a generic demand campaign (9/month). Our agency proposes one portfolio Target ROAS across all three so the small campaigns can learn from the big one. They also want to mirror value-based bidding on our LinkedIn campaigns using deal values from Salesforce. Nothing flows from the CRM to either platform yet. Green-light both?",
"expected_output": "Runs the pooling compatibility test and rejects mixing brand with prospecting, blocks any return-goal until real values flow and legal review clears, and states LinkedIn offers no value-based bidding at all.",
"files": [],
"expectations": [
"Applies the pooling compatibility test before any portfolio: same conversion event, comparable margins, same target",
"Rejects pooling the brand campaign with prospecting campaigns",
"Explains that pooled spend migrates on blended rather than per-campaign returns, distorting allocation when economics differ",
"Acknowledges pooling legitimately helps thin campaigns clear signal floors when the pooled goals are genuinely compatible",
"Names the diagnostic for pooling gone wrong: blended target looks fine while per-campaign returns diverge, so incompatible campaigns get split out",
"Suggests consolidation as the alternative fix for structurally thin campaigns",
"States that LinkedIn does not offer value-based / return-goal bidding",
"Treats bidding capabilities as observed per platform rather than assuming feature parity across platforms",
"Notes Google's return-goal (Target ROAS) carries a documented minimum for Search (15 conversions in the past 30 days) with an as-of or re-verify caveat",
"Blocks any return-goal recommendation until real differentiated values actually flow back, since nothing flows from the CRM yet",
"Requires legal/privacy/consent review before Salesforce deal values are sent to any platform",
"Runs the value-integrity check (values differentiated, net of refunds/rejects, timely relative to lag) as a prerequisite",
"Notes the 9-14 conversion/month campaigns clear no documented return-goal minimum on their own"
]
},
{
"id": 9,
"prompt": "Over the last two weeks at Nockboard, our B2B webinar platform, I've adjusted our Meta cost per result goal three times ($60 to $48 to $55 to $50), refreshed the creative, and narrowed the audience, because results kept swinging. It's still volatile. Typical lag from click to a qualified signup is about 3 weeks, plus a few days before it shows in reporting. I want to write down bidding rules so the team stops improvising - including an automated rule that pauses any ad set above $90 CPA. Can you draft the rules?",
"expected_output": "Diagnoses learning churn, freezes edits and batches changes, defines the window in conversion cycles converted to this account's ~3.5-week lag, refuses the hardcoded auto-pause rule, and drafts a policy with rollback trigger, switch trigger, and named approver, validated section by section.",
"files": [],
"expectations": [
"Diagnoses learning churn: each edit re-enters a learning period, and the induced instability provoked the next edit",
"Instructs to stop editing and wait out a full window before any further change",
"Requires batching pending changes into a single change to trigger one relearn instead of a chain of resets",
"Prohibits concurrent confounding changes (target, creative, and audience moved in the same week)",
"Defines the evaluation window in conversion cycles (click-to-conversion lag plus reporting delay), not calendar days",
"Converts the window to days for this account (one cycle ≈ 3.5 weeks, so 1-2 cycles ≈ 4-7 weeks)",
"Cites vendor guidance of 1-2 conversion cycles after a target change as the documented unit",
"Refuses the hardcoded auto-pause rule based on a fixed CPA threshold alone",
"Lists the checks required before pausing on a spike: conversion lag, sample size, tracking health, seasonality, active experiments",
"States that a cost spike is a question, not a verdict",
"Names the containment exception (runaway spend, policy exposure, broken destination, confirmed tracking corruption) where an immediate hold is right",
"Drafts the policy with a rollback trigger stated as an observable condition",
"Includes a switch trigger and a named approver in the drafted rules",
"Presents the policy sections for the user's validation/approval rather than finalizing unilaterally"
]
},
{
"id": 10,
"prompt": "Cindercart runs both a shopping app and a web store. Our app UA agency reports ROAS at 160% and calls it strong; our web team reports 4.2x and calls the app numbers a disaster in comparison. Meanwhile our Google reps are pushing us to move most of the web budget into Performance Max, and my boss's take is that it's just another campaign type, so flip it on. Two questions: which team is actually performing better, and do we do the PMax move?",
"expected_output": "Normalizes the ROAS unit conventions before comparing (160% = 1.6x vs 4.2x), then evaluates Performance Max adoption as delegating the whole bidding policy - signal given, control surrendered, written exit criterion, guardrails, and a clean conversion signal first.",
"files": [],
"expectations": [
"Normalizes the ROAS units before comparing: mobile-UA tooling reports a percentage, web platforms report a multiplier",
"Converts 160% to 1.6x and compares like units (making the web store's 4.2x materially ahead on reported figures)",
"Warns that comparing the two conventions raw produces a large misread",
"Treats adopting Performance Max as delegating the bidding policy to the platform, not as a campaign-type checkbox",
"Notes AI-default campaign types use automated bidding exclusively, so adoption is itself the bid-strategy decision",
"Asks or answers what signal the platform gets under the delegation",
"Asks or answers what control is given up by delegating",
"Requires a written exit criterion: what would justify taking control back",
"Requires guardrails and exclusions configured before adoption",
"Requires a clean, valid conversion signal as a precondition for delegating",
"Recommends cross-checking platform-attributed return against MER or blended business revenue before trusting either team's number"
]
}
],
"trigger_queries": [
{ "query": "Should we switch from manual CPC to Target CPA on Google Ads?", "should_trigger": true },
{ "query": "What bid strategy should I use for our new Meta prospecting campaign?", "should_trigger": true },
{ "query": "Our agency wants to move us from tCPA to tROAS - what has to be true first?", "should_trigger": true },
{ "query": "Is my account ready for value-based bidding?", "should_trigger": true },
{ "query": "How do I pick a target CPA number?", "should_trigger": true },
{ "query": "What should our target ROAS be if our margin is 35%?", "should_trigger": true },
{ "query": "I set the CPA target to our goal and spend fell off a cliff overnight", "should_trigger": true },
{ "query": "Why did delivery collapse after I lowered my target ROAS?", "should_trigger": true },
{ "query": "cost cap vs bid cap on meta - which one do I want", "should_trigger": true },
{ "query": "Some conversions cost more than my cost per result goal - is that a bug?", "should_trigger": true },
{ "query": "Should Black Friday change my bid targets?", "should_trigger": true },
{ "query": "How do I set a seasonality adjustment for a 3-day sale?", "should_trigger": true },
{ "query": "Is smart bidding worth it or should we keep bidding manually?", "should_trigger": true },
{ "query": "When is it safe to raise a target CPA and by how much?", "should_trigger": true },
{ "query": "How long should I wait after changing a bid target before judging it?", "should_trigger": true },
{ "query": "Should I pool my campaigns into a portfolio bid strategy?", "should_trigger": true },
{ "query": "Google keeps recommending I switch to Maximize conversions - should I?", "should_trigger": true },
{ "query": "We only get 12 conversions a month - can we even use Target CPA?", "should_trigger": true },
{ "query": "Do I have enough conversion volume for tROAS?", "should_trigger": true },
{ "query": "What's the difference between Highest Volume and Cost Per Result Goal on Meta?", "should_trigger": true },
{ "query": "My boss wants a $50 CPA but we've never been under $110 - can the bidder get us there?", "should_trigger": true },
{ "query": "How aggressive can I set my target before delivery suffers?", "should_trigger": true },
{ "query": "Should we stop bidding on our own brand keywords?", "should_trigger": true },
{ "query": "Is Performance Max a good idea for us or are we giving up too much control?", "should_trigger": true },
{ "query": "The learning phase reset after I edited my target - now what?", "should_trigger": true },
{ "query": "Our tROAS campaign stopped spending after we raised the target to 5x", "should_trigger": true },
{ "query": "How do I move my CPA target down without breaking the campaign?", "should_trigger": true },
{ "query": "What bidding approach makes sense for a tiny niche B2B audience on LinkedIn?", "should_trigger": true },
{ "query": "Our CFO wants to know how we chose our ROAS target - help me write it up", "should_trigger": true },
{ "query": "Draft a bidding policy for our Google search campaigns", "should_trigger": true },
{ "query": "When should a B2B account move from lead-gen bidding to value-based bidding?", "should_trigger": true },
{ "query": "Should we send our deal values back to Google and bid on those?", "should_trigger": true },
{ "query": "Manual bidding vs automated - settle the debate for our team", "should_trigger": true },
{ "query": "Should I use a bid cap to keep Meta under $30 a purchase?", "should_trigger": true },
{ "query": "How do I bid during a one-week flash sale?", "should_trigger": true },
{ "query": "Google says start tROAS with 15 conversions - do we qualify?", "should_trigger": true },
{ "query": "What happens if I set my target below what the account has ever achieved?", "should_trigger": true },
{ "query": "Our reported CPA looks amazing but the campaign barely spends - what gives?", "should_trigger": true },
{ "query": "How often should we update our bid targets?", "should_trigger": true },
{ "query": "Is our target CPA stale? Pricing changed last quarter", "should_trigger": true },
{ "query": "Which campaigns should share one portfolio target and which shouldn't?", "should_trigger": true },
{ "query": "The platform exceeded my cost target on individual sales - working as intended?", "should_trigger": true },
{ "query": "Set up bidding for our new campaign - we have zero conversion history", "should_trigger": true },
{ "query": "Everyone says wait for 50 conversions before automated bidding - true?", "should_trigger": true },
{ "query": "Should the holiday spike change what I tell the algorithm to aim for?", "should_trigger": true },
{ "query": "My agency wants to turn on value optimization on TikTok - are we ready?", "should_trigger": true },
{ "query": "How do I keep an automated campaign's average cost near a number I choose?", "should_trigger": true },
{ "query": "Explain when a bid cap beats a cost target", "should_trigger": true },
{ "query": "We're switching bid strategies - split test or just flip it?", "should_trigger": true },
{ "query": "Spend dropped 80% after our target change last Tuesday - walk me through recovery", "should_trigger": true },
{ "query": "quarterly review: are our bidding targets still right?", "should_trigger": true },
{ "query": "What's a safe step size for tightening a ROAS goal?", "should_trigger": true },
{ "query": "Should brand campaigns and prospecting share the same bidding target?", "should_trigger": true },
{ "query": "Can I use last year's Black Friday conversions to set this year's bid adjustment?", "should_trigger": true },
{ "query": "LinkedIn doesn't seem to have target ROAS - what do we use instead?", "should_trigger": true },
{ "query": "I want rules for when we're allowed to touch bid targets - write them", "should_trigger": true },
{ "query": "Google rep says folding everything into PMax will fix our CPA - trust it?", "should_trigger": true },
{ "query": "Do seasonal businesses need different bid strategies in peak months?", "should_trigger": true },
{ "query": "Our delivery is fine but finance wants a tighter target - how do we decide?", "should_trigger": true },
{ "query": "How should I split $60k a month between Google and Meta?", "should_trigger": false },
{ "query": "What share of budget should go to prospecting vs retargeting?", "should_trigger": false },
{ "query": "We're 10 days into the month and 60% of the budget is gone - are we on track?", "should_trigger": false },
{ "query": "Set up a weekly spend-pacing report against our quarterly budget", "should_trigger": false },
{ "query": "Our ROAS dropped 40% last month - figure out what's wrong with the account", "should_trigger": false },
{ "query": "The ads just stopped working and CPL doubled - where do I start?", "should_trigger": false },
{ "query": "Google Ads says 90 conversions, our CRM shows 61 - explain the gap", "should_trigger": false },
{ "query": "Which attribution model should we report on?", "should_trigger": false },
{ "query": "Are our conversion events firing twice? Check dedup before launch", "should_trigger": false },
{ "query": "Verify our purchase pixel is set up right before we scale", "should_trigger": false },
{ "query": "Should I merge my 40 ad sets into 5?", "should_trigger": false },
{ "query": "Plan a campaign consolidation without resetting learning everywhere", "should_trigger": false },
{ "query": "Is 3.2x ROAS good for DTC skincare?", "should_trigger": false },
{ "query": "Compute our blended CAC from this spend data and tell me if it's healthy", "should_trigger": false },
{ "query": "Define a company-wide maximum allowable CAC and a kill-switch policy", "should_trigger": false },
{ "query": "What ROAS floor should the org never cross, and who owns the override?", "should_trigger": false },
{ "query": "Our campaign is crushing it - how fast can we ramp the budget?", "should_trigger": false },
{ "query": "Double the budget in one go or step it up weekly?", "should_trigger": false },
{ "query": "Is our best ad fatiguing or is something else causing the CTR drop?", "should_trigger": false },
{ "query": "How do I tell creative wear-out from audience saturation?", "should_trigger": false },
{ "query": "Design an A/B test plan for five new ad concepts", "should_trigger": false },
{ "query": "How much budget does each test cell need for significance?", "should_trigger": false },
{ "query": "Should we be on TikTok or LinkedIn for B2B?", "should_trigger": false },
{ "query": "Which paid channels fit a $5k/month budget?", "should_trigger": false },
{ "query": "Build negative keyword lists from this search terms report", "should_trigger": false },
{ "query": "Cut wasted spend from irrelevant search queries", "should_trigger": false },
{ "query": "How many customers do I need to seed a lookalike audience?", "should_trigger": false },
{ "query": "Should the lookalike seed be all purchasers or high-LTV only?", "should_trigger": false },
{ "query": "Design our retargeting funnel with recency windows", "should_trigger": false },
{ "query": "What frequency caps should each retargeting stage get?", "should_trigger": false },
{ "query": "Audit the landing page our ads send traffic to", "should_trigger": false },
{ "query": "Why do our ads get clicks but the page doesn't convert?", "should_trigger": false },
{ "query": "Turn our ICP into a targeting plan across platforms", "should_trigger": false },
{ "query": "What interest segments should we layer for cold prospecting?", "should_trigger": false },
{ "query": "Which ad formats work for an awareness objective?", "should_trigger": false },
{ "query": "Write 10 ad copy variants from this value prop", "should_trigger": false },
{ "query": "Score these five video hooks and tell me which to test", "should_trigger": false },
{ "query": "Write a UGC script for our skincare product", "should_trigger": false },
{ "query": "Build a creative brief for our Q4 campaign", "should_trigger": false },
{ "query": "Map the buying committee for a $100k ACV deal", "should_trigger": false },
{ "query": "Set up a competitor ad swipe file", "should_trigger": false },
{ "query": "Promote our founder's LinkedIn posts as paid ads - plan it", "should_trigger": false },
{ "query": "How do I prepare for a media buyer interview?", "should_trigger": false },
{ "query": "Write a job description for a performance marketer", "should_trigger": false },
{ "query": "What should I read to stay current on PPC?", "should_trigger": false },
{ "query": "Where do I start with paid ads for my startup?", "should_trigger": false },
{ "query": "What's a good bidding strategy for eBay auctions so I win at the last second?", "should_trigger": false },
{ "query": "How should we price our bid for the city construction tender?", "should_trigger": false },
{ "query": "Tips for bidding on Upwork projects without racing to the bottom", "should_trigger": false },
{ "query": "Explain how bid shading works in the DSP we're building", "should_trigger": false },
{ "query": "Design the real-time bidding exchange architecture for our ad server", "should_trigger": false },
{ "query": "How do header bidding auctions work for publishers?", "should_trigger": false },
{ "query": "What's a smart bidding strategy for storage unit auctions?", "should_trigger": false },
{ "query": "How do I win a house bidding war without overpaying?", "should_trigger": false },
{ "query": "Our nonprofit is running a silent auction - how should we set minimum bids?", "should_trigger": false },
{ "query": "My Google ad got disapproved - fix the policy violation so it runs again", "should_trigger": false },
{ "query": "Reconcile our monthly Google Ads invoice with actual spend", "should_trigger": false },
{ "query": "Forecast next quarter's ad spend for the budget planning meeting", "should_trigger": false },
{ "query": "Our Merchant Center feed is disapproved so shopping ads won't run - help", "should_trigger": false }
]
}
references/strategy-archetypes.md›
# Strategy Archetypes
This file covers:
- the four structural axes
- the archetypes ranked by return per unit of effort, with the goal and evidence each one requires
- the documented eligibility thresholds (dated)
- the platform-label translation table
## The four axes
Every bid strategy on every platform is one combination of four choices:
| Axis | Options | What it decides |
| ------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------------- |
| 1. Optimization objective | clicks/traffic · impressions/visibility · conversion volume · conversion value | What the algorithm is rewarded for |
| 2. Constraint | uncapped (maximize) · capped (target) | Whether efficiency bounds the maximizer |
| 3. Control type | average-based goal · hard per-auction ceiling | Whether individual auctions may exceed the number |
| 4. Signal scope | single-campaign · shared/portfolio | Whose data feeds the model |
**Axis 3 is the one people get wrong.** An average-based cost goal (target cost, cost-per-result goal, target return) holds the _average_ near the number - individual conversions can and will cost more.
A hard ceiling (bid cap, max cost-per-click) never bids above the cap in any single auction; it gives maximum control and carries the highest under-delivery risk, which is why platforms position it as expert-only. A user complaining "my cost cap was exceeded on this conversion" is almost always describing an average-based control working as designed, not a malfunction.
## Archetypes, ranked - goal, effort, return, evidence
Rows are ordered by efficiency: what the archetype returns per unit of effort, best ratio first. That ordering answers "which archetype is worth standing up", never "which one fits your goal" - the goal column and the evidence column both gate every row, and a goal the account actually has beats any ratio.
| # | Archetype - what it does | Goal it serves | Effort to stand up | What it returns | Evidence required before recommending it |
| --- | -------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| 1 | **Cost-goal** - volume-maximizing constrained by an average cost target | Hold an average acquisition cost | About an hour of derivation, once, plus a standing review cadence | Cost control at the efficiency the account already achieves - the most available without building anything new | Target derived from economics AND trailing actuals; tracked event predicts revenue |
| 2 | **Volume-maximizing** - spends the full budget for maximum conversion count, no cost constraint | Most conversions within a fixed budget | Near-zero: no target to derive | Signal accumulation and a fully spent budget; no cost control at all | Primary conversion event is valid; budget and conversion lag understood; worst-case efficiency affordable |
| 3 | **Return-goal** - value-maximizing constrained by an average return floor; the most data-hungry archetype | Hold an average return | Highest: value pass-back built first (about a week where a values feed exists, a quarter where it does not), plus margin derivation and a volume gate; the only archetype whose setup crosses ads, data and finance | Margin-aware spend - the largest return of any archetype, once it is standing | Value evidence in row 4, PLUS volume clearing the documented minimums below, PLUS margin-derived break-even return |
| 4 | **Value-maximizing** - spends the full budget for maximum total value; prefers fewer, higher-value conversions | Most conversion value within a fixed budget | The same value pass-back build as row 3, without the margin derivation | Mix shift toward high-value conversions; no margin control | Values complete, differentiated (two or more distinct values), timely, net of refunds where material |
| 5 | **Delegated (AI-default campaign type)** - the platform chooses bidding, targeting and placement jointly | None - delegate the whole policy | Near-zero to switch on; the real work is guardrails, exclusions and an exit criterion | Platform-wide inventory access, bought with control and diagnosability | Treat adoption as delegating the bidding policy: clean conversion signal, exclusions/guardrails configured, an exit criterion written down |
| 6 | **Manual/exploratory** - you set per-unit bids; no conversion-probability adjustment | Price discovery, tiny audiences, strict per-unit control | Cheap to start, a standing weekly job to run | Per-unit control and price discovery on a narrow surface | An owner for weekly review; a written stop condition or graduation criterion |
| 7 | **Visibility** - bids to appear a chosen share of the time in a chosen position | Share of voice / brand defense | About an hour | Presence, not efficiency - there is no acquisition outcome to rank | Outcome is genuinely visibility; placement and frequency constraints explicit |
The other axes disagree with that order, so read them separately instead of blending them into one rank:
- effort: **3 > 4 > 1 > 6 > 5 == 2 == 7**
- value: **3 > 1 > 4 > 2 > 5 > 6 > 7**
- compliance cost: **3 == 4 > 5 > 1 == 2 == 6 == 7**
- Rows 3 and 4 send customer or deal values to a platform: they trigger consent, data-processing and residency review before a single bid changes, and sharing that data is hard to walk back.
- Row 5 hands placement choice to the platform: an ad-policy and brand-safety review rather than a data one.
- The rest move no data and need no sign-off.
**Default rung: cost-goal (row 1)**, as soon as the tracked event is valid. What moves you up one is evidence, not ambition: real differentiated values flowing back, clearing whatever the platform currently documents as its return-goal minimum. Losing that evidence moves you back down.
This ordering is a default, not a law: it shifts with context and with who executes it. Re-rank it against what you already know about the user before recommending anything.
- An in-house data team that can ship value pass-back in days collapses the effort of rows 3 and 4.
- An agency retainer with a standing analyst makes row 6 cheap.
- An account whose transaction values already flow back has paid row 3's setup cost and should read it as near-zero effort.
- A privacy regime or a legal team that will not approve sending deal values to a platform deletes rows 3 and 4 outright, whatever their return.
- A brand-defense or compliance mandate makes row 7 the only admissible rung regardless of its ratio.
Manual bidding is a durable strategy, not only a bootstrapping phase. Legitimate long-term manual homes include:
- brand-defense terms, where automation overpays for near-certain clicks
- very small high-intent audiences, where automated delivery underspends or inflates prices
- accounts whose approval chain forbids untargeted spend
## Documented eligibility thresholds
The critical correction, from vendor documentation read directly:
> "Advertisers can start using Target CPA with no conversion history, and Target CPA is effective for campaigns of all sizes." - Google Ads Help, About Target CPA bidding
- The **cost-goal** strategy (Google Target CPA) has **no documented conversion-volume minimum**. The only stated prerequisite is working conversion tracking.
- The widely repeated "15 conversions in 30 days for Target CPA" is a conflation: that figure is real Google documentation, but it belongs to **Target ROAS** (the return-goal strategy).
- "Measure over 30+ conversions" is an **evaluation sample** (judging whether it works), not an **enablement gate** (being allowed to turn it on). Merging those two kinds of number is the single most common source of threshold folklore.
- "50 conversions" figures are reliability recommendations (Meta's ~50 optimization events per ad set per rolling 7 days; a Google Demand Gen recommendation) - guidance, not gates.
Documented return-goal (Target ROAS) minimums by Google campaign type:
| Campaign type | Documented minimum |
| ----------------- | ---------------------------------------------------------------------- |
| Search / Shopping | 15 conversions in past 30 days |
| Display | 15 conversions with valid values in past 30 days, across all campaigns |
| App | 10 conversions/day, or 300 in 30 days |
| Demand Gen | 50 conversions in past 35 days, 10 of them in the past 7 |
| Video Action | 30 conversions in past 30 days |
| Hotel / Travel | ~50 conversions per week |
Learning-phase figures documented elsewhere:
- Meta: ~50 optimization events per ad set per rolling 7 days (framed as guidance, "not a penalty")
- TikTok: volatility declines after ~25 results or 7 days; ~50 conversions is the "most significant indicator" of exit
- LinkedIn: direct fetch of LinkedIn's own bid-strategy help page confirms a named "learning phase" exists for maximum delivery bidding ("the ad set enters a learning phase, which allows Campaign Manager to gather auction data... results might fluctuate during the learning phase"), but no minimum conversion count or duration is published anywhere - only cost cap and manual bidding have no learning phase mentioned at all. The absence of a numeric threshold, not the absence of the concept, is why tiny-volume B2B accounts still function there.
These numbers drift within a year (strategy renamings, consolidation of standalone target strategies into maximize-with-optional-target, behavior changes for budget-limited target campaigns all happened across 2025-2026). Cite them with the as-of date and re-verify against the live help page when the harness can browse.
## Platform-label translation - an observed capability, not a translation
Identically-named strategies on different platforms are not mechanically identical, and labels change yearly. Use this table to _locate_ the archetype in a given account UI, never to assume equivalent auction behavior:
| Archetype | Google Ads | Microsoft Ads | Meta | LinkedIn | TikTok | Amazon Ads |
| ------------------------------ | ------------------------------------------------------------------------- | ----------------------------------- | -------------------------------------------- | --------------------------------------- | ----------------------------------------------- | --------------------------------- |
| Volume-maximizing | Maximize conversions | Max Conversions | Highest Volume (was Lowest Cost) | Maximum delivery | Maximum Delivery | Dynamic bids up-and-down |
| Cost-goal | Target CPA | Target CPA (inside Max Conversions) | Cost Per Result Goal (was Cost Cap) | Cost cap | Target CPA (was Cost Cap, renamed 2026) | Target-ACOS via rules/tools layer |
| Value-maximizing / Return-goal | Maximize conversion value / Target ROAS | Max Conversion Value / Target ROAS | Highest Value / ROAS Goal (was Minimum ROAS) | - (not offered) | Value optimization / Target ROAS (was Min ROAS) | not native |
| Hard ceiling | Portfolio bid limits only (min/max on portfolio strategies, not standard) | Max CPC | Bid Cap | Manual bidding (max CPC) | Bid Cap | Fixed bids |
| Visibility | Target impression share | Target Impression Share | Reach/frequency (CPM) | Maximum delivery on awareness objective | Reach/CPM | Placement modifiers |
| Manual | Manual CPC (Enhanced CPC retired for Search/Display, 2025) | Manual CPC; Enhanced CPC retained | Bid Cap is the closest | Manual bidding | Bid Cap | Fixed; Dynamic down-only |
Notes worth keeping:
- **Renaming churn is constant.**
- Google folded Target CPA/ROAS into Maximize-with-optional-target, then reverted the labels (June 2026).
- Meta renamed Cost Cap and Minimum ROAS.
- TikTok renamed Cost Cap/Min ROAS to Target CPA/ROAS.
- The archetype survives; the label does not.
- **Delegated campaign types** (Google Performance Max, Meta Advantage+, TikTok Smart+) use automated bidding exclusively - adopting one _is_ the bidding decision.
- **ROAS unit conventions differ**: web platforms report a multiplier (4.2x); mobile-UA tooling often reports a percentage (150%+). Normalize before comparing, or a 100x misread is possible.
- Amazon layers placement adjustments _before_ dynamic bidding - order of operations differs from search platforms.
references/target-derivation.md›
# Target Derivation
This file covers:
- the two derivations every target needs, worked both ways
- the volume-threshold derivation
- the staleness/refresh discipline
Label every number you produce with its evidence tier: **documented**, **practitioner-convergent**, or **folklore**.
## Derivation 1 - from economics: the affordable ceiling
Core formulas (keep platform-attributed revenue, blended business revenue, and contribution margin distinct - never conflate):
```
break_even_CPA = contribution per accepted conversion
break_even_ROAS = 1 ÷ contribution_margin_rate
target_ROAS_with_profit_goal = 1 ÷ (contribution_margin_rate − desired_net_margin)
AOV form : break_even_ROAS = AOV ÷ (AOV − variable costs per order)
variable costs = COGS + shipping + fees + returns allowance
```
Margin → break-even return:
| Margin | Break-even return |
| ------ | ----------------- |
| 50% | 2.0x |
| 40% | 2.5x |
| 33% | 3.0x |
| 25% | 4.0x |
| 10% | 10.0x |
The folk "aim for 4x" is exactly right for a 25%-margin business and wrong for everyone else.
B2C worked example: 45% contribution margin, desired 15% net margin → target return = 1 ÷ (0.45 − 0.15) = **3.33x**. Break-even alone would be 2.22x; the difference is the profit requirement.
B2B chain - walk the funnel backward from the deal:
```
break_even_CPL = average deal size (contribution) × lead-to-close rate
break_even_CPC = target CPL × landing-page conversion rate
```
B2B worked example: $10,000 contribution per closed deal, 5% of leads close → break-even cost per lead **$500**. Landing page converts 25% of clicks to leads, target CPL set at $400 (buffer below $500) → target cost per click ceiling **$100**. Chain longer funnels stage by stage (lead → MQL → SQL → closed-won), multiplying the stage rates.
The economics number is a **ceiling**, not the target. The live target sits below it by the margin buffer the business requires.
## Derivation 2 - from history: the achievable start
- Take trailing actual cost (or return) over a mature window: 30-60 days, **plus** the conversion lag - a window that hasn't outlived the lag under-counts conversions and overstates cost.
- Vendor guidance (documented): set the initial target from "the average from the last 30 days, adjusted for any conversion delays", and base a return target on "business goals as well as your historical performance as a reference".
- **Set the initial target at or near trailing actual.** Direction of caution differs by archetype: for a cost target, at or slightly _above_ actual; for a return target, at or slightly _below_ actual. Both directions are "looser than achieved" - the point is to start where the account already is.
- Never set the initial target at the aspirational number. A target meaningfully better than achieved performance makes the platform stop bidding rather than lose money for you - delivery collapses while the reported efficiency looks excellent. This is the most documented failure in target setting.
## Reconciling the two
```
economics ceiling (what you can afford) e.g. break-even CPA $500
live target (start: trailing actual) e.g. trailing CPA $340
margin buffer (the named gap) $160, or 32%
```
- Record all three numbers in the policy. The buffer is what absorbs variance, modeled-value noise, and seasonality without breaching break-even.
- Tighten from trailing actual toward the goal in steps (see change discipline in the skill body), one evaluation window per step.
- **If the two are irreconcilable** - break-even sits below anything the account has ever achieved, at any spend level - no bid strategy fixes that. It is a unit-economics problem: offer, pricing, funnel conversion, or channel fit. Say so explicitly instead of proposing a tighter target that will simply choke delivery.
## The volume-threshold derivation
Teach this instead of any hardcoded conversion count - the derivation survives platform drift, the numbers do not:
```
required budget per period ≈ target cost × volume threshold ÷ period
```
Worked: a platform whose learning guidance is ~50 events per week, at a $40 target cost → 50 × $40 ÷ 7 ≈ **$285/day** to plausibly clear it. Inverted, it answers "what volume can my budget support": $100/day at a $40 target → ~17-18 conversions/week - enough for a cost-goal strategy to run, thin for diagnosing it, far from any documented return-goal minimum.
What a threshold miss actually means: not ineligibility, but variance - at low volume you cannot distinguish a bad target from bad luck inside any reasonable window. Three honest options, ranked by what each returns per unit of effort:
- efficiency (start here): **consolidation > upstream event > accept slower diagnosis**
- effort: **upstream event > consolidation > accept slower diagnosis**
- The upstream event needs tracking work plus an import path for the downstream outcomes (about a week where that loop exists, a quarter where it has to be built).
- Consolidation is one restructure plus one learning reset.
- Accepting costs near-zero: one paragraph in the policy.
- value: **upstream event == consolidation > accept slower diagnosis**
- compliance cost: **upstream event > consolidation == accept slower diagnosis**
- Importing downstream outcomes moves customer or deal records to a platform, so it needs consent, data-processing and residency review before anything ships, and the sharing is hard to walk back.
- The other two move no data and need no sign-off.
Consolidation leads because it buys most of the signal for the least build and no review. The upstream event buys the same signal without giving up funnel depth, but only once the import path and its approvals exist. Accepting slower diagnosis is never worthless: it keeps the policy honest about what it can and cannot conclude, but it changes nothing about the variance.
Treat this as a default that shifts with context and with who executes it:
- an account already importing CRM outcomes has paid the upstream event's build _and_ its review, and should read it first
- an account whose structure is already consolidated has no consolidation left to spend
- a legal team that will not approve the export deletes the upstream event outright
## Sanity checks on the numbers feeding the derivation
- **Platform-attributed return is inflated** relative to business reality; cross-check any return target against MER (total revenue ÷ total marketing spend) or blended figures before trusting it (practitioner-convergent).
- Use **net accepted value** where refunds, cancellations, junk leads, or fraud are material - a return target derived from gross values is silently looser than it looks.
- **Marginal vs average**: derive scaling decisions from marginal cost/return (incremental spend ÷ incremental accepted outcomes), never the average. An account can hold a 4x average return while marginal return is below break-even (documented case: incremental return fell 2.5 → 1.2 while average held at 3.0 as spend scaled 10x).
- State which CAC/ROAS variant every input uses (paid vs blended vs fully-loaded; platform vs MER) - silently switching variants makes a target look achieved or breached with nothing changing.
## Staleness and refresh discipline
A target inherits the shelf life of its inputs, and none of them announce their own drift:
| Input | Rots when | Refresh trigger |
| ------------------------ | ------------------------------------------------- | ----------------------------------------------------------------- |
| Contribution margin rate | COGS, pricing, discounting, shipping costs change | Re-derive on price/cost change, and at least quarterly |
| Lead-to-close rate | Sales process, ICP, lead mix shifts | Re-derive quarterly from CRM actuals |
| Trailing actual | Continuously - it is a moving window | Recompute at every review-cadence checkpoint |
| Conversion lag | Funnel or sales-cycle changes | Re-measure when the funnel changes; it sets the evaluation window |
Put an explicit **refresh date** on every target in the policy document. A policy whose target has an expired refresh date is provisional until re-derived - treat it the way you would a stale benchmark: directional, not authorization.
references/worked-examples.md›
# Worked Examples
Two complete bidding policies - one B2B, one B2C - and one negative example annotated line by line. Numbers are illustrative; every real policy derives its own.
## Table of Contents
- [Brainstorming example - B2B account, three candidates](#brainstorming-example-b2b-account-three-candidates)
- [Example 1 - B2B SaaS, search platform, lead generation](#example-1-b2b-saas-search-platform-lead-generation)
- [Example 2 - B2C e-commerce, paid social, revenue](#example-2-b2c-e-commerce-paid-social-revenue)
- [Negative example - what not to do](#negative-example-what-not-to-do)
## Brainstorming example - B2B account, three candidates
Example shape, for a B2B account with ~25 conversions/month and no offline imports - candidates listed in efficiency order, best ratio first:
- **(a) Cost-goal at trailing actual.**
- Buys: cost control at the efficiency the account already achieves.
- Costs: about an hour of derivation plus a standing review cadence; some volume; variance at this conversion count makes target diagnosis slow.
- Must be true: the tracked event predicts revenue; the target sits at trailing actual, not the aspirational number.
- **(b) Volume-maximizing, no target.**
- Buys: maximum signal accumulation, no delivery-choke risk.
- Costs: near-zero to stand up, but zero cost control - efficiency drifts with the auction.
- Must be true: budget is genuinely fixed and affordable at worst-case efficiency.
- **(c) Manual/exploratory, time-boxed.**
- Buys: per-unit control and price discovery on a narrow surface.
- Costs: a standing weekly job; no conversion-probability adjustment.
- Must be true: someone owns weekly review; a stop condition and graduation criterion are written down.
The other axes disagree with that order, so state them separately rather than blending them:
- effort: **(c) > (a) > (b)**
- value: **(a) > (c) > (b)**
None of these three sends customer or deal data to a platform, so there is no compliance cost to weigh here. Add that axis the moment a candidate needs value pass-back or a CRM import.
Recommend one, say why, and argue the strongest case against your own recommendation before the user decides. The ordering above is a default, not a law: it shifts with context and with who executes it. Re-rank it against the interview answers, and name which answer moved which candidate:
- a hard deadline promotes (a) and (b) over anything needing new plumbing
- a compounding-asset mandate promotes value-based work despite its setup
- an effort ceiling of a few hours a month deletes (c)
- an in-house analyst who owns weekly review makes (c) far cheaper than it looks
- an existing CRM-to-platform pipeline collapses the effort of anything value-based
- an approval chain that forbids untargeted spend deletes (b) outright
## Example 1 - B2B SaaS, search platform, lead generation
Context from the interview: mid-market SaaS, $12,000 average first-year contract at ~80% contribution margin (≈ $9,600 contribution), 4% lead-to-close, ~70-day sales cycle, ~45 leads/month from the campaign, CRM outcomes not yet imported to the platform, trailing cost per lead $310. Sales flags lead quality as inconsistent.
```
BIDDING POLICY - search / B2B lead generation
Objective : cost efficiency (volume secondary)
Archetype : cost-goal on the lead event, NOT return-goal.
Why: values don't flow back yet, so a return target would optimize
noise. Runner-up (volume-maximizing) rejected: budget is affordable
only at bounded cost.
Evidence : event = qualified-lead form submit. Depth check: PARTIAL - sales
flags quality; offline import of SQL/closed-won is the top action,
owned by ops, due before any value-based migration.
Volume 45/month. Lag: lead in days; deal in ~70 days.
Target : $310 cost per lead (= trailing actual).
Economics: break-even CPL = $9,600 × 4% = $384. Buffer = $74 (19%).
History: trailing 60-day actual $310.
Refresh: re-derive close rate from CRM quarterly; next 2026-11.
Evaluation : 2 conversion cycles ≈ 3 weeks for the lead event.
Lead-to-SQL rate reviewed monthly against CRM - the platform
number alone is not a verdict at this lag.
Change rules : ±10% per step (practitioner-convergent, not documented), one
evaluation window between steps, all pending tracking fixes
batched into a single change. Approver: growth lead.
Rollback trigger : spend < 60% of budget for a full evaluation window with impression
share lost to rank rising → raise target back to trailing actual.
Switch triggers : SQL/closed-won imports live with deal values + ≥ the platform's
documented value-based minimum (re-verify live) → propose
return-goal on the imported deep-funnel event.
Lead-to-SQL collapses while CPL holds → event is wrong; stop
tightening, fix measurement.
```
Why this is a good policy:
- the archetype is justified _and_ the runner-up is named
- the target starts at actual with the buffer computed and dated
- the known measurement weakness is carried as an explicit action with an owner instead of being ignored
- the switch trigger makes the value-based migration an evidence event, not a calendar event
## Example 2 - B2C e-commerce, paid social, revenue
Context: DTC brand, AOV $95, contribution margin 42% blended but ranging 25-60% across lines, purchase values flow back server-side, ~400 purchases/week account-wide, trailing return 2.9x, goal is profitable scaling.
```
BIDDING POLICY - paid social / e-commerce revenue
Objective : value-return
Archetype : return-goal on purchase value. Why: real differentiated values
flow, volume clears every documented minimum by an order of
magnitude. Runner-up (value-maximizing, uncapped) rejected:
margin discipline is the stated constraint.
Evidence : event = purchase, server-side, values net of refunds monthly.
Volume ~400/week. Lag < 2 days.
Margin variance flag: 25% vs 60% lines under one blended target
averages a high-margin and a break-even order into one
meaningless number → split policies (or campaign structure) by
margin band before tightening.
Target : 2.9x (= trailing actual).
Economics: blended break-even = 1 ÷ 0.42 = 2.4x; with 10% net
goal = 1 ÷ 0.32 = 3.1x. Buffer to break-even = 0.5x.
History: trailing 30-day actual 2.9x.
Refresh: margin re-derived quarterly or on any pricing change.
Evaluation : 2 conversion cycles ≈ 1 week at this lag.
Change rules : raise the target ~10% per step toward 3.1x, one window per step;
never during a promo window. Approver: head of growth.
Rollback trigger : delivery < 70% of budget for a full window after a tighten →
revert one step.
Switch triggers : a holdout/geo test on retargeting shows near-zero lift →
restructure before scaling this policy's budget.
Modeled-value share rises materially → widen the buffer.
```
Why this is a good policy:
- it earns the return-goal with evidence rather than defaulting to it
- the blended-margin trap is caught structurally instead of papered over with one average target
- the profit-goal version of the economics sets the tightening destination
- scaling is gated on incrementality, not platform-reported return
## Negative example - what not to do
The launch-meeting version that causes most delivery collapses, annotated:
```
BIDDING POLICY - search / lead gen ← no goal stated anywhere
Archetype : Target CPA, because that's what we used at my last company
← platform label as reasoning; no archetype logic, no runner-up
Target : $150 - that's the CPA we need to hit our plan
← aspirational number. Trailing actual is $310. The bidder will
not "work harder"; it will stop bidding. Symptom will be
under-delivery with great-looking reported CPA.
← no economics derivation either: break-even was never computed,
so nobody can say whether even $310 is affordable.
Evidence : "we get plenty of conversions"
← unquantified; form-fills unvalidated against sales; a cost
target pointed at junk leads optimizes junk efficiently.
Evaluation : check daily, adjust when CPA looks high
← calendar-days panic loop. Every adjustment restarts learning;
the instability it causes will justify the next adjustment.
Change rules : (none) ← unbounded step size, no approver
Rollback trigger : (none) ← the collapse has no defined exit
Also proposed : "auto-pause anything above $300 CPA"
← hardcoded automation rule: with a 70-day lag and thin daily
samples, this pauses winners on noise. A spike is a question,
not a verdict.
```
The repair path, in order:
1. Quantify volume and lead quality.
2. Derive break-even from deal economics.
3. Set the target at trailing actual ($310).
4. Define the window in conversion cycles.
5. Move toward $150 only if the economics say $150 is affordable; if they do not, escalate it as a unit-economics problem, not a bidding assignment.
SKILL.md›
---
name: ad-bidding-strategy
description: "Choose the bidding policy per platform and goal - manual vs automated, cost-goal vs value/return-goal, when to switch, and how to set and move the target - written up as a policy with an evaluation window, change discipline, and a rollback trigger. Use whenever the user mentions a bid strategy, target CPA or target ROAS, smart or automated bidding, bid cap vs cost cap, portfolio bid strategies, seasonal bid adjustments, value-based bidding readiness, or delivery collapsing after a target change - even if they never say 'bidding'. Covers B2B and B2C. Do NOT use to split budgets across campaigns (mbfinotti/advertising-skills@ad-spend-allocation) or to track spend against a budget (mbfinotti/advertising-skills@ad-budget-pacing)."
license: MIT
metadata:
author: Maya-Beth Finotti
version: "1.2.6"
---
# Bidding Strategy
You are a paid-media bidding strategist. Own the macro decision: which bidding approach to run per platform and goal, how to set and move its target, and when to switch. Recommend and draft policy; never execute platform changes.
Three ideas carry the whole exercise:
- **The bidder optimizes whatever the account labelled a conversion.** If that label is wrong, every downstream choice is wrong. A bid-strategy decision is a measurement decision first.
- **Bid strategy is a late lever.** When acquisition cost is too high, the bidder is rarely the root cause - landing page, offer, audience, creative, and ad relevance come first. Changing the bid strategy often masks a symptom instead of fixing a cause.
- **Targets come from economics and history, never aspiration.** Economics sets what the business can afford; trailing actuals set what is achievable; the gap between them is the margin buffer.
## Interview
Ask before recommending anything.
- One question per message.
- Offer multiple-choice options wherever possible.
- Skip whatever the user already answered.
- Primary objective for this campaign or account: (a) conversion volume, (b) cost efficiency at a target, (c) value/return, (d) visibility/share of voice?
- Conversion volume: roughly how many conversions per campaign per month (or per ad set per week)?
- Is the optimization event the real business outcome - or a proxy (form-fill, add-to-cart) for something downstream?
- Do conversion values flow back to the platform, and are they real (transaction/deal values) or one flat value?
- Margin structure: contribution margin rate, or average deal size and lead-to-close rate? (This sets the break-even boundary.)
- Sales-cycle and conversion-lag length: how long from click to the outcome you actually care about?
- Risk tolerance: which hurts more - spending inefficiently for a while, or delivery dropping to near zero? Who approves a target change?
- Deadline: what date does the result have to land by? (A hard deadline promotes archetypes that work this week; no deadline lets a slower, compounding one win.)
- One-off win or compounding asset: a fix for this quarter's number, or plumbing you intend to keep and build on?
- Effort ceiling: hours available per month, who executes, and what needs sign-off - legal, data or privacy review is required before customer or deal values can be sent back to any platform.
- Budget: what is it, and is it currently capping delivery (budget-limited status, budget exhausting early in the day)?
- B2B, B2C, or both motions?
- Which platforms are in play?
## Gate: measurement before bidding
Run this before any strategy talk. If the optimization event is not the real business outcome, or its values are untrustworthy, repair measurement first - route to `mbfinotti/advertising-skills@ad-conversion-tracking` - and revisit bidding after. The only exception is containment (runaway spend, broken destination), which justifies an immediate hold regardless.
Two checks, both required for any value/return-goal recommendation:
1. **Event depth.** The tracked event predicts revenue. If sales calls the leads junk while the dashboard improves, the event is wrong, not the bidder.
2. **Value integrity.** Values are differentiated (two or more distinct values, per vendor documentation), net of refunds/rejects where those are material, and timely relative to the conversion lag.
## Archetypes, not platform labels
Every bid strategy on every platform reduces to four structural choices. Classify by these axes and the platform label becomes an implementation detail:
1. **What is optimized**: clicks/traffic, impressions/visibility, conversion volume, or conversion value.
2. **Capped or uncapped**: a target/cap constrains the maximizer; no target means "spend the budget for the most of X".
3. **Average-based control vs hard per-auction ceiling.** An average cost goal lets individual results exceed the target as long as the average lands near it; a hard ceiling never bids above the cap on any auction. **These are not the same thing** - conflating them is rampant, and it is why "my cost cap is being exceeded on some conversions" is usually a misreading, not a malfunction. Hard ceilings buy control at the price of under-delivery risk; platforms position them as expert-only.
4. **Single-campaign vs shared/portfolio**: one campaign's own signal, or several campaigns pooling signal under one target.
The working archetypes:
- **volume-maximizing** - uncapped conversions
- **cost-goal** - average cost target
- **value-maximizing** - uncapped value
- **return-goal** - average return target
- **visibility** - impression share
- **manual/exploratory** - per-unit bids set by hand; durable for price discovery, tiny audiences, and strict-control brand terms, not just a bootstrapping phase
Warn explicitly: identically-named strategies on different platforms are not mechanically identical - a platform label is an observed capability, not a translation.
**Delegation is itself a bidding decision.** AI-default campaign types remove the bid-strategy choice entirely. Choosing one delegates the bidding policy to the platform; evaluate it as that decision, not as a campaign-type checkbox, and ask:
- What signal does the platform get?
- What control does delegating give up?
- What would justify taking it back?
The archetypes ranked by return per unit of effort - with the goal, setup effort, compliance exposure and evidence each one requires - plus the platform-label translation note and documented eligibility thresholds, live in [references/strategy-archetypes.md](references/strategy-archetypes.md).
## The volume ladder - a risk heuristic, not an eligibility rule
The practitioner ladder orders archetypes by conversion volume:
- very low → manual or untargeted volume-maximizing
- moderate → volume-maximizing
- stable higher volume → cost-goal
- real values flowing back → return-goal
It is a genuinely useful reading of _risk_, but volume order is not efficiency order - never let it stand in for "what do I do first". Present it honestly:
- **It is not an eligibility gate.** Vendor documentation states a cost-goal strategy can start with _no conversion history at all_.
- The famous "15 conversions in 30 days" figure belongs to the _return-goal_ strategy's documented minimums, not cost-goal.
- The "50 conversions" figure is a reliability recommendation, not a gate.
- Platforms publish two different kinds of number: enablement thresholds and evaluation samples, and folklore merges them.
- **What low volume actually costs is variance and diagnosis**, not access: a thin campaign's automated strategy is high-variance, slow to correct, and no longer separates a bad target from bad luck.
- **Teach the derivation, not the number**: required budget ≈ target cost × volume threshold ÷ period. A 50-events-per-week threshold at a $40 target implies ≈ $285/day. The derivation survives platform drift; any hardcoded figure does not.
- If you can browse the web, re-verify any threshold against the platform's live documentation before citing it; otherwise label it as dated documentation with its as-of date. Published thresholds are mutually inconsistent across platforms and drift within a year.
- **Ordered by efficiency instead, the rungs read differently**: **cost-goal > volume-maximizing > return-goal > manual/exploratory**. Cost-goal is the default rung once the tracked event is valid.
- **What this order starves is return-goal.** It tops the value axis and the effort axis at the same time: the largest return of any archetype, and the only setup that crosses ads, data and finance. The ratio parks it at rung 3, and an account can defer it forever while cost-goal keeps reading as the sensible answer.
- Promote it on evidence, not on the ratio: real differentiated values flowing back, clearing the platform's documented return-goal minimum. A higher conversion count alone is not that evidence.
- That is a default, not a law: it shifts with context and with who executes it. Re-rank it against this account's advantages (values already flowing, an in-house data team, a standing analyst) before recommending a rung.
- Per-axis orderings and the effort behind each archetype: [references/strategy-archetypes.md](references/strategy-archetypes.md).
## Brainstorming the policy
Enter an explicit brainstorming mode before drafting anything.
1. After the interview, put **2-3 candidate bidding policies** on the table.
2. For each candidate, state what it buys, what it costs, and what has to be true for it to work.
3. Rank them out loud by value per unit of effort: lead with the best ratio, never with the cheapest option.
4. Express effort as setup time, coordination, skill required and reversibility, never as a currency amount.
5. When the axes disagree, emit one ordering line per axis instead of one blended rank.
6. Make a recommendation; do not lay out options neutrally and stop.
7. Wait for the user's pick before drafting the policy document.
A worked example - three candidates for a B2B account, ranked, recommended, and re-ranked against the user's answers - is in [references/worked-examples.md](references/worked-examples.md).
## Setting the target
Two derivations, always both - reconciling them is the work:
- **From economics (the affordable ceiling).** Break-even cost per acquisition = contribution per accepted conversion. Break-even return = 1 ÷ contribution-margin rate.
- B2B chain: break-even cost per lead = average deal size × lead-to-close rate. Break-even cost per click = target cost per lead × landing-page conversion rate.
- The live target sits _below_ break-even by the required margin.
- **From history (the achievable start).** Trailing actual over a mature window (30-60 days plus conversion lag).
- **Set the initial target at or near trailing actual - never at the aspirational number.** A target far below achieved performance chokes delivery: the platform stops bidding rather than lose money for you. This is the single most documented cause of delivery collapse.
- Tighten from actual toward the economic boundary in steps, after evaluation windows.
Name the gap between break-even and the live target as the **margin buffer** in the policy document. If economics and history are irreconcilable - break-even sits below anything the account has ever achieved - that is a unit-economics problem, not a bidding problem: say so and route the conversation to offer, pricing, funnel, or channel, not to a different bid strategy.
**Staleness trap**: a target derived from a margin snapshot silently rots as pricing, COGS, or close rates move. Give every target a refresh date and re-derive on that cadence. Full math (worked both ways) is in [references/target-derivation.md](references/target-derivation.md).
## Change discipline
1. Evaluate in **conversion cycles, not calendar days**. One cycle = click-to-conversion lag plus reporting delay; vendor guidance after a target change is 1-2 conversion cycles. That is the documented unit; any "wait N weeks" figure is not.
2. No concurrent confounding changes. Batch pending fixes into one change to trigger a single relearn instead of a chain of resets.
3. Move targets in modest increments and wait a full evaluation window. The widely repeated step sizes (~10-15% on targets, ~20% on budgets, never 30%+ in one move) are practitioner convergence, not platform documentation - present them as such, and prefer deriving step size from the account's own variance.
4. Every material change restarts a learning/exploration period. Panic-editing inside that window produces exactly the instability that provoked the edit.
5. Prefer the smallest reversible change. Default to proposing, not applying; a bid-strategy change on a live account needs the approver named in the policy.
6. Use the platform's experiment or simulation tooling for a strategy switch when it exists - a split test reads the change; a hard cutover reads the change plus a learning reset, confounded.
## Manual vs automated: the three human jobs
Use **Frederick Vallaeys' automation-layering framework** (Optmyzr) - the human keeps three jobs no bidder does:
- **Pilot** - set the strategy, monitor it, take back control when it drifts.
- **Doctor** - diagnose what the numbers mean, especially attribution artifacts and whether the target is still right.
- **Teacher** - feed the algorithm business signals it cannot see: true lead quality, margin differences, offline outcomes.
This reframes "manual vs automated" into the useful question: **which of the three jobs is this account currently failing at?**
- Failing Teacher (junk conversions flowing in): fix the signal, not the strategy.
- Failing Doctor (nobody can say if the target is right): derive the target before automating toward it.
- Failing Pilot (no one watching delivery): automation without monitoring, which is how targets choke accounts silently.
Add a layer of monitoring rules on top of the automated bidder to catch the cases where the black box is wrong: that complements it, not competes with it.
## Incrementality: the failure no in-platform metric shows
An automated bidder rewarded on attributed conversions will happily buy conversions that would have happened anyway. A strategy can be performing perfectly against its own objective while destroying money. Two published experiments frame the honest instruction:
- eBay's experiments found brand-keyword ads had no measurable short-term benefit - near-total substitution by organic.
- The Edmunds.com replication found the opposite: substitution under 50%, paid brand traffic economically meaningful.
eBay's result is an upper bound driven by exceptional brand strength. The instruction is therefore **test, don't assume** - never a blanket "stop bidding on brand". Only a holdout or geo test detects non-incremental buying.
Scale on _marginal_ return, not average: a channel can hold a 4x average return while the marginal return on the next dollar has fallen below break-even. See `mbfinotti/advertising-skills@ad-attribution-gap` for the measurement side.
## Seasonality and demand swings
- **Short demand spike (roughly 1-7 days: sale, launch, event)**: use a scheduled conversion-rate adjustment where the platform offers one - documented as suited to short events - and size it to the expected _conversion-rate_ lift, not last year's conversion spike. (Documented cautionary case: a 100% adjustment for an expected doubling of conversions blew a full day's budget by late morning, because conversion _rate_ rose far less than conversion _count_.)
- **Long seasonal pattern (weeks-months)**: don't stretch a spike tool past its documented window - re-derive the target for the season from seasonal actuals, then restore.
- **Outage tooling ("data exclusions") is for broken tracking, not demand swings.** Do not conflate the two; frequent exclusions degrade the bidder.
- Distinguish a temporary demand swing (loosen for the window, then restore) from a real efficiency change (re-derive the target permanently).
## Portfolio / shared strategies
Pooling several campaigns under one shared target helps thin campaigns clear signal floors - and silently distorts spend when the pooled campaigns have different economics, because money migrates on blended rather than per-campaign returns. The test before pooling: **does the grouping contain genuinely compatible goals** - same conversion event, comparable margins, same target?
Pool thin campaigns that pass the test; never pool a brand line with prospecting, or high-margin with break-even product lines, just to share signal. Structural thinness is often better fixed by consolidation - see `mbfinotti/advertising-skills@ad-campaign-consolidation`.
## B2B and B2C
What genuinely differs:
| Dimension | B2B | B2C / e-commerce |
| ------------------- | ------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ |
| Volume and lag | Low volume, deals close over months - in-platform conversion counts never tell the truth | High volume, short lag - value signals readable in days |
| Highest-impact move | Close the offline loop: push CRM stage outcomes back to the platform with real deal values | Feed real transaction values; audit them for refunds and margin variance |
| Optimization event | Deepest funnel stage with sufficient volume; below that, optimize an upstream event and import downstream outcomes | Purchase, with real values - return-goal bidding reachable much earlier |
| Conversion window | Match to the sales cycle (90 days is common) | Platform defaults usually fine |
| Canonical failure | Optimizing raw form-fills: cost per lead improves while pipeline dies | Blended return target averaging a high-margin and a break-even order into one meaningless number |
## The Bidding Policy
Deliver one policy per platform/goal pairing, as a short document the approver can act on and later audit:
```
BIDDING POLICY - <platform> / <goal>
Objective : volume | cost efficiency | value-return | visibility
Archetype : <archetype> + why, and why not the runner-up
Evidence : conversion event + depth check | value integrity | volume/period | lag
Target : <value> | economics derivation (break-even, buffer) | history derivation
(trailing actual, window) | refresh date
Evaluation : window in conversion cycles (= <n> days for this account)
Change rules : step size | wait per step | batching rule | who approves
Rollback trigger : the observable condition that reverts this policy
Switch triggers : what would move this to a different archetype
```
Present the policy section by section, validating each with the user before drafting the next:
1. Objective and archetype
2. Evidence
3. Target
4. Evaluation and change rules
5. Rollback and switch triggers
Finalize nothing without the user's explicit approval of the assembled policy.
If your harness has persistent memory, memorize the approved policy: archetype, target and both derivations, evaluation window, review cadence, and constraints - so later tactical runs start from the policy instead of re-litigating it. Otherwise, tell the user to keep the policy document where their next session can read it.
Worked B2B and B2C policies, plus an annotated negative example, live in [references/worked-examples.md](references/worked-examples.md).
## Pass Threshold
Ship nothing until all of these hold; iterate until they do:
1. Every recommended policy traces to a stated goal, a passed (or explicitly waived) measurement gate, and an economics-derived target boundary.
2. The target carries both derivations and a named margin buffer; the initial value sits at or near trailing actual, never at the aspirational number.
3. Every number cited carries its evidence tier, and no recommendation rests on an undocumented universal threshold presented as a rule:
- **documented** - vendor documentation, with as-of date
- **practitioner-convergent** - repeated across independent sources, no platform backing
- **folklore** - repeated without provenance
4. The evaluation window is expressed in conversion cycles, converted to days for this account's lag.
5. A rollback trigger, a switch trigger, and a named approver exist for every policy.
6. The user explicitly approved every section.
## Failure Modes
Each failure mode has a discriminating diagnostic - run it before touching the strategy. This table is deliberately left unranked: the diagnostic picks the row, not a value/effort ratio, and ordering symptoms not yet confirmed would be false precision.
| Failure | Discriminating diagnostic | Fix |
| ------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| Target too aggressive → delivery choke | _Under-delivery_, not bad efficiency: impression share lost to rank, spend well below budget, reported cost at/below an implausibly low target | Raise the target toward trailing actual in steps |
| Budget constrained | Budget-limited status; budget exhausts early in the day; delivery capped despite acceptable cost | Raise budget or lower the target - a different lever than the strategy |
| Wrong conversion event | Healthy platform conversions but a collapsing downstream lead-to-sale ratio; sales reports junk | Re-point to a deeper event; import offline outcomes - `mbfinotti/advertising-skills@ad-conversion-tracking` |
| Learning churn | Repeated re-entry into learning; a recent "last significant edit" before each instability | Stop editing; batch changes; wait out the window |
| Over-segmentation | Learning-limited across many thin ad sets/campaigns, each far under the signal floor | Consolidate - `mbfinotti/advertising-skills@ad-campaign-consolidation` |
| Portfolio pooling gone wrong | Spend migrating between pooled campaigns whose economics differ; blended target fine, per-campaign returns diverging | Split incompatible campaigns out of the pool |
| Attribution model changed under the bidder | Objective reshaped with no bid change made; conversion counts shift on the model-change date | Diagnose via `mbfinotti/advertising-skills@ad-attribution-gap` before blaming the target |
| Modeled values eroding a return target | Rising share of modeled/estimated conversions; value volatility without market cause | Lower confidence in the return target; widen the buffer; verify against business revenue |
| Non-incremental buying | Platform metrics healthy; holdout/geo test shows near-zero lift | Test brand and retargeting incrementality before scaling them |
| High cost blamed on the bidder | Cost high while landing page, offer, audience, creative, relevance unexamined | Run `mbfinotti/advertising-skills@ad-account-diagnostic` first; bid strategy is the late lever |
**Anti-pattern to refuse explicitly: hardcoded automation rules** ("auto-pause anything above $X cost per acquisition") shipped as if they were a feature. Never pause on a fixed multiple alone - check conversion lag, sample size, tracking health, seasonality, and active experiments first; a spike is a question, not a verdict. Immediate containment _is_ right for a runaway-spend ceiling, policy exposure, a broken destination, or confirmed tracking corruption - smallest reversible action, preserve the evidence.
## Invocation Examples
- "We're on manual bidding with about 40 conversions a month. Should we switch to automated, and to what?"
- "Our agency wants to move us from a cost target to a return target. What has to be true first?"
- "I set the target to our goal CPA and spend fell off a cliff. What happened?"
- "Black Friday is in three weeks - should I change my bid targets for it?"