# Conner Crowe: full content > I own strategy and execution for ecommerce and service businesses: paid acquisition, conversion tracking, the weekly work. Not an agency. This is the full-content companion to https://connercrowe.com/llms.txt. That file is the curated index of the site. This one inlines the text of every answer page, blog post, and case study so the substance is available in a single fetch. Conner Crowe is one person, not a team. The site writes in first-person singular throughout. Static pages such as /pricing/, /services/, /about/ and the frameworks are indexed in /llms.txt with descriptions and are not inlined below. Generated at build time. Content as of 2026-08-26. --- # Answers: Shopify Storefronts Hub: https://connercrowe.com/shopify-storefront/ ## Can I customize a Shopify theme myself or do I need a developer? URL: https://connercrowe.com/shopify-storefront/customize-shopify-theme-yourself-or-developer/ Published: 2026-07-29 | Updated: 2026-08-11 Answer: You can handle anything the theme editor exposes: sections, colors, fonts, layout order, most app blocks. You need a developer the moment the change requires editing Liquid, JavaScript, or CSS: custom product cards, template logic, speed work, and anything touching checkout or tracking. The line is the code editor. Cross it casually and small changes start breaking things. The right answer saves you either a developer invoice or a weekend of breaking your own store. The line between the two is cleaner than most founders think. ## What you can safely do yourself Everything inside the theme editor: reorder sections, add or remove them, change colors and typography from theme settings, swap images, edit navigation, configure app blocks, write collection descriptions. The editor is built so none of this can break the theme. If you make a mess, you reset the settings. Two rules make DIY work safer. **Duplicate the theme before a big session and experiment on the copy.** Shopify lets you preview an unpublished theme end to end, including the cart, so you can walk the whole store before anything is public. This is the same discipline a professional build uses, and it costs you one click. **Change one thing at a time and check it on your phone.** The editor opens on desktop. Most of your buyers are not on desktop. For one home brand I run, close to 80% of sessions are mobile, on furniture people want to see at room scale. A change that looks composed on a laptop can bury the add-to-cart button on a phone, and you will never notice from the editor preview. ## Where the developer line sits The moment the change requires the code editor, the calculus flips. Liquid templates, JavaScript, CSS, metafield-driven layouts, structured data, checkout-adjacent anything. Not because founders cannot learn Liquid, but because theme code is load-bearing in ways the editor never shows you. The product card you restyle also renders in search results, recommendation blocks, and collection grids. The script you paste in runs on every page and costs load time everywhere. The other developer-territory job is subtraction. Years of app installs leave orphaned code in the theme, and removing it without breaking something requires knowing what still depends on it. Cleanup is quiet, unglamorous work that shows up directly in page speed. ## The jobs that look DIY but are not Three changes tempt founders because they look small. **Moving the reviews block on the product template.** That is template logic, not a setting. The block you move may be rendered by an app that expects it in a specific place, and the failure mode is a product page that renders fine for you and blank for a buyer on a different variant. **Adding a countdown or announcement widget from a tutorial.** Pasted JavaScript never leaves. It loads on every page, including the ones the promotion ended on six months ago, and nobody remembers where it came from. **"Just hiding" a section with CSS instead of removing it.** The section still loads. You just cannot see it costing you speed. Each looks like a settings change and each is a code change wearing a costume. There is a fourth, and it is the one that costs real money. Pasting a tracking snippet into the theme because a support article said to. Conversion pixels placed in theme code fire on page load rather than on a confirmed event, so they count sessions that never bought. The ad platform then optimizes toward whatever you told it a conversion was. I have rebuilt that mistake often enough to have written the reference architecture down: it lives in [the Tracking Stack](/frameworks/tracking-stack/). ## The rule I use with clients On accounts I run, the founder owns the editor and I own the code. They rearrange the homepage for a promotion without waiting on anyone. Custom cards, template work, speed, and tracking stay on my side, staged on a theme copy and reviewed before going live. That split keeps the store moving daily without the codebase decaying underneath it. The [Sugar Babies facelift](/results/sugar-babies-storefront-facelift/) ran exactly this way. The store had a live Performance Max program and server-side tracking through the checkout, so nothing could be edited on production. The structural work shipped as staged code: custom product cards with variant swatches, a homepage rebuilt around the ten premium partner brands and the six buying categories, and 195-plus customer reviews moved out of an app dashboard onto the storefront. Replatforms: zero. Downtime: zero. Meanwhile the owner kept merchandising in the editor the whole time. That is the split working. Daily control for the person who knows the catalog, code control for the person who knows what the code touches. ## What each side costs Useful when you are deciding whether to spend a Saturday or a budget line. **The editor: free, plus your time.** Most founders can get further than they expect in an afternoon. **One developer job: $300 to $2,000.** Competent freelance Shopify work runs $50 to $150 an hour, and single-purpose jobs usually land inside a week of hours. A new section, a template fix, an app wired in cleanly. **A coordinated facelift: $2,000 to $5,000.** Cards, merchandising, reviews, collection copy, and speed designed together and staged as one pass. **A custom build: from $5,000, two to four weeks.** When the change list touches most templates and the catalog structure. Published numbers are at [/pricing](/pricing/). The trap sits between the second and third bands. Four separate one-off edits at $800 each is $3,200 spent, four separate people guessing at your priorities, and a theme nobody understands afterward. The same money as one coordinated pass buys a designed outcome and one person accountable for it. ## The honest default If your list is colors, sections, and content: do it yourself this afternoon. Duplicate the theme first and check your phone after every change. If your list includes the words cards, template, speed, tracking, or checkout: price a developer. And price the [coordinated version](/storefronts/) before commissioning one-off edits, because five separate patches usually cost more than one planned pass and leave you with a worse theme. The full scope-by-scope pricing is at [what theme customization costs](/shopify-storefront/shopify-theme-customization-cost/). ## Does my Shopify store need a facelift or a full rebuild? URL: https://connercrowe.com/shopify-storefront/shopify-facelift-vs-full-rebuild/ Published: 2026-07-28 | Updated: 2026-08-11 Answer: Default to the facelift. If your checkout converts, your pages rank, and your tracking works, upgrade the storefront in place: custom cards, merchandising, speed, trust. Rebuild only when the theme itself blocks the catalog or the buying flow. A rebuild puts checkout, tracking, and SEO equity at risk in the same month. The redesign industry has one answer to every dated storefront: start over. A quarter of work, a five-figure invoice, and a migration that risks your checkout, your tracking, and your SEO equity in the same month. Most stores never needed it. Here is the test I run before quoting either project. ## The five signals **Does the checkout convert?** Pull your last ninety days. If conversion rate sits in a healthy band for your category and price point, the machine works and a rebuild risks it for cosmetic gain. **Do the pages rank?** If collections and products hold organic positions, they carry equity a rebuild can burn through URL changes, lost internal links, and structured data that leaves with the old theme. **Does the tracking work?** A working pixel-and-server-side stack is wired into your current templates. Rebuilding means re-wiring and re-validating all of it, and this step is the one designers skip. Priced on its own, that rebuild is a $2,500 sprint, so a rebuild quote without tracking in it is $2,500 light before anyone argues about design. **Can the theme show what you sell?** This is the first real rebuild trigger. If the catalog has outgrown the templates, variant-heavy products squeezed into cards that cannot hold them, navigation with no room for how buyers shop, then the frame genuinely blocks the catalog. **Can the theme be edited safely?** The second trigger. Legacy architecture, years of stacked app code, changes that break something every time someone touches it. When the marginal edit costs more than it should, the codebase is telling you its age. Three or more healthy signals, take the facelift. Signals four or five failing, price the rebuild. ## The two projects, side by side | | Facelift | Full rebuild | |---|---|---| | Typical range | $2,000 to $5,000 | From $5,000, most land $5,000 to $12,000 | | Timeline | One to two weeks | Two to four weeks | | URLs | Unchanged | Mapped and redirected | | Structured data | Stays put | Rebuilt and re-tested | | Tracking | Already live, verified | Wired into new templates before launch | | Store downtime | None | None, if staged properly | | Large catalog or migration | Not applicable | $15,000 to $30,000 | The bands come from my own published pricing at [/pricing](/pricing/). The agency quotes founders forward me for the rebuild column start around $25,000 and attach twelve weeks or more. ## What a facelift includes A facelift keeps the theme and upgrades what buyers see: custom product cards, a re-merchandised homepage, reviews surfaced next to the products they were written about, collection copy and internal linking, page-speed work. Everything stages on a theme copy, gets reviewed, and goes live without the store going down. ## The worked example: a facelift that a live ad program never noticed Sugar Babies is a baby boutique with a physical store and a national DTC catalog built on premium brands: Nuna, UPPAbaby, Cybex, Maxi-Cosi, Stokke, Silver Cross. Before the storefront work started, the Google Ads account had already been rebuilt once and scaled into a six-campaign Performance Max matrix. Run the five signals against it. Checkout converting: yes. Pages ranking, with 12,000-plus catalog alt texts and collection copy already shipped: yes. Tracking working, including server-side purchase events: yes. Theme showing the catalog: badly, but not structurally. Theme editable: yes, on a current architecture. Four healthy signals. That is a facelift, and quoting a rebuild would have been a five-figure invoice for a problem the store did not have. What shipped: custom product cards with variant swatches so buyers move through colorways without leaving the collection page, a homepage rebuilt around the ten premium partner brands and the six categories the buying decisions happen in, and 195-plus customer reviews moved out of an app dashboard onto the storefront next to the products they described. Every change staged on a theme copy and reviewed before it touched production. Replatforms: zero. Downtime: zero. The Performance Max matrix ran through the entire project without a signal reset, which was the operational reason for the choice, not an aesthetic one. The [case study documents the whole sequence](/results/sugar-babies-storefront-facelift/). ## What a rebuild includes, when it is earned When the theme genuinely blocks the catalog, the rebuild covers a custom theme in code you own, catalog and collection architecture, page templates built for paid traffic, imagery where the catalog has gaps, and conversion tracking wired before launch. The reference build: a premium home furnishings brand on Shopify, statement furniture priced $999 to $7,500, roughly 150 products, photography for almost none of them. Signal four failed hard. The catalog needed shop-by-room architecture and 150-plus product images that did not exist yet, and no amount of merchandising on the old frame was going to produce either. Kickoff to public launch: under a month. Outside hands: zero. Product shoots commissioned: zero, because the catalog imagery ran through an in-house render pipeline instead of a photographer. The conventional version of that project, a brand photographer plus a product photographer plus a designer plus a project manager, runs twelve to sixteen weeks and mid five figures. [Documented here](/results/150-sku-furniture-catalog-no-photographer/). ## Why the industry defaults to rebuilds anyway A rebuild is a bigger invoice and a cleaner project plan. A facelift requires reading someone else's theme and shipping on a live store without breaking it, which is harder to scope and easier to get wrong. Vendors quote the project that suits the vendor. There is a second reason, and it is worth naming. A rebuild lets a builder ignore everything you already have. No inventory of what ranks, no audit of which URLs your campaigns point at, no reading of the app code. Starting over is the cheapest option for the vendor and the most expensive one for you, because you pay to rebuild the parts that were already working. The five signals exist so you can price what the store needs instead. Both projects, with published pricing, live at [/storefronts](/storefronts/). On a scoping call I will tell you which one you are, and the facelift answer comes back more often than my invoice would prefer. ## How do I redesign my Shopify store without losing sales? URL: https://connercrowe.com/shopify-storefront/redesign-shopify-store-without-losing-sales/ Published: 2026-07-29 | Updated: 2026-08-11 Answer: Stage everything on a duplicate theme while the live store keeps selling, build and review there, then cut over in one publish action once tracking, redirects, and speed are verified. Shopify makes this safe because themes are swappable: the store never goes down, and if something breaks you republish the old theme in one click. "Redesign" and "keep selling" sound like a conflict. On Shopify they are not, because the platform separates the theme from the store. The catalog, the checkout, the orders, and the customer accounts all live outside the theme. A redesign done properly swaps the frame while the machine keeps running. ## The staging rule Every change happens on a duplicate of the live theme, never on the published one. Shopify allows multiple themes in the library. The duplicate gets the full build while customers shop the original, and the preview link lets you walk the whole store, cart to checkout, before anything is public. This rule alone removes most of the risk founders fear. There is no construction-site phase, no maintenance mode, no weekend the store goes dark. The corollary: any vendor who asks to edit your live theme directly, or who wants the store password-locked "during the redesign," is telling you how they work. Keep looking. ## What runs in parallel While the new theme builds, three workstreams run alongside it rather than after it. **Tracking.** GA4, GTM, and the platform pixels get wired into the new templates on the staging copy and test-fired there. The single most common redesign injury is a beautiful new site with a dead purchase event, discovered two weeks later as "the ads stopped working." I have watched what that costs from the repair side: on one store, ten days of tracking damage showed up as two recorded add-to-carts, and restoring the server-side path brought monthly ad-attributed add-to-carts back to 509. Those numbers are in the [server-side funnel events case study](/results/sugar-babies-server-side-funnel-events/). None of that damage is visible in a design review. **Redirects and SEO parity.** Every URL that changes gets a mapped redirect, and the pages that rank get their content and structured data carried over. The full checklist is in [will a redesign hurt my SEO](/shopify-storefront/will-a-shopify-redesign-hurt-seo/). **Speed.** Measured on the staging theme, on a phone, before cutover. A redesign that ships slower than the store it replaces starts underwater no matter how it looks. ## The cutover checklist Cutover is one action: publish the new theme. What surrounds it matters more than the click. Before you publish, confirm all of it on the staging theme. Every changed URL has a redirect. The purchase event fires and reaches the ad platforms. Structured data coverage on the key templates matches the old store. Page speed measured on a phone, on the pages your ads land on. Collection copy and product copy carried over, or retired on purpose. Publish at a low-traffic hour. Then click through the money paths immediately: product page to cart to checkout to a test purchase, watching the tracking fire live rather than trusting that it will. Keep the old theme in the library untouched. That is your rollback. If anything is wrong, republishing it takes one click and the store is exactly what it was. Do not delete it for a month. An in-flight cart survives the swap, because the cart belongs to the store, not the theme. Buyers mid-session see the frame change and nothing else. ## The worked example: a facelift under a live Performance Max program Sugar Babies is a baby boutique with a physical store in Washington and a national DTC catalog of premium brands: Nuna, UPPAbaby, Cybex, Maxi-Cosi, Stokke, Silver Cross. By the time the storefront work started, the Google Ads account had been rebuilt once and scaled into a six-campaign Performance Max matrix. That is the hardest version of this problem. The paid program ran on those exact landing pages, and server-side tracking ran through that exact checkout. A replatform would have reset signal the ad account had spent months building, which is a real cost that never appears on a redesign quote. So nothing replatformed. The work ran as custom CSS and JavaScript through the theme layer, every change staged and reviewed on a theme copy, the production site untouched until go-live day. What shipped: custom product cards with variant swatches so buyers move through colorways without leaving the collection page, a homepage rebuilt around the ten premium partner brands and the six categories the buying decisions happen in, and the 195-plus customer reviews moved out of an app dashboard onto the storefront next to the products they were written about. Replatforms: zero. Theme rebuilds: zero. Downtime: zero. The Performance Max matrix ran through the entire project without a signal reset. The [case study documents the sequence](/results/sugar-babies-storefront-facelift/). ## What to do if the vendor will not stage Two options, and both are fine. Stage it yourself. Duplicate the theme in your admin, give the vendor the duplicate, and hold the publish button yourself. A builder who resists that arrangement is telling you they intend to work on your live store. Or take the smaller project. If your checkout converts and your pages rank, a facelift on the existing theme carries almost none of this risk, because URLs, schema, and content all stay put. The five-signal test for which project you need is at [facelift or full rebuild](/shopify-storefront/shopify-facelift-vs-full-rebuild/). ## The one thing founders underestimate The rollback is not the safety net. The staging discipline is. A rollback undoes a bad theme; it does not undo a week of ads optimizing against a broken conversion event, or a month of rankings decaying behind missing redirects. Those are the injuries that survive the rollback, and they are the reason tracking and redirects belong in the build rather than the cleanup. The same staged process is how every build at [/storefronts](/storefronts/) ships, and the timeline it fits into is at [how long a rebuild takes](/shopify-storefront/how-long-does-a-shopify-store-rebuild-take/). ## How long does a Shopify store rebuild take? URL: https://connercrowe.com/shopify-storefront/how-long-does-a-shopify-store-rebuild-take/ Published: 2026-07-28 | Updated: 2026-08-11 Answer: A single landing page ships in about a week. A storefront facelift on an existing theme lands in one to two weeks. A full custom rebuild with catalog buildout runs two to four weeks from kickoff to launch. Agency timelines for the same scope run a quarter or more, and the difference is process, not effort. Timeline quotes for the same store range from two weeks to six months, which tells you the quote reflects the vendor's process more than the work. Here are the real bands and what moves a project inside them. ## The honest bands **A landing page: about a week.** One template, one purpose, tracking included. If a vendor quotes a month for a landing page, you are paying for their queue, not the work. **A facelift: one to two weeks.** Custom cards, homepage merchandising, reviews surfaced, speed work. It ships fast because nothing replatforms: every change stages on a copy of the live theme, and the store keeps selling through the whole project. **A full custom rebuild: two to four weeks.** Theme, catalog architecture, page templates, imagery, tracking. That is the window on my published [Storefront Build card](/pricing/), and four weeks is the honest ceiling for a big catalog with imagery gaps. **A large catalog or a platform migration: longer, and priced differently.** Thousands of SKUs with real specification data, a redirect map protecting existing rankings, or part-number and fitment search. That work runs $15,000 to $30,000 and does not compress into a month. Any vendor who says it does has not done one. **The agency version: a quarter or more.** The quotes founders bring me attach twelve-plus weeks to the same scope. The added time is coordination: a project manager, a designer, a developer, and QA passing the work between them, with meetings at each handoff. ## The worked example: 150 SKUs, under a month, one person A premium home furnishings brand on Shopify. Statement furniture priced $999 to $7,500. Sofas, dining tables, vanities, media cabinets, mirrors, lighting. Roughly 150 products, and photography for almost none of them. The conventional staffing for that launch is four people: a brand photographer for hero imagery, a product photographer for 150-plus SKUs against white, a Shopify designer for the theme, and a project manager keeping the three in sync. Twelve to sixteen weeks. Mid five figures. Here is where the calendar goes in the four-person version. Photography alone is a scheduling problem before it is a production problem: product has to ship to a studio, get shot, come back, and the edited files have to land before the designer can build the collection pages that display them. The designer waits on the photographer. The developer waits on the designer. The project manager waits on everyone and reports on the waiting. Very little of a twelve-week timeline is work. Most of it is queue. The version that shipped ran three workstreams in parallel because one person held all three. The full custom theme, built for the positioning rather than forked from a template. Shop-by-room architecture (Living Room, Bedroom, Dining Room, Bathroom) plus category navigation (Seating, Tables, Storage, Vanities, Lighting, Mirrors). And 150-plus product images produced through an in-house render pipeline, with tight control on lighting, materials, perspective, and shadow physics, plus a per-category style lock so a console table tile does not render under a different lighting setup than the side table next to it in the grid. Kickoff to public launch: under a month. Outside hands: zero. Product shoots commissioned: zero. The [case study documents it](/results/150-sku-furniture-catalog-no-photographer/), including the source-to-render comparisons. ## What the timeline should include A build is not done when it looks done. The closing stretch of a real timeline holds the work that invisible-until-launch projects skip: conversion tracking wired into the new templates and validated end to end, redirects mapped, page speed measured on a phone over cellular, and a staged launch where the old store keeps selling until the moment of cutover. A quote that beats these windows by skipping those is quoting a different, worse project. The tracking rebuild alone is a $2,500 engagement when bought on its own, which is a useful way to price the omission. ## What stretches a timeline Four things, in order of how often I see them. **Catalog size.** 700 products is a different project than 70. Collection architecture, filtering, and variant handling all scale with the count. **Imagery gaps.** If half the SKUs have one bare supplier photo, producing catalog imagery becomes its own workstream. It is why I run an in-house render pipeline, and why the furniture build above stayed inside a month instead of waiting on studio bookings. **Approval lag.** The single biggest variable nobody quotes. A founder who reviews in a day keeps a build on pace. A committee that reviews in two weeks can double the calendar by itself, and no vendor can absorb that from their side. **App surgery.** Subscriptions, bundles, B2B pricing, ERP feeds. Each integration adds build and testing time, and testing is the half that gets underestimated. ## Why my timelines read short Not heroics. The build runs through a system: a written playbook for every repeatable step, templates and checks accumulated across every build before yours, and one senior operator instead of four people passing work between them. Fewer handoffs is most of the answer. The same person doing the theme also wires the tracking, so the two workstreams never wait on each other. The rest is scope discipline: a build with a defined end date has a defined scope, and I would rather say no to a feature in week one than discover it in week five. ## The question to ask any vendor Ask what happens in week one. A builder with a working system starts building in week one. A process-heavy shop spends weeks one through three on discovery decks. Both can produce a good store. Only one of them does it this quarter. Then ask what happens in the last week, because that is where tracking, redirects, and the speed check either live or do not. Timelines and pricing for my builds are published at [/storefronts](/storefronts/), and the risk checklist for the cutover itself is at [redesign without losing sales](/shopify-storefront/redesign-shopify-store-without-losing-sales/). ## How much does a custom Shopify theme cost? URL: https://connercrowe.com/shopify-storefront/how-much-does-a-custom-shopify-theme-cost/ Published: 2026-07-28 | Updated: 2026-08-11 Answer: A premium off-the-shelf Shopify theme costs $100 to $500. A custom theme from a senior independent builder runs roughly $5,000 to $15,000. Agency quotes for the same scope start around $25,000 and run a quarter or more. My builds start at $5,000 and take two to four weeks. Large catalogs, migrations, and stores needing part-number or fitment search run $15,000 to $30,000. Conversion tracking is included either way. The number depends on which of three things you are buying, and most quotes never say which one. Here is the honest breakdown. ## The three price bands **$100 to $500: a premium theme from the Shopify Theme Store.** You are buying a template thousands of other stores run, plus the hours to configure it. For a young store with a small catalog and no paid traffic, this is often the right answer, and anyone who quotes you five figures before asking about your catalog is selling scope you may not need. **$5,000 to $15,000: a custom build from a senior independent operator.** One person designs and builds the theme for your brand: catalog architecture, product page templates, page speed, and the storefront details a template cannot carry. This is the band I work in. My builds start at $5,000 and most land between $5,000 and $12,000, depending on catalog size and how much imagery the catalog needs. The published card, with the timeline attached, is on [/pricing](/pricing/). **$15,000 to $30,000: a large catalog or a migration.** The same one person, but the catalog is the project rather than a detail of it. Thousands of SKUs carrying real specification data, a move off an aging platform, a redirect map that has to protect existing rankings, or a store whose customers search by part number or vehicle fitment. That work does not compress into two weeks, and pricing it like a boutique build would be dishonest to both of us. **$25,000 and up: an agency build.** The quotes founders bring me start around $25,000 and run a quarter or more. The price carries a team: project manager, designer, developer, QA, and the meetings that keep them synchronized. On enormous catalogs and multi-region Plus stores, that team earns its cost. On a founder-led store doing $1M to $20M, most of it is overhead. ## A worked example: a 150-SKU furniture catalog Numbers get slippery in the abstract, so here is one build with the whole shape visible. A premium home furnishings brand on Shopify. Statement furniture priced $999 to $7,500. Sofas, dining tables, vanities, media cabinets, mirrors, lighting. Roughly 150 products, and photography for almost none of them. The conventional path to launching that store is four people: a brand photographer for hero imagery, a product photographer for 150-plus SKUs, a Shopify designer for the theme, and a project manager keeping the three in sync. Twelve to sixteen weeks, mid five figures. What shipped instead was one operator and three workstreams running in parallel. The full theme, built for the positioning rather than forked from a template: photo-heavy layouts, three-to-four-product grids, lifestyle hero banners on every collection page. The shop-by-room architecture, so a buyer furnishing a bedroom and a buyer hunting one media cabinet both land in two clicks. And every product image produced through an in-house render pipeline, with a per-category style lock so a console table tile does not render under different lighting than the side table sitting beside it on the grid. Kickoff to public launch: under a month. Outside hands: zero. Product shoots commissioned: zero. The [case study documents the build](/results/150-sku-furniture-catalog-no-photographer/), including the source-to-render comparisons. That project sat in the upper half of the $5,000 to $12,000 band because imagery was most of the scope. A 40-SKU store with existing photography and a standard collection structure sits at the floor. The catalog, not the design taste, moves the number. ## What moves the price inside a band Four inputs move a custom quote more than anything else. **Catalog size and structure.** A 30-product store and a 700-product store are different projects. Collection architecture, filtering, and variant handling all scale with the catalog. **Imagery.** If half the catalog ships with bare supplier photos, the storefront will look dated in any theme. Rendering or shooting lifestyle imagery is real scope. I run an in-house render pipeline for exactly this gap, and it is part of the quote when the catalog needs it. Priced on its own as a one-time engagement, that imagery work starts at $7,500 for 30 to 60 SKUs. **Integrations.** Reviews, subscriptions, bundles, B2B pricing, ERP feeds. Each app the theme has to accommodate adds build and testing time. **Tracking.** GA4, GTM, a server-side container, and platform pixels wired into the new templates before launch. Most quotes leave this out entirely, which is how new sites go live and the ad account goes dark. Bought separately, that rebuild is a $2,500 sprint. ## What the quote should include A complete custom theme quote covers the theme code you own, catalog and collection structure, page templates designed for paid traffic to land on, conversion tracking wired before launch, page-speed work, and documentation the next developer can read. If a quote is missing tracking and speed, it is not comparable to one that includes them, no matter what the two numbers are. Add $2,500 for the tracking rebuild you will need afterward and compare the totals. A $6,000 quote with tracking beats an $8,000 quote without it, and it beats a $4,000 quote that leaves your ad account blind for the first month after launch. ## When not to buy custom Skip custom work if your store is pre-revenue, your catalog is under a couple dozen products, or your current theme converts fine and the real complaint is that you are bored of it. A $300 theme plus a merchandising pass beats a $10,000 build you have not grown into. There is a middle option most founders never get quoted: a facelift on the theme you already run. Custom product cards, a re-merchandised homepage, reviews surfaced, speed work, all staged on a theme copy. That lands at $2,000 to $5,000 and leaves your URLs, your schema, and your checkout untouched. The test for which one you need is in [facelift or full rebuild](/shopify-storefront/shopify-facelift-vs-full-rebuild/). I sell custom themes and I turn down builds on this basis on scoping calls. A founder who buys a template this year and comes back when the catalog earns a custom build is a better client than one who overbuilds now and resents the invoice. ## The receipt behind my numbers The band I quote comes from shipped work, not a rate card. The furniture build above went from kickoff to public launch in under a month, theme and catalog imagery included, built solo. A separate storefront facelift on a live baby boutique shipped custom cards, ten premium brands merchandised up front, and 195-plus reviews surfaced, with zero replatforms and zero downtime, [documented here](/results/sugar-babies-storefront-facelift/). The full offer, with published pricing and the timeline on the card, is at [/storefronts](/storefronts/). ## How much does it cost to customize an existing Shopify theme? URL: https://connercrowe.com/shopify-storefront/shopify-theme-customization-cost/ Published: 2026-07-29 | Updated: 2026-08-11 Answer: Configuration inside the theme editor costs nothing but time. A freelancer building or modifying individual sections runs $300 to $2,000 per project at typical $50 to $150 hourly rates. A coordinated storefront facelift, custom cards, merchandising, and speed work together, runs $2,000 to $5,000. Past that you are pricing a custom build. Customization quotes confuse founders because "customize my theme" covers everything from changing a font to rebuilding the product page. The price tracks the scope, so here are the scopes. ## Free: the theme editor Colors, fonts, section order, logo, announcement bars, most layout toggles. Modern themes expose a lot in the editor, and a founder with an afternoon can get further than most expect. If your complaint is that the homepage sections are in the wrong order, or that the colors are off brand, you do not have a customization project. You have a settings session. Two habits make that session safe. Duplicate the theme before you start and work on the copy, which Shopify lets you preview end to end before publishing. And check every change on your phone, because the editor opens on desktop and most of your buyers are not. ## $300 to $2,000: section and template work A developer building one new section, modifying a product template, or wiring an app into the theme cleanly. Freelance rates for competent Shopify work run $50 to $150 an hour, and most single-purpose jobs land inside a week of hours. At the middle of that rate range, $300 buys roughly four hours and $2,000 buys about twenty. This band is the right buy when the theme is fundamentally fine and one specific thing is missing: a comparison table, a shade-finder block, a custom collection header, a size chart that pulls from metafields instead of a pasted image. The failure mode in this band is accumulation. Five separate freelancers making five separate edits over two years leaves a theme nobody understands, carrying dead code from apps you uninstalled in year one. Each edit was reasonable. The sum is a codebase where the marginal change costs three times what it should, because whoever touches it next has to read four other people's work first. The arithmetic is worth doing out loud. Four one-off edits at $800 each is $3,200 and four separate discovery conversations, four separate people guessing at your priorities, and no shared plan. The same $3,200 spent as one coordinated pass buys a designed outcome and one person accountable for it. If you are about to commission the fourth patch, stop and price the coordinated version instead. ## $2,000 to $5,000: the coordinated facelift Custom product cards, a re-merchandised homepage, reviews surfaced next to products, collection copy, internal linking, page-speed cleanup. All designed together, all staged on a theme copy before anything touches the live store. This is the band where the storefront visibly changes caliber without a replatform. It is also where I do most of my storefront work, and there is a worked example. ## A worked example: a baby boutique on a stock theme Sugar Babies is a boutique with a physical store in Washington and a national DTC catalog of premium third-party brands: Nuna, UPPAbaby, Cybex, Maxi-Cosi, Stokke, Silver Cross. The Google Ads account had already been rebuilt and scaled into a six-campaign Performance Max matrix. The paid program had outgrown the storefront. The catalog carried $1,000 strollers and heirloom nursery furniture, and the site presenting them was a stock theme on default settings. The standard quote for that problem is a redesign: a new theme or a headless build, a quarter of work, a five-figure invoice, and a migration that risks the checkout, the tracking, and the SEO equity in the same month. What shipped instead, on the existing theme: Custom product cards with variant swatches, so a buyer can move through colorways without leaving the collection page. A homepage rebuilt around the ten premium partner brands and the six categories the buying decisions happen in: travel systems, car seats, nursery furniture, high chairs, gliders, diaper bags. And the 195-plus customer reviews that had been sitting inside an app dashboard, moved onto the storefront next to the products they were written about. Every change was staged and reviewed on a theme copy. The production site was untouched until go-live day. Replatforms: zero. Theme rebuilds: zero. Downtime: zero. The active Performance Max program never noticed the swap, which was the entire point, because a replatform would have reset signal the ad account had spent months building. The [case study documents it](/results/sugar-babies-storefront-facelift/). That is the shape of the $2,000 to $5,000 band. Not a new store. The same store, brought up to the caliber of what it sells. ## Above $5,000: you are pricing a build, not a customization When the change list touches most templates, the catalog structure, and the buying flow, piecemeal customization stops making sense and a custom theme starts. My full storefront builds start at $5,000 and take two to four weeks, with large catalogs and platform migrations running $15,000 to $30,000. That decision has its own math, covered in [what a custom Shopify theme costs](/shopify-storefront/how-much-does-a-custom-shopify-theme-cost/). ## What makes any of these quotes worth it Three questions filter vendors regardless of band. **Does the work get staged on a theme copy, or edited live on your store?** There is no reason to edit a live theme in 2026. A vendor who does is telling you how they handle risk everywhere else. **Does the quote include measuring page speed after the change?** Every added section is load time somewhere. A $600 section that adds two seconds to your best landing page is not a $600 section, it is a $600 section plus a tax on every click you buy. **Does the person doing the work know which pages your paid traffic lands on?** Customization is merchandising. Someone who has never watched a campaign land on a collection page will optimize for the design review instead of the buyer. The coordinated version of this work, priced, with the case studies attached, lives at [/storefronts](/storefronts/). ## Should I hire a Shopify agency or a freelancer for my store rebuild? URL: https://connercrowe.com/shopify-storefront/shopify-agency-vs-freelancer-for-store-rebuild/ Published: 2026-07-28 | Updated: 2026-08-11 Answer: The label matters less than two questions: how senior are the hands doing the work, and does the builder stay accountable for what the store converts after launch. Agencies fit enterprise scale and multi-region builds. A senior independent operator fits founder-led stores doing $1M to $20M. Junior labor is the expensive option at any price. The agency-or-freelancer question is framed wrong, and the framing is what gets founders burned. Both labels cover an enormous quality range. The variables that decide your outcome sit underneath the label. ## The two questions that decide it **Who touches the code?** At an agency, the person who sold you the build is rarely the person building. The work lands with a mid-level developer, reviewed at milestones. With a freelancer, the person you interview is the person building, which is either great or terrible depending entirely on who they are. Seniority of the actual hands predicts your outcome better than company size does. **Who owns the result after launch?** A rebuild gets judged on what the store converts, not on how it looks at handoff. Most builders, agency or freelance, hand off and leave. If the builder also runs your traffic, they inherit every decision they made in the build, which changes how they make them. This is the reason I build storefronts as part of a marketing program instead of as standalone web design. ## The three shapes, with the numbers attached | | Agency | Marketplace freelancer | Senior independent operator | |---|---|---|---| | Typical rebuild quote | From $25,000 | $50 to $150 per hour | From $5,000, most $5,000 to $12,000 | | Timeline for the same scope | A quarter or more | Depends on their queue | Two to four weeks | | Who writes the code | Mid-level developer | The person you interviewed | The person you interviewed | | Tracking included | Usually a separate line | Usually not | Wired before launch | | Bench if someone leaves | Yes | No | No | | Large catalog or migration | Core strength | Rarely | $15,000 to $30,000 | Those quote ranges are the ones founders bring me and the ones I publish at [/pricing](/pricing/). The $30,000 and twelve-week pair is the single most common agency proposal I get forwarded. ## Where an agency is the right call An honest read, because the agency shape wins real scenarios: you run a Plus store with multi-region requirements, ERP integrations, and a security review process. You need bench depth so the project survives one person leaving. You need five workstreams staffed at once and your team is used to working through a project manager. At that scale, the $25,000-and-up quote carries real coordination work, and a solo builder is the risk, not the bargain. ## Where a freelancer is the right call Small scope, tight budget, clear spec. A theme customization, a section build, a template fix. Marketplace freelancers do this well at $50 to $150 an hour, and hiring an agency for it wastes money on process. A single section build usually lands between $300 and $2,000. The failure mode is handing a freelancer an open-ended rebuild with no spec, then discovering the gaps at launch. Freelancers price against the spec you wrote. If the spec omits redirects, structured data, and conversion tracking, so will the build, and none of those omissions are visible in a design review. ## The third option the question hides A senior independent operator: one person with agency-level experience who scopes, designs, builds, and stays on the account. You get the seniority an agency puts on the sales call, on the keyboard, without the junior layer the retainer pays for. My storefront builds start at $5,000, most land between $5,000 and $12,000, take two to four weeks, and ship with conversion tracking wired in before launch, because I am the same person running the paid traffic afterward. Large catalogs and platform migrations run $15,000 to $30,000, where the catalog itself is the project rather than a detail of it. ## The worked example: what one operator shipped in under a month A premium home furnishings brand on Shopify. Statement furniture priced $999 to $7,500. Roughly 150 products. Photography for almost none of them. The agency-shaped version of that project staffs four people: a brand photographer for hero imagery, a product photographer for 150-plus SKUs, a Shopify designer for the theme, and a project manager keeping them in sync. Twelve to sixteen weeks. Mid five figures. The version that shipped was one operator running three workstreams at once. The full custom theme, built for the brand's positioning rather than forked from a template. Shop-by-room architecture plus category navigation, so a buyer furnishing a bedroom and a buyer hunting one media cabinet each land in two clicks. And every product image produced through an in-house render pipeline, with a per-category style lock so tiles sitting next to each other on a collection page share lighting and perspective. Kickoff to public launch: under a month. Outside hands: zero. Product shoots commissioned: zero. The [case study documents the build](/results/150-sku-furniture-catalog-no-photographer/), with the source-to-render comparisons included so you can judge the imagery yourself. The reason it compressed is not effort. It is handoffs. Four people passing work between them spend most of the calendar waiting and re-explaining. One person doing the theme and the imagery and the tracking never waits on themselves. ## The trade, stated plainly There is no bench. If I am out for a week, the project waits a week. For a founder-led store doing $1M to $20M, that trade usually wins. For a store past $50K a month in media spend across five channels, it starts to lose, and I will say so on the call rather than take the work. ## What to ask any builder before signing Ask who personally writes the code and how senior they are. Ask to see two live stores they built and what changed in conversion after launch. Ask whether the quote includes conversion tracking in the new templates, and if the answer is a blank look, walk. Ask what happens in month two when something breaks. Ask who holds the redirect map. The answers separate real builders from proposal factories faster than any portfolio does. The way I answer those questions is documented at [/storefronts](/storefronts/), and the honest solo-versus-agency comparison, including the rows the agency wins, is at [/vs/agency](/vs/agency/). ## Should I redesign my Shopify store or buy a new theme? URL: https://connercrowe.com/shopify-storefront/shopify-redesign-vs-new-theme/ Published: 2026-07-28 | Updated: 2026-08-11 Answer: Buy a theme when your current one is legacy architecture and a modern template covers your catalog: that is a $100 to $500 fix. Commission a redesign when the catalog or brand has outgrown what templates can express. On most stores, the highest-return move is neither: it is merchandising work on the theme you already run. "The store looks dated" has three fixes at three very different prices: $100 to $500 for a theme, $2,000 to $5,000 for a merchandising pass, $5,000 and up for custom work. Which one you need depends on why it looks dated, and most founders skip that diagnosis. ## When a new theme is the answer A theme swap earns its cost in two situations. First, your current theme is legacy architecture. If it predates Shopify's Online Store 2.0, you are locked out of sections on every page, flexible metafields, and most modern apps. A current theme removes real constraints beyond the visual ones. This is the clearest buy on the page: a few hundred dollars removes a ceiling you have been working under for years. Second, your catalog fits what good templates do well. A focused catalog, standard product types, no unusual buying flow. A well-configured premium theme covers that store, and the $100 to $500 price is the whole point. Configure it properly, spend the savings on imagery, and move on. Budget the configuration honestly. A theme is a purchase; making it look like your brand is a project. Two to three days of your own time in the editor, or a few hundred dollars of freelance help at the $50 to $150 hourly rates competent Shopify work runs at. A $300 theme that nobody configures reads exactly as generic as the one it replaced. ## When a new theme will not fix it A theme changes the frame around your content. It does not change the content. If the product photos are bare supplier shots, the collections are thin, and the product descriptions are two manufacturer sentences, the new theme will present the same weaknesses in nicer typography. Founders swap themes, see no lift, and conclude design does not matter. The design was never the problem. The catalog was. This is the most common $500 mistake in ecommerce, and it is expensive twice: once for the theme, and once for the year that passes before anyone diagnoses the real constraint. A redesign, meaning custom work, earns its cost when the catalog or the buying flow has outgrown templates: shop-by-room architecture for a furniture brand, variant-heavy products that need custom cards, a brand identity strong enough that template constraints visibly cheapen it, or landing page templates built for the paid traffic you send. My builds start at $5,000 and take two to four weeks, with large catalogs and platform migrations at $15,000 to $30,000. ## The option most stores should pick first Before either, price the merchandising pass: upgrade the storefront you have. Custom product cards, a re-merchandised homepage, reviews surfaced next to products, collection copy, internal linking, page-speed work. It attacks the content, which is usually the real reason the store reads as dated. That work runs $2,000 to $5,000 and ships in one to two weeks. ## The worked example: a premium catalog inside a stock theme Sugar Babies is a baby boutique with a physical store in Washington and a national DTC catalog built on premium third-party brands: Nuna, UPPAbaby, Cybex, Maxi-Cosi, Stokke, Silver Cross. The catalog carried $1,000 strollers and heirloom-grade nursery furniture. The site presenting them was a stock Shopify theme running default settings. Every instinct says buy a better theme. The diagnosis said something else. The theme was current architecture and perfectly capable. What the store lacked was merchandising: nothing told a first-time visitor that the brands were premium, the reviews existed but lived inside an app dashboard where no buyer would ever see them, and the collection grid gave a $1,200 stroller the same visual weight as a pacifier clip. So no theme was purchased and nothing replatformed. What shipped on the existing theme: custom product cards with variant swatches so buyers move through colorways without leaving the collection page, a homepage rebuilt around the ten premium partner brands and the six categories the buying decisions happen in (travel systems, car seats, nursery furniture, high chairs, gliders, diaper bags), and the 195-plus customer reviews moved out of the app dashboard onto the storefront beside the products they were written about. Every change staged on a theme copy and reviewed before go-live. Replatforms: zero. Theme rebuilds: zero. Downtime: zero. The store's live Performance Max program kept running through the whole project. The [case study documents it](/results/sugar-babies-storefront-facelift/). A new theme would have cost less in dollars and delivered less, because it would have moved the same weak content into a nicer frame. ## The decision in one pass Run the three questions in order. **Is the theme legacy architecture that blocks modern features?** If yes, a new theme is table stakes. Buy it, configure it properly, then reassess. **Does a template cover your catalog and buying flow?** If yes, buy the template and put the difference into imagery and merchandising. Imagery is almost always the higher-return half of that split. **Has the catalog outgrown templates, or does paid traffic need pages templates cannot provide?** Then custom work is justified, and the numbers for that are in [what a custom theme costs](/shopify-storefront/how-much-does-a-custom-shopify-theme-cost/). If you answered no, yes, no, you have a merchandising project and a $300 theme, and the five-signal version of this test is at [facelift or full rebuild](/shopify-storefront/shopify-facelift-vs-full-rebuild/). ## What I would tell you on a call I sell custom builds, so weigh the incentive, but the scoping call runs the same three questions and the answer is frequently the cheap one. A founder who buys a $300 theme this year and comes back for custom work when the catalog earns it is a better client than one who overbuilds now and resents the invoice. The offer, when the answer is custom, is at [/storefronts](/storefronts/), with the published numbers at [/pricing](/pricing/). ## Should my Shopify ads land on product pages or a landing page? URL: https://connercrowe.com/shopify-storefront/shopify-ads-product-page-or-landing-page/ Published: 2026-07-29 | Updated: 2026-08-11 Answer: Match the destination to the promise in the ad. Ads for a specific product land on that product page. Category and discovery ads land on a merchandised collection. A dedicated landing page earns its cost when the ad makes an argument the catalog cannot: a bundle, an offer, a comparison, or education before the price. Never land paid traffic on the homepage. The question behind the question is whether you need to build anything. Often you do not. The ad's promise picks the destination, and only one of the four cases requires new pages. ## Case one: the ad sells one product Land on the product page. A buyer who clicked a Shopping ad or a single-product creative wants the price, the photos, and the buy button, not a detour. The work is making the product page worthy of the click: real photography or renders, variant clarity, reviews visible, speed. If your product pages cannot carry paid traffic, that is a storefront problem wearing an ads costume. The tell is a campaign with healthy click-through and a conversion rate nobody can explain. Before rebuilding the campaign, open the product page on a phone and read it as a stranger who has never heard of you. ## Case two: the ad sells a category Land on a merchandised collection. Someone who clicked "reclaimed wood bathroom vanities" wants to browse the range, so the collection page needs honest filtering, consistent tiles, and enough copy to hold the ranking the ads are paying to reinforce. The most common failure here is a collection page that is a bare grid: no copy, no ordering logic, no reason to trust the brand over the next tab. A collection is merchandising, and merchandising is the highest-return storefront work on most stores because it costs $2,000 to $5,000 instead of a rebuild. ## Case three: the ad makes an argument This is where a dedicated landing page earns its build cost. Bundles and offers the catalog does not express. Comparisons against a category the buyer currently uses. Education-first products where the buyer needs to understand the mechanism before the price makes sense. Lead-gen for services attached to the store. A product page cannot carry those arguments because its job is to sell one SKU to someone already convinced of the category. A useful test: if the ad's headline is a claim rather than a product name, the destination needs to continue the claim. Sending argument traffic to a product page is why "the ads don't work" so often means "the destination dropped the thread." Landing pages price as their own small projects. One page ships in about a week, and my storefront and landing-page work starts at $5,000 for a full build, with published numbers at [/pricing](/pricing/). One campaign-specific page is the smallest version of that work. ## Case four: the homepage Never on purpose. The homepage is a router for people who already know the brand. Paid traffic pays per click, and a router click is a wasted one. The exception that proves it: pure brand-name search ads, where the visitor typed your name and wants the front door. ## The worked example: when the destination was the whole problem Sugar Babies is a baby boutique with a national DTC catalog of premium third-party brands: Nuna, UPPAbaby, Cybex, Maxi-Cosi, Stokke, Silver Cross. The Google Ads account had already been rebuilt once and then scaled into a six-campaign Performance Max matrix, with 26 Customer Match segments seeded and 300 search themes refreshed across the matrix. The [rebuild case study](/results/shopping-and-performance-max-case-study/) records a 1.9x blended ROAS lift and 147% non-brand revenue growth over ninety days from the account work alone. The account was doing its job. The destination was not. The campaigns were landing $1,000 strollers and heirloom nursery furniture on a stock theme running default settings, where the collection grid gave a premium travel system the same visual weight as a pacifier clip and the 195-plus customer reviews sat inside an app dashboard no buyer would ever open. No new landing pages were built. The fix was the pages the ads already pointed at. Custom product cards with variant swatches so buyers move through colorways without leaving the collection page. A homepage and collection structure rebuilt around the ten premium partner brands and the six categories the buying decisions happen in: travel systems, car seats, nursery furniture, high chairs, gliders, diaper bags. Reviews moved onto the storefront next to the products they were written about. All of it staged on a theme copy, shipped with zero replatforms and zero downtime, so the live Performance Max program never lost signal. The [facelift case study documents it](/results/sugar-babies-storefront-facelift/). That store never needed case three. It needed cases one and two done properly, which is the answer for most Shopify advertisers. ## What this means for the build list Most Shopify stores buying traffic need zero new pages and better existing ones: product pages and collections brought up to the caliber of the spend. That is facelift work at $2,000 to $5,000, not a build. Stores running argument-led campaigns need one to three landing pages, built fast, tracked from day one, and disposable once the campaign ends. Either way, two things belong in the spec. Conversion tracking wired into the destination before spend resumes, because a page the ad platform cannot measure is a page that teaches the algorithm nothing. And page speed measured on the destination specifically, on a phone, because speed on the pages you buy traffic to is priced into every click. The fix order for that is at [why Shopify stores get slow](/shopify-storefront/why-is-my-shopify-store-slow/). When I run the ads and build the destination, the two get designed together, which is the point of [the storefront work](/storefronts/). The free [Google Ads Setup Audit](/audit/) covers the destination check alongside the account settings, with no email gate on the download. ## Why is my Shopify store so slow? URL: https://connercrowe.com/shopify-storefront/why-is-my-shopify-store-slow/ Published: 2026-07-29 | Updated: 2026-08-11 Answer: Four causes cover most slow Shopify stores: app scripts that load on every page, oversized images, too many font files, and years of accumulated theme code. Shopify's own hosting is rarely the problem. Diagnose on a phone over cellular, fix apps first, images second, and measure before and after each change. Slow is expensive twice: buyers leave before the page paints, and the ad platforms charge you more to send traffic to a page they score as bad. The causes rank in a predictable order. ## Cause one: app scripts Every app you install earns the right to inject script on every page, and most take it whether the page uses the app or not. The review widget loads on the blog. The bundle app loads on the contact page. The abandoned-cart tool loads on a policy page nobody abandons a cart from. Uninstalling helps less than founders expect, because many apps leave their code in the theme after removal. That is the sediment problem in cause four, arriving early. **Diagnosis:** open your storefront with your browser's network tab and count third-party domains. Ten or more you do not recognize is common and bad. Then cross-check against your app list and your billing. Most stores are paying for at least one app nobody has opened in a year, and it is still loading on every page view. **The fix:** an app audit. Remove what you do not use, then have the leftover code stripped from the theme. This is the highest-return speed work on most stores and it usually costs less than a single section build, which runs $300 to $2,000 at the $50 to $150 hourly rates competent Shopify freelancers charge. ## Cause two: images Furniture-sized hero images shipped at 4,000 pixels wide for a phone screen. Product photos uploaded straight from the supplier at print resolution. Shopify's CDN resizes images when the theme asks correctly. Older themes and hand-edited ones often do not ask correctly, so the browser downloads the full-resolution file and shrinks it on the client, paying the full transfer cost for none of the benefit. **Diagnosis:** if your largest homepage image weighs more than a few hundred kilobytes on your phone, the theme is not sizing responsively. **The fix:** lives in the theme's image rendering, not in manually shrinking uploads forever. Fix it once in the template and every future upload inherits the fix. This is worth real attention for high-consideration catalogs. For one home brand I run, close to 80% of sessions are mobile, on furniture buyers want to see at room scale. The imagery has to be big enough to sell and small enough to arrive, and only the template can hold both. ## Cause three: fonts Each font family and weight is a file the browser must fetch before text settles. Themes configured with a display font, a body font, and five weights of each ship a wardrobe when the design needs an outfit. Two families, two or three weights total, covers almost any brand and cuts font weight by half or more. This is a theme settings change on most modern themes, which puts it inside the founder's own reach. ## Cause four: the theme itself Legacy themes and heavily patched ones carry years of sediment: sliders nobody uses, scripts from apps deleted in 2023, CSS for sections that no longer exist. Past a point, cleanup inside the old theme costs more than moving to a current one. That threshold decision is covered in [facelift or full rebuild](/shopify-storefront/shopify-facelift-vs-full-rebuild/). ## What is almost never the cause Shopify's hosting. The platform serves fast globally, and switching plans will not fix a slow store. The weight you added is the weight you remove. Two more false leads worth naming. A speed-optimizer app, which adds a script to fix a script problem. And a theme swap bought for speed alone, which moves your slow content into a fast frame and leaves you at roughly the same number. ## Where speed sits in the build, and why that saves money Speed work costs less inside a project than after one. On my storefront builds, page speed is a build spec item measured before launch rather than a cleanup engagement later. A build that starts at $5,000 and ships in two to four weeks includes it. Bought as remediation afterward, the same work is a separate engagement, plus whatever the slow months cost in ad spend on pages the platforms were scoring down. The pattern repeats with tracking, which is the other thing redesigns leave for later. Wired during the build it is part of the number. Bought afterward it is a $2,500 sprint on its own. The published cards are at [/pricing](/pricing/). ## The fix order and the measurement rule Apps first, images second, fonts third, theme sediment last. That order is by return per hour, and it holds on almost every store I open. Measure on a phone over cellular before the first change and after every change, using the same page each time. One variable, one measurement, or you will never know which change earned the improvement. Measure your paid landing pages specifically, not your homepage. Speed there is priced into every click you buy, and the homepage is rarely where paid traffic lands. Which page paid traffic should land on is its own decision, covered at [product page or landing page](/shopify-storefront/shopify-ads-product-page-or-landing-page/). ## What to do this week If you have never audited the apps, start there and nowhere else. Open the network tab, count the domains, match them to your app list and your invoice, and remove what nobody uses. Then have the residue stripped out of the theme, because uninstalling an app does not uninstall its code. If the store is already lean and still slow, the problem is the theme's age, and the honest fix is structural. When I build or facelift a storefront, speed ships inside the project rather than as a cleanup later, which is cheaper in both directions. The way that works is at [/storefronts](/storefronts/). ## Will redesigning my Shopify store hurt SEO? URL: https://connercrowe.com/shopify-storefront/will-a-shopify-redesign-hurt-seo/ Published: 2026-07-28 | Updated: 2026-08-11 Answer: It can, and the damage comes from five places: changed URLs without redirects, lost internal links, structured data that leaves with the old theme, slower templates, and thinner page content. A redesign that inventories rankings first and keeps URL structure loses little. A facelift on the existing theme carries almost none of this risk. The redesign itself does not hurt SEO. The five specific mistakes redesigns make hurt SEO, and every one of them is preventable if someone inventories what the store ranks for before anything gets touched. ## Risk one: URLs that change without redirects Shopify keeps product and collection URLs tied to handles, so a theme change alone does not move them. The damage happens when the rebuild "cleans up" handles, restructures collections, or drops pages entirely. Every changed URL needs a 301 redirect, and every dropped page needs a decision, not a 404. The redirect map is a launch deliverable, not a post-launch cleanup, and it should be a document you can read rather than a promise. The failure is quiet. A 404 does not alert anyone. It shows up six weeks later as a collection that used to bring traffic and now brings none, by which point the vendor has been paid and moved on. ## Risk two: internal links that quietly disappear Rankings lean on internal linking: the collection copy that links related categories, the blog posts that point at products, the footer paths crawlers follow. New templates frequently ship without the link blocks the old theme carried, and the loss is invisible in a design review because the page looks cleaner without them. The fix is an internal-link inventory of the top-ranking pages before the rebuild, checked against the new templates before launch. I take this seriously on my own site for the same reason I take it seriously on client stores. Internal links are the only ranking signal you fully control, and they are the first thing a redesign deletes for aesthetic reasons. ## Risk three: structured data that leaves with the theme Product schema, review stars, breadcrumbs, and FAQ markup mostly live in theme code. Swap the theme and the rich results that took months to earn can vanish in a single deploy. Run the old store's key templates through a structured-data test before the build starts, save the output, and hold the new templates to the same coverage. This takes an afternoon and it is the cheapest insurance on the list. ## Risk four: slower templates Redesigns add weight: hero videos, extra font families, app embeds, animation libraries. Core Web Vitals are a ranking input and a conversion input, and a redesign that ships slower than the store it replaced starts underwater. Speed belongs in the build spec with a number attached, measured on a phone over cellular, not on the designer's laptop over office wifi. Measure the same page before and after. The causes and the fix order are in [why Shopify stores get slow](/shopify-storefront/why-is-my-shopify-store-slow/). ## Risk five: thinner content New designs favor clean, sparse pages, and collection descriptions or product copy get cut for looking cluttered. The copy was carrying rankings. Content parity is a launch checklist item: everything that existed either survives, moves somewhere better, or gets retired on purpose with a redirect. "We tightened the copy" is a decision that needs an owner who understands what the copy was earning. ## The version of this that also burns your ad account The same inventory logic applies to paid traffic, and the damage arrives faster there. Campaigns point at specific URLs. Change them without updating the account and ads land on redirects or dead pages while Quality Score pays the price. New landing page templates also need the conversion tracking re-wired and validated before spend resumes. I have measured what that repair looks like from the other side. On one Shopify store where the tracking path had broken, ten days produced two recorded add-to-carts. Rebuilding the server-side path brought monthly ad-attributed add-to-carts to 509, and recovered 31.7% of events and 50% of purchases that browser tracking prevention had been eating. Those figures are in the [server-side funnel events case study](/results/sugar-babies-server-side-funnel-events/). Every day the ad platform optimizes against broken data is a day of budget spent learning the wrong lesson. This is the argument for the person who runs the traffic running the build. I know which URLs the spend lands on and which pages rank before I touch anything, because I am the one who will be answering for both next month. ## The worked example: the redesign that did not happen Sugar Babies is a baby boutique running a national DTC catalog of premium brands, with a six-campaign Performance Max program live and a catalog SEO layer already shipped: collection copy, internal linking, and 12,000-plus image alt texts, documented in the [PMax matrix case study](/results/scaling-sugar-babies-six-pmax-matrix/). That store had every one of the five risks pointed at it. Ranking collections. Structured data earned over months. Live campaigns tied to specific landing pages. Server-side tracking running through the checkout. The standard quote for "the store looks dated" is a rebuild. The decision instead was a facelift on the existing theme: custom product cards with variant swatches, a homepage rebuilt around the ten premium partner brands and the six buying categories, and 195-plus reviews moved out of an app dashboard onto the storefront. Because the theme stayed, the URLs stayed, the schema stayed, the collection copy stayed, and the alt texts stayed. Every change was staged on a theme copy and reviewed before go-live. Replatforms: zero. Downtime: zero. The [case study documents it](/results/sugar-babies-storefront-facelift/). The SEO risk of that project was close to nil, not because the work was careful in the abstract, but because the structural choice removed four of the five risks before anyone opened an editor. ## The low-risk path If your pages rank and the theme is not blocking the catalog, a facelift carries almost none of these risks. That decision test is in [facelift or rebuild](/shopify-storefront/shopify-facelift-vs-full-rebuild/). When a full rebuild is earned, the five risks above are closable with an inventory-first process: rankings inventoried, links inventoried, schema captured, speed budgeted, content mapped, all before the theme work starts. That is how the builds at [/storefronts](/storefronts/) run, and the staged cutover that protects the launch itself is at [redesign without losing sales](/shopify-storefront/redesign-shopify-store-without-losing-sales/). --- # Answers: Conversion Tracking Hub: https://connercrowe.com/conversion-tracking/ ## How do I set up the Meta Conversions API the right way? URL: https://connercrowe.com/conversion-tracking/meta-conversions-api-setup/ Published: 2026-06-28 | Updated: 2026-06-28 Answer: Set up the Conversions API as a server-side companion to the pixel, not a replacement. Send the same events from both sides, share an event_id so Meta deduplicates them, and pass hashed customer data to lift match quality. Most setups fail on dedup and identity, not the connection. ## What the Conversions API actually is The Conversions API (CAPI) sends conversion events to Meta from your server instead of from the browser. The pixel still fires client-side. CAPI runs alongside it, server-side. The point is coverage. Browser events get blocked by ad blockers, iOS settings, and consent tools. Server events do not, because they leave from your infrastructure, not the visitor's device. The mistake I see most often is treating CAPI as a switch you flip to "fix tracking." It is not a fix on its own. A bad CAPI build makes reporting worse than no CAPI at all, because now you have two streams that double-count or contradict each other. The architecture is what makes it work. ## The two-stream model Run the pixel and CAPI as a matched pair. Every key event fires twice: once from the browser through the pixel, once from your server through CAPI. PageView, ViewContent, AddToCart, InitiateCheckout, Purchase. Both sides send the same event for the same user action. That sounds like double-counting, and it would be, except for one field. You send a shared `event_id` on both the pixel call and the server call. Meta uses that id to recognize the two events as the same conversion and keeps one. This is deduplication, and it is the single most important part of the setup. Get it wrong and your Purchase count inflates, your ROAS looks better than reality, and the account optimizes toward a number that does not exist. So the build order is: pixel first, CAPI second, dedup keys wired before you trust a single number. ## What CAPI needs to match A server event with no identity is close to useless. Meta has to tie the event back to a person to attribute it and to optimize. You do that by passing customer information parameters, hashed with SHA-256 before they leave your server. The fields that move match quality the most: - Email (hashed) - Phone (hashed) - `fbp` and `fbc` cookies, captured from the browser and forwarded to the server - IP address and user agent - External ID, if you have a stable customer id The `fbc` cookie carries the click id from the ad click. Forwarding it is what lets a server-side Purchase get attributed back to the specific ad that drove it. Skip it and you lose attribution on a large share of conversions even though the event itself arrived. Match quality shows up in Events Manager as the Event Match Quality score per event. Below "Good" on Purchase, fix identity before you touch anything else. ## How to send the events There are three common paths, in rough order of how much control they give you. **Direct server-to-server.** Your backend posts events to the Graph API endpoint. Most control, most match potential, most engineering. This is the right call for a custom stack or a high-spend account where match quality pays for itself. **Server-side Google Tag Manager (Stape or your own container).** The browser sends events to a server container you own, and that container forwards them to Meta with full data. This is what I reach for on Shopify and most lead-gen sites. You get server-side identity and dedup without writing API calls by hand, and one container can feed Meta, GA4, and TikTok from the same event stream. **Native platform integration.** Shopify's built-in Meta channel and partner connectors send CAPI for you. Fast to turn on. The catch is you give up control of dedup keys and the exact data sent, so verify in Events Manager that events deduplicate and match well before you rely on it. I have seen native integrations that send a second Purchase with no `event_id`, which inflates counts. Check, do not assume. ## Verify before you trust it Setup is not done when the connection turns green. It is done when you have confirmed the numbers reconcile. 1. Open Events Manager and check that each event shows both "Browser" and "Server" as sources. 2. Confirm the deduplication rate is high. Low dedup means your `event_id` is not matching across the two streams. 3. Check Event Match Quality on Purchase and Lead. Push the weak ones up with more identity fields. 4. Compare Meta's reported Purchase count against your real backend over the same window. Shopify orders, your CRM, your database. If Meta is meaningfully higher, you have a dedup or double-fire problem. If it is much lower, you have a coverage or match problem. That last step is the one people skip, and it is the only one that tells you the truth. The platform UI will happily show you a healthy-looking setup that is double-counting. Reconciling against the source of record is how you catch it. ## Where it sits in the stack CAPI is one layer of a tracking stack, not the whole thing. It depends on a clean event layer feeding it, consistent event names across pixel and server, and a consent setup that does not strip the data you need. If your GA4 and Meta numbers already disagree, adding CAPI on top of a broken foundation just gives you a third number to reconcile. That is not hypothetical. One store in my [Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/) ended up with three concurrent purchase tags recording 382.02, 321.59 and 266.99 purchases over the same window, a 30.1% spread, with the account bidding on whichever one read highest. Fix the event layer and identity capture first, then add the server stream, then verify it reconciles. In that order it earns its place. Out of order it adds noise. ## How does Shopify Checkout Extensibility break my tracking, and how do I fix it? URL: https://connercrowe.com/conversion-tracking/shopify-checkout-extensibility-tracking/ Published: 2026-06-28 | Updated: 2026-06-28 Answer: Checkout Extensibility removed checkout.liquid and additional scripts, so any pixel or script you hardcoded into checkout stopped firing. Move every checkout and purchase event to the Web Pixels (customer events) sandbox, and send the purchase server-side through the Conversions API so the sale still reconciles. ## What Shopify actually changed For years, Shopify Plus stores controlled the checkout through `checkout.liquid` and the "Additional scripts" box in checkout settings. That is where most stores pasted their Meta Pixel, GA4 tags, TikTok pixel, Pinterest tag, and any custom purchase tracking. It worked because those scripts ran directly on the checkout pages and the order status page. Shopify retired that model. `checkout.liquid` and the additional scripts field are gone, replaced by Checkout Extensibility. Checkout is now built from Shopify's own upgraded checkout plus app extensions, and you no longer get to inject raw script tags into it. The order status page and post-purchase page moved with it. So if your purchase event lived in additional scripts or `checkout.liquid`, it stopped firing the day your store migrated. The storefront tracking up to the cart still runs. Checkout and purchase are the part that goes dark. ## Why the deadline matters Shopify did not leave this open-ended. Additional scripts and `checkout.liquid` were deprecated, and stores that did not migrate had their old checkout customizations turned off. If you are on Plus and you have not done the migration work, assume the old tracking is either already dead or about to be. The trap is that the storefront still looks healthy. PageView, ViewContent, and AddToCart keep reporting because those fire on theme pages, not checkout. Only the bottom of the funnel breaks. That is exactly the part you bid on, so a store can run for weeks thinking conversions are flat when really the purchase event quietly went to zero. ## Where checkout tracking lives now The replacement is the Web Pixels API, which Shopify surfaces in the admin as Settings, Customer events. This is a sandboxed JavaScript environment that subscribes to standard events: `checkout_started`, `payment_info_submitted`, `checkout_completed`, and the earlier funnel events like `product_viewed` and `product_added_to_cart`. The sandbox is the important word. A Web Pixel runs in a Web Worker, isolated from the page DOM. It cannot read the page, cannot touch cookies the way an inline script could, and cannot rely on globals you used to set in the theme. You get a structured event payload and a small API for storage. Code written for additional scripts will not drop into a Web Pixel unchanged. It has to be rewritten against the event schema. You have two ways to use it: - **App pixels.** Meta, GA4 via Google and YouTube channel, TikTok, and Pinterest all ship Shopify apps that register their own Web Pixel automatically. For most stores this is the cleanest path. Connect the channel, confirm the pixel is registered under Customer events, and the platform handles the event mapping. - **Custom pixels.** For anything the apps do not cover, you write a custom pixel in the Customer events screen, subscribe to the events you need, and forward them yourself. One boundary on this: Google documents that running Google tags inside the custom pixel sandbox is not a supported implementation, and enhanced conversions are one of the things that may not work correctly from there. Use custom pixels to forward events to your own endpoint or to platforms that support it, and keep Google Ads conversions on the Google & YouTube app or on the page itself. A theme-page conversion does not need the sandbox at all, which is [the defect I shipped into my own build](/blog/shopify-custom-event-no-subscriber-google-ads-conversion/). ## Rebuild the purchase event server-side Client-side checkout tracking inside the sandbox is more limited than the old inline script, and browser-side events still get blocked by ad blockers, iOS, and ITP. So the reliable fix is to stop depending on the browser for the sale. Send the purchase server-side. For Meta that is the Conversions API. For GA4 that is the Measurement Protocol, or a server-side GTM container. The cleanest version routes the order through a server endpoint that fires the purchase with the order ID, value, currency, and hashed customer data, then dedupes against any browser event using a shared event ID. Shopify's order webhook, or the `checkout_completed` event passed to your server, gives you a trustworthy purchase signal that does not depend on the customer's browser finishing a script. That is the signal you want feeding your ad platforms, because it reconciles to real orders in Shopify. A practical setup I keep coming back to: - Web Pixels (app or custom) for the browser-side funnel events, so platforms still get the in-session signals they use for optimization. - Conversions API and Measurement Protocol for the purchase, fired from the order, deduped by event ID. - A single source of truth for revenue, which is Shopify orders, not the pixel. ## How to confirm it is actually working Do not trust the admin toggle. Verify each layer. 1. Check Settings, Customer events, and confirm each platform's pixel is registered and the custom pixels you expect are present. 2. Place a real test order. Watch Meta Events Manager Test Events and the GA4 DebugView for `checkout_completed` and purchase firing once, not zero times and not twice. 3. Reconcile a day of Shopify orders against purchases reported in Meta and GA4. If the platform numbers sit far below Shopify, something in the chain is dropping. 4. Confirm deduplication. If browser and server both fire without a matching event ID, you will double-count and your ROAS will read better than it is. Step 3 is the one worth doing properly, because the gap runs in both directions. On the one account in my [Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/) where I could read both the order table and the ad account, the ad platform's counted purchases over 90 days equalled 58.5% of the store's entire order book, and its all-conversions purchase total equalled 65.9%, while the store's own journey data classified none of those orders as paid. That is one account, N = 1, and it is enough to show the comparison is worth running on your own store. If you migrated to Checkout Extensibility and your reported conversions fell off a cliff while Shopify revenue held steady, this is almost always the cause. The sale still happened. The tracking just lost the page it used to live on. Rebuild it on Web Pixels plus server-side events, then verify against real orders before you trust a single number in the ad dashboards. ## What are enhanced conversions in Google Ads and how do I set them up correctly? URL: https://connercrowe.com/conversion-tracking/enhanced-conversions-google-ads/ Published: 2026-06-28 | Updated: 2026-06-28 Answer: Enhanced conversions send hashed first-party data (email, phone, name, address) with your conversion to match more sales back to ad clicks that cookies miss. You set them up through Google Tag, GTM, or the API. They recover conversions, raise match rates, and feed bidding better signal. ## What enhanced conversions actually do Enhanced conversions take the first-party data a customer already gave you at checkout or on a lead form, hash it with SHA-256, and send it alongside the conversion event. Google matches that hashed identifier against signed-in Google accounts to attribute the conversion back to an ad click that the cookie alone lost. The problem they solve is recovery. Safari and Firefox cap or strip third-party cookies, iOS limits click identifiers, and consent banners block a slice of traffic outright. So a real conversion happens, but Google never connects it to the click that drove it. That click looks like wasted spend. Smart Bidding then optimizes against an incomplete picture. Enhanced conversions hand Google a second way to make the match, so more of your real conversions show up in the account and bidding gets a cleaner signal. The data never leaves in plain text. Email, phone, first name, last name, and address get hashed in the browser or on the server before transmission. Google compares hashes, not raw values. ## The two types are not the same setup Google ships two separate products under the same name, and people conflate them constantly. **Enhanced Conversions for Web** improves measurement for conversions that already fire on your site, like a purchase or a form submit. It supplements the existing conversion with hashed user data so more of those events match. This is the e-commerce path. **Enhanced Conversions for Leads** is for businesses that close offline. The lead submits a form, you send the hashed email with the lead, and later you upload the offline conversion (the closed deal) keyed to that same email. Google ties the ad click to the eventual sale. If you run a service business and close on the phone or in person, this is the one you want. Pick the wrong type and the tag fires but nothing reconciles. Confirm which model matches how the business makes money before you touch anything. ## The three setup paths **Google Tag (gtag.js) with automatic collection.** The lightest path. You enable enhanced conversions in the conversion action settings, and the tag scrapes user data from the page using CSS selectors or automatic detection. It works, but it is fragile. A theme update that renames a field or moves the confirmation data breaks the scrape silently. I treat automatic collection as a starting point, not a finished build. **Google Tag Manager with manual variables.** The path I default to. You capture email, phone, and address into dataLayer variables at the point the user submits, then map those variables into the conversion tag's user-provided data fields. It survives front-end changes because you control where the data comes from, and you can see the values flowing in GTM Preview before you publish. **The Google Ads API or offline import.** For leads that close in a CRM. You push the hashed identifier and the conversion value back through the API or a scheduled upload. This is where value-based bidding gets real fuel, because you can send the actual deal size, not a flat lead value. ## What decides your match rate Setup is half the job. The match rate is what tells you whether it worked, and a few things move it. Send more fields. Email is the strongest single identifier, but email plus phone plus name plus address gives Google more chances to land a match. Most setups send only email and leave match rate on the table. Normalize before you hash. Lowercase the email, strip whitespace, format the phone in E.164. Hash a messy string and it will not match the clean hash on Google's side. GTM's built-in user-provided data variable handles normalization for you, which is one more reason I prefer it over hand-rolled hashing. Respect consent. Under Consent Mode v2, enhanced conversions only fire when the user grants ad_user_data and ad_storage. If consent is denied, the data should not be sent. Bolting enhanced conversions onto a site with no consent signal is a compliance problem, and in the EEA it will also throttle what Google can model. ## How to verify it is live Do not trust a green checkmark. Open the conversion action in Google Ads and look at the diagnostics for that action. Within a couple of days of real traffic you should see a recorded match rate. A healthy web setup commonly lands somewhere in the 60 to 90 percent range depending on how many fields you send and how clean the data is. A match rate near zero means the data is not arriving, the hashing is wrong, or consent is blocking it. Cross-check in GTM Preview or the browser network tab that the user-provided data fields actually carry values when the conversion fires. An empty field hashes to nothing and matches nothing. ## Where this sits in the stack Enhanced conversions are one layer, not the whole tracking system. They make your existing conversion measurement more complete. They do not fix a conversion that never fires, a checkout event that breaks on mobile, or a lead form that GTM cannot see. They also will not tell you that the action you are enhancing is the wrong action. On two of the three accounts in my [Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/), 16.6% to 17.2% of what the Conversions column counted was add-to-cart, not a sale. Raising the match rate on that only sharpens a signal pointed at the wrong event. Get the base conversion firing reliably first, confirm it in a controlled test, then layer enhanced conversions on top to recover the matches the cookie lost. Built in that order, you get a measurable lift in recorded conversions and a Smart Bidding signal that reflects what actually happened. ## What conversion value should I send to Google and Meta, and how do I keep them reconciling? URL: https://connercrowe.com/conversion-tracking/conversion-value-to-send-google-meta/ Published: 2026-06-28 | Updated: 2026-06-28 Answer: Send one value, defined once, to both platforms: pre-tax, pre-shipping order subtotal in a single currency, fired server-side on the purchase event. Use the same definition for Google Ads conversion value and Meta's purchase value so the two reconcile against each other and against Shopify. ## Pick one definition of "value" and send it everywhere The reason Google and Meta disagree on revenue is almost never the platforms. It is that each one received a different number for the same order. One got the grand total with tax and shipping, the other got the subtotal. One got the value in USD, the other in the customer's local currency. Once that happens, no amount of dashboard tweaking will make them line up. So the first decision is what "value" means, and it has to be made once. My default is the pre-tax, pre-shipping order subtotal, in your store's base currency. That is the number that maps cleanly to margin, and it is the number you can reconcile against Shopify's "net sales" line later. Tax and shipping inflate ROAS without adding a dollar you can spend. If you send the grand total to one platform and the subtotal to the other, your blended ROAS is a fiction. Whatever you choose, write it down. The definition is a one-line spec: "value = order subtotal, excluding tax, excluding shipping, excluding discounts already applied, in USD." Every conversion tag, server event, and offline import then has to honor that one line. ## Send the same number to Google and Meta Google Ads expects a `value` and a `currency` on the conversion. Meta's Purchase event expects `value` and `currency` in the same way. Send identical figures. - **Google Ads:** the `value` parameter on the purchase conversion action, with `currency_code` set explicitly. Do not leave currency to default. If you run a server-side setup, this is the value field on the Enhanced Conversions or the offline conversion upload. - **Meta:** the `value` and `currency` custom data on the Purchase event, sent through the Conversions API. The pixel-only value and the CAPI value must match, or Meta's deduplication will keep one and you will not always know which. If your store sells in multiple currencies, convert to a single base currency before the event fires, and tag the original currency in a separate parameter for your own records. Sending mixed currencies with no conversion is the most common reason a multi-currency store's ROAS looks impossible. ## Fire it server-side, with the order id as the key Browser tags drop value constantly. Ad blockers, ITP, a customer who closes the tab on the thank-you page before the pixel loads. Every dropped purchase is a dollar of revenue the platform never sees, which is why ad-platform revenue almost always reads lower than Shopify. Send the purchase from the server: Shopify's order-created event, a server-side GTM container, or a direct Conversions API call. Server events fire whether or not the browser cooperated. On both platforms, attach a stable identifier so the browser event and the server event collapse into one: - **Meta:** `event_id` on both the pixel and the CAPI call. Same id, same order, deduplicated. - **Google:** the `transaction_id` (order id) on the conversion. This also lets you import corrections later without double-counting. Use the actual order id, not a timestamp or a random string. When you reconcile a month later, the order id is what lets you trace a single sale across Shopify, Google, and Meta. ## Decide how you handle refunds and discounts Two edge cases break reconciliation more than anything else. **Discounts.** If a customer uses a 20% code, do you report the value they paid or the full subtotal? Report what they paid. The platforms optimize toward the value you feed them, and you want them chasing real revenue, not list price. Pick one rule and apply it to both Google and Meta. **Refunds.** A sale that gets refunded is still sitting in the platform as revenue unless you send a correction. Google accepts refund adjustments through the conversion-adjustment upload (a negative or retraction keyed to `transaction_id`). Meta's handling is weaker, so many stores accept a known gap there and account for it in reporting rather than trying to claw each refund back. Whatever you do, document the rule, because a 10% refund rate quietly inflates reported ROAS by roughly 10% on both platforms. ## Reconcile on a cadence, not a hunch Once the same value is firing server-side to both platforms with an order id, the platforms will still not match Shopify exactly, and that is fine. Attribution windows differ, view-through differs, the platforms claim credit Shopify assigns elsewhere. The goal is not identical numbers. The goal is a stable, explainable gap. Before you trust the ratio, confirm the value column is measuring revenue at all. When I measured this across real ecommerce accounts for the [Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/), 19.8% to 25.8% of reported conversion value on two of three accounts was cart value rather than purchase revenue. A ratio built on that number is stable and wrong. Pull three numbers for the same date range: Shopify net sales, Google Ads conversion value, Meta purchase value. Track the ratio of each platform to Shopify week over week. When the value definition is clean, those ratios hold steady. When someone edits a tag, swaps the total for the subtotal, or breaks the currency field, the ratio jumps, and that jump is your alarm. If you have not pinned the definition yet, start there before touching bids or budgets. A tracking-stack audit that nails the value spec, moves the events server-side, and sets up refund handling fixes more reporting noise than any optimization on top of a broken signal ever will. ## What is Google Consent Mode and how does it work? URL: https://connercrowe.com/conversion-tracking/google-consent-mode-explained/ Published: 2026-06-28 | Updated: 2026-06-28 Answer: Google Consent Mode is an API that tells Google tags whether a user granted consent for ads and analytics. Tags read those signals and either fire normally, send cookieless pings, or stay silent. It governs tag behavior based on consent. It does not collect the consent itself. ## What Google Consent Mode actually is Google Consent Mode is a JavaScript API that sits between your cookie banner and your Google tags. Your consent management platform (CMP) tells Consent Mode what the user agreed to. Consent Mode then tells every Google tag on the page how to behave. That is the whole job. It is easy to confuse the two halves. The CMP collects the choice. Consent Mode reads that choice and adjusts tag behavior. If you only install one half, you get a banner that looks compliant but tags that still ignore consent, or tags that go silent because no signal ever reaches them. Consent Mode controls four signals: - `ad_storage`: whether advertising cookies can be set - `analytics_storage`: whether analytics cookies can be set - `ad_user_data`: whether user data can be sent to Google for ads - `ad_personalization`: whether data can be used for personalized ads and remarketing The last two were added for Consent Mode v2, which Google made mandatory in March 2024 for anyone serving EEA and UK traffic through Google Ads. Without v2 signals, remarketing and audience lists stop populating from European traffic. ## Default state, then update Consent Mode runs in two steps. First you set a default state before any tag fires. For EEA traffic the safe default is `denied` across all four signals. Then, once the user interacts with the banner, your CMP calls an `update` to flip the relevant signals to `granted` or leave them `denied`. ```js gtag('consent', 'default', { ad_storage: 'denied', analytics_storage: 'denied', ad_user_data: 'denied', ad_personalization: 'denied', wait_for_update: 500 }); ``` The `wait_for_update` value tells Google tags how long to hold before assuming denial. That window matters. If a tag fires before the default loads, it runs with no consent context, and you get the worst of both worlds: a hit that may breach consent and a signal Google cannot model from. ## Basic mode vs advanced mode This is the distinction most setups get wrong, and it changes what data you actually keep. In **basic mode**, Google tags do not load at all until the user grants consent. If consent is denied, nothing fires. No pings, no modeling input. You lose all visibility into denied-consent users. In **advanced mode**, tags load on every page but adjust behavior based on consent. When consent is denied, tags send cookieless pings: no identifiers, no cookies, just an anonymous signal that an event happened. Google uses those pings as input for conversion modeling, which estimates the conversions you cannot directly observe. Advanced mode is what most advertisers want, because it feeds the modeling that fills the gap left by denied consent. Basic mode is simpler and more conservative, but you forfeit the modeled conversions. Pick deliberately. A lot of accounts land in basic mode by accident because the CMP blocked the tags from loading, and the owner never realizes modeling was on the table. ## Conversion modeling When consent is denied and you are in advanced mode, Google fills the reporting gap with modeled conversions. It uses the cookieless pings plus aggregate, observed behavior to estimate conversions from users it could not track individually. Google requires a traffic threshold before modeling kicks in. Small accounts may not hit the volume needed, so the modeled numbers can stay flat even with advanced mode configured correctly. Modeled conversions show up inside your Google Ads conversion columns. They are estimates, not raw counts, so reconciling them against a server-side source or your backend will never be exact. That is expected behavior, not a bug. ## Where Consent Mode quietly breaks Most Consent Mode problems are not error messages. They are silent gaps you only find when conversions drop or audiences stop growing. The patterns I see repeat: **No default state set.** Tags fire before the consent default loads, so the `update` never has anything to override. Check that the default block runs first in the data layer, above your GTM container or gtag snippet. **CMP and Consent Mode not wired together.** The banner records a choice but never pushes an `update` call. Consent stays at the default forever. In GTM, confirm the CMP template is firing the consent update, not just writing a cookie. **v1 signals only.** A setup built before 2024 sends `ad_storage` and `analytics_storage` but not `ad_user_data` or `ad_personalization`. European remarketing audiences slowly drain. Audit the tag for all four signals. **Basic mode by accident.** The CMP is set to block Google tags entirely, so advanced mode and its modeling never run. If your conversion volume from European traffic looks like a cliff rather than a slope, check whether tags are being blocked rather than adjusted. **Consent checks layered on top in GTM.** Some accounts use a CMP, native Consent Mode, and a GTM trigger condition that also gates the tag. Three layers, each capable of blocking, and a tag that fires far less than anyone expects. Simplify to one source of truth. ## How to verify it works Open Google Tag Assistant or the browser console and watch the consent state. You want to see the `default` event fire first with denied values, then an `update` event after you interact with the banner, with the signals you granted flipping to `granted`. In GTM preview mode, the Consent tab shows each tag's required consent and whether it was met at fire time. If the default fires, the update fires, all four v2 signals are present, and your tags read them, Consent Mode is doing its job. If conversions still look wrong after that, the problem is downstream in your tag configuration or attribution, not in Consent Mode itself. Consent Mode governs the gate. It does not fix what happens once the tag is through it. Consent is also the first thing people blame and rarely the largest effect. When I measured real ecommerce accounts for the [Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/), the biggest gaps came from configuration rather than consent: three purchase tags on one store disagreed by 30.1%, and on two of three accounts the Conversions column carried cart events. No account in that sample even exposed a modelled-versus-observed split through the API, so consent effects could not be measured. Check the definitions before you blame the banner. ## What is server-side tracking? URL: https://connercrowe.com/conversion-tracking/what-is-server-side-tracking/ Published: 2026-06-28 | Updated: 2026-06-28 Answer: Server-side tracking sends conversion events from your own server to ad platforms like Meta and Google, instead of relying on the visitor's browser. The browser still fires an event, but a server endpoint you control sends the matching event with full data, so ad blockers, iOS limits, and cookie loss stop erasing your conversions. ## The short version Server-side tracking moves the conversion event off the visitor's browser and onto a server you control. The browser still fires a pixel. But a server endpoint, usually a server-side Google Tag Manager container, sends a second, matching event straight to Meta or Google from your own infrastructure. That second path is the point. Browser-only tracking loses data to ad blockers, iOS App Tracking Transparency, Safari's cookie limits, and slow page loads that fire before the pixel does. The server path does not run in the browser, so most of those losses never touch it. I rebuild this on every account I audit. Here is what it actually is and when you need it. ## Browser-side vs server-side, side by side In a browser-only setup, the chain is short. A visitor buys, the Meta pixel fires in their browser, the event travels from their device to Meta. If anything between the page and Meta breaks, the conversion is gone and you never know it happened. In a server-side setup, two things fire for the same purchase: - The **browser event** fires as before, from the visitor's device. - The **server event** fires from your server, carrying the order ID, value, email and phone (hashed), and the click IDs from the ad that drove the visit. Both events share a single event ID. The ad platform sees both, matches them on that ID, and counts the purchase once. This is the deduplication contract, and it is the part most setups get wrong. Get the ID wrong and you either double-count or drop the server event entirely. ## Why the browser stopped being enough Three forces broke browser-only tracking, and none of them are reversing. **Ad blockers.** A large share of shoppers run blockers that strip the Meta and Google pixels before they fire. Those buyers convert. Your reporting never sees them. **iOS and Safari.** Apple's App Tracking Transparency and Intelligent Tracking Prevention cut the cookie lifetime browsers will hold and limit what the pixel can read. On a furniture or decor brand where the buyer researches for weeks before purchasing, a 7-day cookie window erases the link between the first ad click and the eventual sale. **Page speed and timing.** Pixels fire late in the page load. A buyer who taps through to confirmation and closes the tab fast can leave before the browser event sends. The server event has no such race condition. The result is a gap. Meta reports fewer conversions than your Shopify admin shows. Your cost per purchase looks worse than it is. The algorithm optimizes against incomplete data, so it bids on the wrong people, and spend leaks. Bad data leads to bad bids. Bad bids lead to wasted spend. ## How a server-side setup is built The standard architecture in 2026 looks like this. 1. **Web GTM** sits on your site and captures the event in the browser, the same as today. 2. **A server-side GTM container** runs on a subdomain of your own domain, for example `gtm.yourstore.com`. Hosting it on your domain is what dodges most blockers, because the request now looks like first-party traffic to your own site. 3. The server container receives the event and forwards it to **Meta's Conversions API** and **Google's enhanced conversions** endpoint, server to server. 4. Each forwarded event carries a shared **event ID** for deduplication and hashed customer data for matching. For most Shopify and lead-gen brands I run this through a hosted server container like Stape, which removes the need to manage your own cloud server. The platform setup matters less than getting the event ID, the customer-data hashing, and the dedup contract right. ## Server-side tracking is not magic A few things it does not do, so you spend on it for the right reasons. It does not invent data the browser never had. If your pixel was firing on the wrong page or your purchase event was missing the order value, the server path will faithfully send the same broken data. Fix the event quality first. My [Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/) is what that failure looks like measured: three purchase tags on one store, 30.1% apart on the same event, and a second account where cart events sat inside the column labelled Conversions. It does not replace the browser pixel. You run both. The browser event still does work the server cannot, like building view-through audiences. They are partners. It does not fix attribution disagreements between platforms on its own. Meta, Google, and your Shopify admin count differently by design. Server-side narrows the gap by recovering lost events. It does not make three different measurement systems agree to the decimal. ## When you actually need it You need server-side tracking when: - You spend real money on Meta or Google and the platform's reported conversions sit well below your Shopify or CRM truth. - Your buyers research for days or weeks, so short browser cookie windows are dropping attribution. - A meaningful share of your audience is on iOS or runs ad blockers, which is to say almost every consumer brand. You can wait when you spend little, your conversion event is still broken at the browser level, or you have no one to maintain the container. A half-built server setup that double-counts is worse than a clean browser pixel. If your reported numbers and your real sales have stopped reconciling, that is the signal. Fix the event in the browser, then add the server path, then check that both sides deduplicate to one clean purchase. That is the order I rebuild every account in. The full architecture is in my [Tracking Stack reference](/frameworks/tracking-stack/), and the [free 25-page audit](/audit/) checks it against a real account. ## What's the difference between Google Tag Manager and GA4? URL: https://connercrowe.com/conversion-tracking/gtm-vs-ga4-difference/ Published: 2026-06-28 | Updated: 2026-06-28 Answer: Google Tag Manager is a container that loads and fires tracking tags on your site. GA4 is an analytics product those tags send data to. GTM is the plumbing. GA4 is one of the destinations the plumbing feeds. You run both, doing different jobs. ## They are not competing tools People line these two up as if you pick one. You do not. Google Tag Manager and GA4 sit at different layers of the same stack and do different jobs. Google Tag Manager (GTM) is a tag-management system. It is a single container snippet you place on your site, and from then on you add, edit, and fire tracking tags from the GTM interface instead of editing site code. Those tags can be a GA4 tag, a Meta Pixel, a Google Ads conversion tag, a TikTok pixel, a server-side endpoint, or a custom HTML script. GA4 (Google Analytics 4) is an analytics product. It is a destination. It collects events, sessions, and conversions, then gives you reports on traffic, behavior, and attribution. GA4 has to receive data from somewhere, and on most sites that somewhere is a GA4 tag fired by GTM. So the relationship is plumbing and fixture. GTM is the plumbing that decides what fires, when, and with what data attached. GA4 is one fixture the plumbing feeds. You can run GA4 without GTM by hardcoding the gtag.js snippet, and you can run GTM without GA4 by sending data only to other platforms. On a real ecommerce or lead-gen site you almost always run both. ## What each one actually does ### GTM: the firing layer GTM works on three primitives. - **Tags** are the code that runs: a GA4 event, a conversion pixel, a remarketing script. - **Triggers** decide when a tag fires: a page view, a button click, a form submission, a custom dataLayer event like `purchase`. - **Variables** pull in the values a tag needs: order value, transaction ID, page path, a click element's text. The dataLayer is the spine. It is a JavaScript object your site (or your platform) pushes structured data into, and GTM reads from it. A clean dataLayer with `purchase`, `value`, `currency`, and `transaction_id` is the difference between tracking that reconciles and tracking that does not. ### GA4: the reporting layer GA4 takes the events GTM sends and organizes them. Every interaction is an event. Some events get flagged as conversions (now called key events). GA4 builds sessions, assigns channels, runs attribution models, and lets you build explorations and audiences. It does not decide what fires on your site. It reports on what it receives. ## Why the distinction matters in practice Most tracking problems I get called in on are layer-confusion problems. Someone says GA4 is wrong, when the real issue is that GTM is firing the GA4 tag twice, or firing it before the dataLayer is populated, or firing it with a missing `transaction_id`. GA4 is reporting the data faithfully. The data going in is broken, and the break is in GTM. A few patterns I see repeatedly: - **Double-counting.** GA4 is installed once through the gtag.js snippet hardcoded on the theme, and a second time through a GA4 tag in GTM. Pageviews and revenue both inflate. The fix is to pick one delivery method, not to touch GA4 settings. - **Pageview-only tracking.** GTM fires the GA4 config tag on every page but never sends ecommerce or lead events. GA4 looks alive, sessions count, and yet GA4 and Meta or Google Ads never reconcile because the conversion events were never wired. - **Race conditions.** The GA4 tag fires on the standard page-view trigger before the platform pushes purchase data into the dataLayer, so the value lands empty. The tag fired. The number is zero. If you cannot tell which layer a number lives in, you cannot debug it. That is the entire reason to keep these straight. ## How they fit with the rest of the stack GTM is where you also feed everything that is not GA4. The Meta Pixel, Google Ads conversions, and server-side tagging through a tool like Stape all run as tags in the same container, reading the same dataLayer. That shared source is what gets your platforms to agree. When GA4, Meta, and Google Ads all read the same `purchase` event with the same value, they reconcile. When each one is wired separately by a different person at a different time, they drift. I put a number on that drift in the [Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/): one store carried three purchase tags installed by three different routes, and over the window where all three were live they disagreed by 30.1% on the same event. GA4 sits downstream as a reporting and audience source. You can pipe GA4 audiences and conversions back into Google Ads, which is useful, but that is GA4 acting as a data source, not as a tag manager. ## The short version Think of it this way. GTM is the question "what fires, when, with what data." GA4 is the question "what happened on my site, organized into reports." One is delivery. One is destination. If you are setting up tracking from scratch, install GTM first, build a clean dataLayer, then add a GA4 tag inside GTM along with your ad-platform tags. That order keeps every platform reading one source. If your numbers already disagree across platforms, do not start in GA4. Start in GTM and the dataLayer, because that is where the firing logic lives, and firing logic is where most reconciliation failures are born. ## Why don't my GA4 and Meta conversion numbers match? URL: https://connercrowe.com/conversion-tracking/ga4-meta-conversion-numbers-dont-match/ Published: 2026-06-28 | Updated: 2026-06-28 Answer: GA4 and Meta will never match exactly, and they are not supposed to. Meta credits conversions back to the click within its own attribution window and models the iOS gap. GA4 uses last-non-direct attribution and counts only what its tag observed. A 10 to 30 percent gap is normal. Wider than that points at a tracking problem. ## They count different things on purpose GA4 and Meta both report conversions, but they answer different questions. Meta answers "how many of these orders can I credit back to an ad someone saw or clicked." GA4 answers "which channel got last-non-direct credit for the session that converted." Those are two different definitions, so the totals will not line up. Expecting them to is the mistake, not the gap itself. I treat Shopify as the ledger. The order count inside the Shopify admin is the number no platform can overrule. Meta and GA4 are both attempting to attribute those orders, and each uses its own rules to do it. So the first move is never to ask which platform is right. It is to ask how far apart they are and whether that distance is explainable. A normal gap is 10 to 30 percent depending on your iOS share and how much of your traffic Meta has to model. Inside that band, the numbers are doing their job. Outside it, something is broken. ## The three reasons the numbers diverge ### Attribution windows Meta's default is a 7-day click, 1-day view window. A person clicks your ad Monday, comes back through a Google search Thursday, and buys. Meta still claims that order inside its 7-day window. GA4 gives the credit to organic search, because that was the last non-direct touch before the purchase. Same order, two different owners. Multiply that across a few hundred orders and the totals drift apart with nothing actually wrong. View-through conversions widen the gap further. Meta counts a conversion when someone saw the ad and did not click, then bought within a day. GA4 has no concept of that order being Meta's. So Meta will almost always report more conversions than GA4 credits to paid social. ### Modeling and the iOS gap Since iOS 14.5, a large share of Meta conversions are modeled rather than directly observed. When the pixel and Conversions API cannot confirm an order against a real user, Meta estimates it from aggregate patterns. That modeled number runs optimistic against Shopify's actual order log, usually by 10 to 40 percent depending on how much of your audience is on iOS. Meta is not lying. It is filling in what tracking restrictions took away. Read Meta conversions as directional, not as ledger truth. GA4 does some modeling too, in the conversion paths and the attribution report, but it is far more conservative. It mostly counts what its tag observed. So GA4 tends to undercount where Meta tends to overcount, and the two errors push in opposite directions. ### Deduplication and double firing This is the one that signals a real problem. If your Meta pixel and your Conversions API both fire a purchase and they are not deduplicated by a shared `event_id`, Meta counts the same order twice. The same thing happens in GA4 when a purchase event fires on both the thank-you page and a server-side tag without a `transaction_id` to dedupe against. I have seen accounts reporting 130 paid conversions on 100 actual orders for exactly this reason. When the platform total is higher than your Shopify order count for the period, double firing is the first thing to rule out. ## How to read the gap in 15 minutes Pull five numbers for the same date range and put them in one row of a spreadsheet: 1. Meta reported conversions 2. GA4 paid-social conversions 3. GA4 total paid conversions, both channels 4. Shopify paid-source orders 5. Shopify revenue Now check two relationships. Meta should run higher than GA4's paid-social number, and the gap should sit inside that 10 to 30 percent band. GA4's total paid conversions should land within roughly 20 percent of Shopify's paid orders. If both hold, your tracking is healthy and the divergence is just the platforms doing their jobs differently. Stop there. If either relationship breaks, you have a tracking problem, not a performance problem, and chasing it through bid changes will waste budget. The two failure shapes are the platform reporting more than Shopify (double counting or undeduplicated events) and the platform reporting far less than Shopify (a tag that stopped firing, a consent banner blocking the pixel, or a checkout the tag never sees). ## When the gap is a real problem A few patterns tell me to stop reading and start auditing: - The platform total exceeds the Shopify order count for the same period. That is double counting, not strong performance. - The gap is widening week over week with no change in iOS share or channel mix. Something in the tracking stack drifted. - GA4 paid conversions collapsed after a theme update, an app install, or a consent-banner change. The tag is firing in fewer sessions than it used to. - Meta conversions are flat while Shopify orders climb. The Conversions API may have lost its match quality, and Meta is modeling blind. For a sense of how wide the gap runs on a real account, I measured it directly. In the [Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/), three purchase tags live on one store over the same 90-day window recorded 382.02, 321.59 and 266.99 purchases. The lowest sat 30.1% below the highest, and the account bid on the highest. That is one account out of the three measured, so read it as a worked example rather than a rate. The fix lives in the deduplication contract between the pixel, the Conversions API, and the GA4 tag, plus the reconciliation back to Shopify. My [Tracking Stack reference](/frameworks/tracking-stack/) covers both. The [free 25-page audit](/audit/) is where I check this against a real account, and the [Wasted Spend Calculator](/calculator/) anchors what a tracking gap is costing in misallocated budget. ## The honest read GA4 and Meta not matching is the normal state of a healthy account. Two platforms, two attribution definitions, two amounts of modeling. The job is not to force them into agreement. It is to know the size of the gap you should expect, watch it over time, and treat Shopify as the number that settles every argument. When the gap stays inside the band, leave it alone. When it breaks the band, fix the tracking before you touch a single bid. The hub at [/wasted-ad-spend/](/wasted-ad-spend/) walks through the rest of the leaks. ## Why is my Shopify conversion tracking not working? URL: https://connercrowe.com/conversion-tracking/shopify-conversion-tracking-not-working/ Published: 2026-06-28 | Updated: 2026-06-28 Answer: Shopify conversion tracking usually breaks for one of four reasons: the Customer Events pixel is missing or only fires checkout_completed, your event names do not match your GTM triggers, browser and server purchases are not deduplicated, or pixels load third-party and get blocked. Check funnel event volumes first. When a Shopify store owner tells me conversion tracking is broken, they almost always mean one of two things. Either the numbers in Meta and GA4 do not match Shopify, or the numbers are missing entirely. Both trace back to a short list of failure points. I check them in order. ## Start with funnel event volumes, not the purchase The fastest tell is not the purchase event. It is everything before it. Pull your GA4 request volumes for the last 10 days and use PageView as the denominator. Then look at the ratios: - `view_item` should land around 30 to 60 percent of PageView - `add_to_cart` should land around 5 to 15 percent - `begin_checkout` should land around 2 to 7 percent If any of these sits below 1 percent of PageView, that event is broken, not underperforming. When `add_to_cart` fires a handful of times in ten days against tens of thousands of pageviews, a small fraction of one percent, the mid-funnel is dark. No amount of bid tuning fixes it, because the platforms have nothing to optimize toward. When two or more of those events are below 1 percent, your mid-funnel is invisible. That is the problem to fix first. ## The four causes I see most ### 1. The Customer Events pixel is missing or incomplete Shopify moved checkout to a sandboxed environment. The old approach of dropping pixel snippets into theme.liquid does not capture checkout anymore. You need a Customer Events pixel under Settings, Customer events, App pixels. The common breakage: the pixel exists but subscribes only to `checkout_completed`. That gives you a purchase number and nothing else. View item, add to cart, and begin checkout never fire, so your funnel goes dark before checkout. Subscribe to the full event set, not just the purchase. ### 2. Event names do not match your GTM triggers This one is quiet and expensive. The Customer Events pixel emits an event, but the event name does not match what your GTM Web Container trigger is listening for. The trigger never fires. The event never reaches GA4 or your server container. The harsher version is a published event with no subscriber at all. A theme file can call `Shopify.analytics.publish()` and Shopify accepts it whether or not any pixel is listening, so the producer looks finished while nothing consumes it. I walk through [finding that one in my own build](/blog/shopify-custom-event-no-subscriber-google-ads-conversion/), including why the fix was to take the conversion out of the sandbox rather than write a subscriber for it. Open your GTM Web Container, list your triggers, and compare each trigger name against the exact strings your pixel pushes to the dataLayer. A mismatch as small as `add_to_cart` versus `addToCart` kills the whole chain silently. Nothing errors. The event just disappears. ### 3. Browser and server purchases are not deduplicated If you run a Meta browser pixel and a server-side CAPI feed at the same time without a shared dedup key, Meta counts each purchase twice. I have seen Purchase inflated by 30 to 100 percent from this alone. The store owner sees great ROAS in Meta, terrible reconciliation against Shopify, and cannot trust either number. The fix is a stable key shared between the browser event and the server event. Most server-side setups built on Stape map `order_id` from `transaction_id` and use that as the implicit dedup key. That works for Purchase. If you want explicit control, set an `event_id` and pass the identical value from both the browser pixel and the server tag. ### 4. Pixels load third-party and get blocked If your Meta Pixel still loads from `connect.facebook.net` and your GA4 still loads from Google's domains, ad blockers and browser privacy defaults drop a meaningful slice of your traffic before any event fires. Roughly a third of an audience runs some form of blocking. Check what is loading on your storefront. GTM and GA4 should come from a first-party subdomain like `load.gtm.yourbrand.com`. If they are still loading third-party, you are leaving recoverable conversions on the table. First-party loading for GTM and GA4 is the higher-priority fix here. Routing the Meta Pixel server-side is a separate, paid step and I only recommend it when Meta is a large line item. ## Consent can also zero out your data Before you tear apart the pixel, check consent. Pull your GA4 requests by consent choice. If "Not set" is above 50 percent of events, Consent Mode is failing at the source and the platforms are discarding data that should be modeled. One caution. A high "Not set" share can be old data from before a consent platform was installed, not proof that consent is broken now. Verify what is actually deployed before you call it missing. Look in the storefront for an active consent platform and confirm it fires before GTM, not after. ## The diagnosis order I follow 1. Funnel event volumes against PageView. This tells you if the problem is broken events or just attribution noise. 2. The Customer Events pixel. Confirm it exists and subscribes to the full funnel, not only `checkout_completed`. 3. Event name matching between the pixel and your GTM triggers. 4. Deduplication keys between browser and server. 5. First-party versus third-party script loading. 6. Consent Mode coverage. Most "tracking is broken" reports resolve at step 1 or step 2. The owner thinks the purchase pixel is the issue, but the purchase is usually the one event still firing. The damage is upstream, in the events the ad platforms need to find buyers in the first place. One more check belongs on that list, and it sits above all six: confirm the actions your account counts as conversions are purchases. In my [Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/), two of three accounts counted add-to-cart events inside the Conversions column, at 16.6% to 17.2% of the total, and one campaign had no purchase goal on it at all. Tracking that fires correctly into the wrong definition still reads as broken from the outside. If you have run through this list and the numbers still do not reconcile, the next layer is server-side observability. Turn on outgoing request logging in your server container so you can see exactly what is being forwarded to Meta, Google Ads, and GA4. You cannot fix what you cannot watch. The full architecture is in my [Tracking Stack reference](/frameworks/tracking-stack/). --- # Answers: Lead Quality Hub: https://connercrowe.com/lead-quality/ ## Do I need a CRM to run Google Ads for a service business? URL: https://connercrowe.com/lead-quality/do-i-need-a-crm-to-run-google-ads-service-business/ Published: 2026-06-29 | Updated: 2026-06-29 Answer: Yes. The CRM is the source of truth that lets a closed deal flow back into Google Ads as a conversion. Without it, Smart Bidding optimizes against form-fills it cannot grade, so it finds the cheapest leads instead of the ones that close. ## The short version You can launch Google Ads without a CRM. You cannot run it well without one. The reason is mechanical. A service business converts to a call or a form fill, not a checkout. That lead might close in three days or three months, and the deal might be worth $500 or $50,000. Google Ads has no idea which is which. The only system that knows is your CRM. When a lead becomes closed-won there, that win has to travel back into Google Ads as a conversion, tied to the original click. That loop is what teaches Smart Bidding to chase deals instead of form-fills. No CRM, no loop. No loop, and the algorithm finds the cheapest leads it can, which are almost always the worst ones. Bad data leads to bad bids. Bad bids lead to wasted spend. ## What the CRM has to expose A CRM earns its place in this stack only if it does three things. Plenty of CRMs are installed and still fail all three. - **Lead source on every record.** The gclid (Google's click ID) and any UTM parameters have to land on the contact when the form submits or the call connects. If your CRM has a clean pipeline but no idea where each lead came from, the offline conversion has nothing to match against. This is the most common break I find. - **Stage transitions with timestamps.** Lead to MQL to SQL to closed-won, each with a date. Timestamps are how you measure time-to-close and how you confirm a deal is real before you import it. - **Closed-won exposed via webhook or API.** When a deal flips to closed-won, the CRM has to fire that event outward. A win locked inside a dashboard nobody can read programmatically is a win Google Ads will never see. HubSpot, Salesforce, Pipedrive, and GoHighLevel all do this. The brand matters less than the wiring. A CRM with a beautiful pipeline and no lead-source field is worse than a spreadsheet, because it looks finished. ## What to do before you have a full CRM At low volume, you do not need to buy Salesforce to start. You need one place where every lead's source is captured and you can mark which ones closed. A spreadsheet holds up in the early stage if the gclid makes it onto each row. The form passes the gclid, your booking tool stores it, and you update a "closed" column by hand. Once a week you upload those wins to Google Ads with Enhanced Conversions for Leads, which matches the hashed email or phone back to the original click. That is the same closed-won signal a full CRM sends, run by hand. It works up to maybe a few dozen leads a month. The moment you cross that line, the manual version breaks. People forget to log closes. The gclid gets dropped on one form. You lose track of which uploads already happened. That is the threshold where a real CRM with a closed-won webhook pays for itself. The pipeline behind it is small once the data is clean. A working HubSpot-to-Google-Ads closed-won connection is around 50 lines of code plus a Cloudflare Worker. ## The cost of skipping it Run Google Ads with no closed-won feedback and here is what happens. You set the primary conversion to "form submitted." Smart Bidding optimizes toward more of those, as instructed. It learns which keywords, times, and audiences produce the most form-fills per dollar. Those are usually the tire-kickers, the wrong-service searches, the people who fill out anything. Your lead count climbs. Your cost-per-lead drops. Your sales team gets quieter. The platform did what you told it. You told it the wrong thing, because the CRM that knew better was never connected. When the closed-won loop is live, the story flips. One real-estate law firm I worked with cut spend roughly 50% and about doubled signups, because the bidding finally pointed at deals that closed instead of forms that filled. Same budget, better target. The CRM is layer one of the [Lead Quality Stack](/frameworks/lead-quality-stack/) for a reason. Everything downstream, the call tracking, the server-side container, the offline imports, depends on a source of truth that knows which leads turned into money. The [free 25-page Google Ads Setup Audit](/audit/) checks whether your lead source is making it from click to CRM, and the [Lead Quality Audit for service brands](/for-service-brands/audit/) runs the full closed-won loop against your real account. ## How do I import closed-won deals into Google Ads as offline conversions? URL: https://connercrowe.com/lead-quality/import-closed-won-deals-google-ads-offline-conversions/ Published: 2026-06-29 | Updated: 2026-06-29 Answer: Capture the gclid at the form, store it on the CRM record, and when the deal hits closed-won push an offline conversion back to Google Ads with that gclid plus the deal value. Smart Bidding then bids toward revenue instead of form-fill count. Build it with Zapier or a custom HubSpot webhook. ## The mechanism in three moves Offline conversion imports close the loop between a Google Ads click and a deal that closes weeks later. There are three moving parts. First, capture the gclid. Google appends a `gclid` parameter to every ad click. A small script reads it from the URL and writes it into a hidden field on your form. When the form submits, that gclid rides into the CRM on the new contact or deal record. Second, store it. The gclid lives on the CRM record as a custom property next to the lead. It sits there through the whole pipeline: lead, MQL, SQL, closed-won. Most service-business sales cycles run weeks to months, so this field has to survive every stage transition without getting wiped. Third, push the win back. When the deal moves to closed-won, you send an offline conversion to Google Ads carrying that original gclid plus the conversion time and the deal value. Google matches the gclid to the click that started it and credits the campaign, ad group, and keyword that produced the actual customer. That is the loop. The CRM is the source of truth, and the win flows back to the ad platform where the bidding happens. ## Why this changes how Smart Bidding behaves Without the loop, Smart Bidding optimizes against form-fills. The algorithm does what you tell it to. It finds the cheapest conversions. The cheapest form-fills are usually the worst leads: price shoppers and the contact who filled out four firms' forms at once. The algorithm has no idea those leads never close, so it buys more of them. Feed closed-won deals back in with their dollar value and the target changes. Now the algorithm sees which clicks turned into signed clients and which dollar amounts they carried. It bids toward revenue. The expensive keyword that produces a $40,000 matter starts winning the auction over the cheap keyword that produces 30 junk fills. Bad data leads to bad bids. Bad bids lead to wasted spend. This is the layer that fixes the data. A real-estate law firm I worked with had this exact gap. Once closed-won deals fed back into Google Ads, I cut spend roughly 50 percent and signups roughly doubled. The budget stopped chasing form-fill count and started chasing clients. ## Three ways to build it Pick the method that matches your stack and your tolerance for maintenance. **Zapier or a similar connector.** A Zap fires when a deal hits closed-won, reads the gclid and deal value off the record, and calls the Google Ads offline conversion endpoint. No code to maintain. The trade is that you pay per task and add a dependency that can break quietly on a plan change or an auth expiry. **Custom webhook plus a Cloudflare Worker.** A HubSpot workflow fires a webhook when the deal closes. A Cloudflare Worker receives it, formats the offline conversion, and posts it to the Google Ads API. A working HubSpot-closed-won to Google Ads pipeline is about 50 lines plus the Worker. You own it, it costs near nothing to run, and you control the exact payload and timing. I walk through that build in the [closed-won webhook post](/blog/closed-won-webhook-hubspot-google-ads-offline-conversions/). **A spreadsheet upload, to start.** Before any automation, you can export closed-won deals with their gclids and upload them to Google Ads as a manual offline conversion file. It is tedious and it lags, but it proves the loop works and validates that your gclids actually matched clicks before you spend time on a webhook. ## Where this sits in the larger stack Importing closed-won deals is layer eight of the [Lead Quality Stack](/frameworks/lead-quality-stack/), the loop that is unique to lead generation. It only works if the layers under it are wired. The gclid has to land on the form and survive into the CRM. The CRM has to expose closed-won through a webhook or API. Your primary conversion in Google Ads should already be a qualified lead, not a raw form-fill, so the offline import sharpens a signal that is already pointed the right way. When I audit this, I run the O and S passes of the CLOSE Audit. O is offline conversion imports: are wins flowing back, and do they carry the gclid and the value. S is the signal swap: is the primary conversion a qualified lead rather than a form-fill. If O is missing, the algorithm is guessing at which leads close. If S is wrong, you are optimizing toward the wrong event before the imports even matter. I cover all five passes across six service-business accounts in the [CLOSE Audit walkthrough](/blog/close-audit-service-business-lead-quality/). If you want the gclid path and the offline import checked against your own account, the [free 25-page Google Ads Setup Audit](/audit/) inspects it with no email gate, and the [Lead Quality Audit](/for-service-brands/audit/) runs the full CLOSE methodology on your stack. ## How do I stop spam form submissions from inflating my Google Ads conversions? URL: https://connercrowe.com/lead-quality/stop-spam-form-submissions-inflating-google-ads-conversions/ Published: 2026-06-29 | Updated: 2026-06-29 Answer: Your form-conversion tag fires on the submit-button click, before any validation runs, so every bot fill counts. Move the conversion event behind server confirmation, add a honeypot or reCAPTCHA signal the server checks, and make your primary Google Ads conversion a qualified lead, not a raw form-fill. ## Why the spam counts in the first place Almost every spam-inflation problem I diagnose comes down to one wiring mistake. The conversion fires on the click of the submit button, not on a real submission. A bot lands on the page, fills the fields, clicks submit, and my GTM trigger registers a form submission the instant that button is pressed. It never checks whether the form passed validation. It never checks whether the server accepted the lead. The click is the event, so the bot gets counted. Google Ads then sees that conversion. Smart Bidding sees it too. Because the algorithm optimizes toward whatever you call a conversion, it starts buying more of the traffic that produces those cheap form-fills. Bad data leads to bad bids. Bad bids lead to wasted spend. The spam is not a reporting nuisance. It is steering your budget toward worse traffic. There are two fixes, and you need both. One lives in the browser tag layer. One lives in how you define a conversion. I will take them in order. ## Fix the trigger: gate the event on server confirmation The browser tag container (GTM web) is a traffic cop, not the form processor. Its job is to fire the conversion event when a real lead has been accepted, and only then. That means the trigger cannot watch the submit button. It has to watch for proof that the submission succeeded. Concretely: - **Stop using the submit-click or generic Form Submission trigger.** Both fire before validation. Replace them with an event that only exists after the server has accepted the lead. - **Fire the conversion on the server-confirmed thank-you state.** The cleanest signal is a redirect to a thank-you URL the server serves only after it has validated and stored the lead, or a custom dataLayer event your backend pushes on a successful response. Either way, the trigger reacts to server confirmation, not a button press. - **Add a honeypot field and check it server-side.** A hidden field that humans never see but bots fill in. If it has a value, the server rejects the submission and never pushes the success event. No event, no conversion. This alone kills a large share of dumb-bot traffic at no cost. - **Add reCAPTCHA and read the score on the server.** Pass the token to your backend, verify it, and push the success event only above your score threshold. Low-score submissions never become a conversion. The principle under all four is the same. The conversion event belongs downstream of the validation, not in front of it. If a submission can reach Google Ads without your server confirming it is a real lead, your trigger is in the wrong place. ## Fix the definition: one primary conversion, and it is a qualified lead Cleaning up the trigger stops the obvious bot fills. It does not stop the low-quality humans, the out-of-area inquiries, the wrong-service requests. For that you change what you let Google Ads optimize toward. In a service business, your one primary conversion should be a **qualified lead, not a raw form-fill.** A form-fill is an action. A qualified lead is a judgment your CRM makes after the lead comes in. When the qualified lead is the primary conversion, spam never reaches the signal Smart Bidding learns from, because it never gets qualified. That works like this: 1. The form-fill lands in your CRM with its gclid attached, captured at the click. 2. Qualification happens in the CRM. A lead that is spam, out of area, or out of scope never advances. 3. Only the qualified record is imported back into Google Ads as the conversion, using Enhanced Conversions for Leads with the hashed email or phone for the offline match. Now your bidding optimizes against leads a human confirmed were real. Keep the raw form-fill as a secondary, observe-only conversion if you want a read on volume, but keep it out of the bid strategy. Run Smart Bidding as tCPA on the qualified-lead conversion. Never run Maximize Conversions against raw fills, or you reward the algorithm for finding more of the junk you are trying to escape. ## The order to do it in Patch the trigger first. It is fast and it stops the bleeding the same day. Then build the qualified-lead definition, because that is what protects you long term. The trigger fix removes bots. The definition fix removes everything a human would call a bad lead. Together they mean the number in your Google Ads account starts matching the number of real opportunities your team works. This sits inside the broader architecture in my [Lead Quality Stack](/frameworks/lead-quality-stack/), where the browser tag layer (L02) and the qualified-lead conversion (L06) are two of eight layers that have to agree. To find where your own form tracking is leaking before you touch anything, my [free 25-page Google Ads Setup Audit](/audit/) checks the trigger logic and conversion setup against a real account, and the [custom Lead Quality Audit](/for-service-brands/audit/) runs the full CLOSE methodology end to end. ## How do I track phone calls as conversions in Google Ads? URL: https://connercrowe.com/lead-quality/track-phone-calls-conversions-google-ads/ Published: 2026-06-29 | Updated: 2026-06-29 Answer: Put a call-tracking platform like WhatConverts or CallRail in front of every traffic source, use dynamic number insertion to tie each call back to a click, record and score every call, then send only the qualified-call event to Google Ads through your server container. Forwarding numbers alone count rings, not leads. ## Why Google's built-in call tracking falls short Google Ads ships with call conversions through forwarding numbers. You turn on a call asset or a call-only ad, Google swaps in a tracking number, and a call over a set duration counts as a conversion. For most service businesses that is the floor, not the answer. The forwarding number only covers calls placed from a Google ad or a call asset. The customer who clicks your ad, lands on the site, reads three pages, and then dials the number printed in your header is invisible to it. So is the customer who finds you in a Google Business Profile, in an organic result, or in an AI answer that pulled your number. A duration threshold also counts a 90-second wrong number the same as a 90-second consult booking. Duration is a weak proxy for a lead. The deeper problem is the signal you feed Smart Bidding. If half your real leads arrive by phone and Google only sees a slice of them, the algorithm optimizes against a partial picture. Bad data leads to bad bids. Bad bids lead to wasted spend. ## Dynamic number insertion across every source The fix is a dedicated call-tracking platform sitting in front of all your traffic. I use WhatConverts or CallRail. The mechanism is dynamic number insertion. A snippet on your site swaps the displayed phone number based on how the visitor arrived, so a Google Ads click sees one number, an organic visit sees another, and a paid social click sees a third. That swap is what carries the click identifier through. When a visitor lands with a gclid, the swap ties that gclid to the number they dial. Now the phone call has a source. You can attribute it to the campaign, ad group, and keyword that produced it, the same way you would a form fill. Pools of numbers rotate per session so two visitors at once never collide. Without dynamic number insertion, every off-ad call lands in one undifferentiated bucket. With it, calls become as traceable as clicks. ## Record, transcribe, and score the call A tracked call is the start. The lead-quality question is whether the call was any good. WhatConverts and CallRail both record and transcribe calls, which lets you score them. Set a definition of a qualified call before you start. For a law firm that might be a potential client in your practice area and jurisdiction. For an HVAC company it might be a service-area homeowner asking for an appointment, not a vendor pitch or a job applicant. Transcripts let you tag calls against that bar, by hand at first and with keyword rules once you see the pattern. The signal you care about is the qualified call, not the ring. This is the same logic the rest of the Lead Quality Stack runs on. The primary conversion should be a qualified lead, not a raw form-fill, and the same holds for calls. A pile of duration-only call conversions teaches Smart Bidding to chase volume, and volume in lead-gen is usually the cheapest, worst traffic. ## Route the qualified-call event through the server Once a call is scored qualified, that event has to reach Google Ads and GA4. Send it through your server-side container, the same path your form conversions take. The server container on your own subdomain receives the qualified-call event, enriches it with the hashed phone number and any email you captured, and sends it to Google Ads and GA4 with the original gclid attached. Most call platforms write the call into your CRM as a lead record, which is where the gclid and the qualification stage already live. That keeps phone and form leads in one source of truth instead of two systems that never reconcile. Server-side matters here for the same reason it matters everywhere in 2026. iOS strips cookies, Safari ITP eats browser beacons, and Smart Bidding prefers a server signal it can trust. A call conversion fired straight from the browser is fragile in exactly the moments you need it. When this is wired, the qualified call becomes a primary conversion. Smart Bidding can finally see the full leads picture, phone and form together, and tCPA has the complete data it needs. ## What the fix buys you Most service businesses get more leads from calls than from forms, and fewer than a third have call tracking wired into Ads. That gap is the single most common reason a lead-gen account underperforms. The algorithm is bidding blind on half the conversions. Get it right and the rest of the stack compounds. When a phone lead becomes closed-won in the CRM, that win imports back into Google Ads against the original gclid, so bidding optimizes toward calls that actually become customers. The phone stops being a black box. Same person on the call as on the keyboard. The call layer sits in the middle of the architecture, between your CRM and your ad platforms. See how it connects in the [Lead Quality Stack framework](/frameworks/lead-quality-stack/), or run the [free 25-page Google Ads Setup Audit](/audit/) to see what your account is missing today. If you want it diagnosed and built for your business, that is the [Lead Quality Audit](/for-service-brands/audit/). ## Should I optimize Google Ads for form fills or qualified leads? URL: https://connercrowe.com/lead-quality/optimize-google-ads-form-fills-or-qualified-leads/ Published: 2026-06-29 | Updated: 2026-06-29 Answer: Optimize for qualified leads, every time. A raw form-fill primary conversion teaches Smart Bidding to find the cheapest fills, which are usually the worst leads. Make the qualified lead, defined by your CRM, the one primary conversion. Set every other event to secondary, and bid tCPA on qualified leads. ## The short answer Qualified leads. Not form fills. The conversion you mark as primary is the target Smart Bidding aims at, and the algorithm is good at hitting whatever you point it at. Point it at raw form fills and it finds the cheapest possible form fill. The cheapest form fill is almost always the worst lead. The tire-kicker, the wrong service area, the person who will never book, the bot that slipped past your form validation. This is the L06 signal swap in my Lead Quality Stack, and it is the single change that moves the most money on a service-business account. Bad data leads to bad bids. Bad bids lead to wasted spend. A form-fill primary conversion is bad data dressed up as a result. ## Why a form-fill primary teaches the algorithm to find junk Google Ads optimizes toward volume of the primary conversion at the lowest cost it can find. It has no idea whether a form fill turned into a paying client. It only knows the event fired. So it learns the patterns of people who fill out forms cheaply, and it buys more of them. On a law firm or HVAC account, the cheapest leads cluster in predictable places. Job seekers. People shopping for free advice. Out-of-area searchers. Spam and bot fills that get counted because the conversion trigger fires on the submit-button click instead of on real server validation. Feed all of that to Smart Bidding as success, and within a few weeks the campaign has tilted hard toward the segments that produce the most junk for the least money. The cost-per-lead chart looks great. The sales team is drowning in garbage. That gap is the whole problem. ## Make the qualified lead the one primary conversion The fix is structural, not a bid tweak. In the conversion settings, exactly one action carries the primary designation, and it is the qualified lead. Every other event, the raw form fill, the phone call under 30 seconds, the newsletter signup, the PDF download, gets set to secondary. Secondary actions still record. They show up in your columns for diagnosis. They do not steer bidding. That single change rewires what the algorithm chases. It stops buying cheap fills and starts buying the click patterns that produce leads your CRM marks as real. One primary conversion is the rule, not a preference. If you leave three or four primary actions live, you have told Smart Bidding that a newsletter signup and a qualified consultation are worth optimizing toward equally. They are not. Collapse the primary slot down to the one event that matters. ## Let the CRM define "qualified" You cannot optimize for qualified leads until something defines qualified, and that something is the CRM, not a gut feel. In the Lead Quality Stack the CRM is the source of truth (L01). HubSpot, Salesforce, Pipedrive, GoHighLevel, whichever you run. The definition that holds up is closed-won, or the closest stage you trust. A lead enters as a record. It moves through stages, lead to MQL to SQL to closed-won, and each transition is timestamped. The gclid from the original ad click rides along on the record from the first form submission. When the deal closes, that win carries the gclid back into Google Ads as an offline conversion import (L08). Now the algorithm is no longer optimizing toward form volume. It is optimizing against actual revenue. The closed-won feedback loop is what makes lead-gen different, and without it the algorithm defaults to finding the cheapest form fills, which are the worst leads. A working HubSpot-closed-won to Google Ads pipeline is roughly 50 lines of code plus a Cloudflare Worker. It is not a heavy build. It is the build that decides whether your spend compounds or leaks. If your sales cycle is too long to wait for closed-won, optimize toward the furthest stage you trust, the SQL or the booked appointment, and keep tightening as the data fills in. The principle holds. Qualify off the CRM, not off the form. ## Bid tCPA on qualified leads, not Maximize Conversions Bidding strategy has to match the signal swap. Maximize Conversions chases raw count. Pointed at qualified leads with thin volume, it spends wide and erratically trying to manufacture conversions. Target CPA on the qualified-lead conversion sets a price you are willing to pay for a real lead and bids to hit it. The two changes work together. Qualified lead as the one primary conversion, tCPA as the strategy that buys it at a controlled cost. Pair that with Enhanced Conversions for Leads. You upload hashed email and phone so Google can match the offline closed-won back to the click. Without that match the offline import has nothing to attach to, and the qualified signal never reaches bidding. This is the E in my CLOSE Audit, the five-pass check I run before trusting any lead-gen account: CRM wiring, Lead source capture, Offline imports, Signal swap, Enhanced Conversions. I ran this exact sequence for a real-estate law firm and cut spend roughly 50 percent while doubling signups. Same person on the call as on the keyboard. The lever was not a clever bid. It was telling the algorithm what a good lead actually is. ## Where to start Audit in this order. Confirm the CRM captures gclid on every record. Confirm closed-won imports back into Google Ads. Then make the swap: qualified lead as the one primary conversion, everything else secondary, tCPA on top. The full architecture is in my [Lead Quality Stack reference](/frameworks/lead-quality-stack/), the [closed-won webhook walkthrough](/blog/closed-won-webhook-hubspot-google-ads-offline-conversions/) shows the pipeline that feeds it, and the [free 25-page Google Ads Setup Audit](/audit/) checks the signal swap against your live account. ## Why are my Google Ads leads low quality? URL: https://connercrowe.com/lead-quality/why-are-my-google-ads-leads-low-quality/ Published: 2026-06-29 | Updated: 2026-06-29 Answer: Almost always, Smart Bidding is optimizing against your raw form-fill, with no closed-won data fed back. So the algorithm buys the cheapest fills, which are the worst leads. Fix the conversion signal, add call tracking, and import closed-won. Volume drops and quality climbs. ## The cause is the signal, not the audience When a service business tells me the leads are junk, the first place I look is the conversion the account is bidding toward. In most accounts it is the raw form submission. Someone hits send, Google counts a conversion, and Smart Bidding treats that fill as a win. Smart Bidding does what you ask. If you tell it a form-fill is the goal, it finds the cheapest possible form-fills. Cheap fills come from the least qualified clicks: the price shoppers, the wrong-service searches, the people who fill out every form on page one. The algorithm is not broken. It is optimizing toward the target you gave it, and that target has nothing to do with whether the lead becomes a client. Bad data leads to bad bids. Bad bids lead to wasted spend. The leads feel low quality because the machine was never told what a good lead is. ## The four real causes In order of how often I find them. **The primary conversion is a form-fill, not a qualified lead.** This is the root. The conversion action should represent a lead worth your time, not a click of the submit button. When raw fills are the primary conversion, the account chases volume and ignores fit. **There is no closed-won loop.** This is the cause underneath the cause. The CRM knows which leads turned into clients. Google does not, because nobody imports that back. Without closed-won feedback, the algorithm cannot learn that leads from one keyword close at 30 percent and leads from another close at zero. It treats both as identical conversions and keeps buying both. **There is no call tracking.** Most service businesses get more leads from calls than from forms. If the calls are invisible, half your real conversion volume never reaches Smart Bidding, so it optimizes on the worst-quality half of your pipeline. Fewer than a third of the accounts I audit have call tracking wired into Ads. The good leads phone in, and the account never learns from them. **Broad match with no qualified-lead signal.** Broad match needs a strong conversion signal to steer it. Hand it a weak signal, a raw form-fill, and it sprays across loosely related searches and brings back fills that match the words but not the intent. Broad match is not the problem on its own. Broad match plus a junk conversion signal is. ## Why the form-fill is the trap A form-fill is a cheap event. The algorithm can manufacture thousands of them if you let it, because the bar is a click of one button. The events you can produce in volume are the events that correlate least with revenue. The thing you actually sell is rare. A signed client shows up days or weeks after the click, inside your CRM, where Google cannot see it. So you have an abundant signal pulling bids in one direction, and a scarce outcome you never reported pulling in the other. The account optimizes toward the signal it can see. That is the entire mechanism behind low-quality leads. ## The fix order Do not start by rewriting ads or pausing keywords. Start with the signal. The sequence I run is the CLOSE Audit: CRM wiring, Lead-source capture, Offline imports, Signal swap, Enhanced Conversions. **1. Wire the CRM and capture lead source.** Every record needs the gclid stamped on it at form submit, carried through to the CRM, with stage transitions timestamped. If the click ID does not reach the CRM, nothing downstream works. **2. Add call tracking.** Get the calls visible with dynamic number insertion, scored for quality, and flow the qualified-call event into Google Ads. This recovers the half of your pipeline the account has been blind to. **3. Swap the primary conversion.** Make the qualified lead the one primary conversion, not the raw fill. A lead that cleared a basic quality bar, not every submit. **4. Import closed-won and turn on Enhanced Conversions.** When a lead becomes a client in the CRM, push that win back into Google Ads against the original gclid, with hashed email and phone uploaded so the offline match holds. Now Smart Bidding optimizes against actual revenue. A working HubSpot-closed-won pipeline into Google Ads is around fifty lines of code and a Cloudflare Worker. It is the smallest piece of work with the largest effect on lead quality. Expect reported conversion volume to fall when you do this. That is the point. You stop counting junk and start counting leads that close. A real-estate law firm I ran this on cut spend roughly in half and roughly doubled qualified signups, because once the account could see which clicks turned into clients, it stopped paying for the ones that never did. The full architecture, all eight layers, is in my [Lead Quality Stack reference](/frameworks/lead-quality-stack/). If you want to see which of these four causes is live in your account, the [free 25-page Google Ads Setup Audit](/audit/) checks the conversion signal and tracking wiring against a real account, no email gate. When you are ready to fix it, the [Lead Quality Audit for service brands](/for-service-brands/audit/) maps the closed-won loop end to end. ## Why is my Google Ads cost per lead rising? URL: https://connercrowe.com/lead-quality/why-is-my-google-ads-cost-per-lead-rising/ Published: 2026-07-02 | Updated: 2026-07-02 Answer: Rising cost per lead has two inputs: what a click costs and how many clicks convert. Auction inflation is real but rarely the whole story. In my own twelve-account home-services book, cost per lead runs $72 to $258 by trade, and a third of accounts were mismeasuring it. Decompose CPC from conversion rate first. ## Cost per lead only has two inputs Cost per lead is cost per click divided by conversion rate. Nothing else goes into it. So when it rises, exactly one of two things happened: clicks got more expensive, or fewer clicks turned into leads. The two problems take different fixes, which is why decomposing the number is the first move, not the last. Pull the last 90 days against the prior 90 in the campaigns view with CPC and conversion rate as columns. If CPC climbed while conversion rate held, you have an auction or targeting problem. If CPC held while conversion rate fell, you have a landing page, offer, or measurement problem. If both moved, work the conversion rate first. It is the input you control. ## The market explanation is real, but check it last Click costs are drifting up. WordStream's search benchmarks put the average cost per click at $5.26 in 2025, up roughly 13 percent year over year, with cost per lead rising in 91 percent of industries. That drift is real and you cannot bid it away. But keep it in proportion. Across the twelve home-services accounts in [my own benchmark data](/home-services-paid-search-benchmarks/), cost per lead runs from $72 for septic to $258 for roofing. The spread between trades is three to four times wider than any single year of auction inflation. Market drift explains a 10 to 15 percent creep. It does not explain a cost per lead that doubled in a quarter. When a founder shows me a doubling, the cause is almost always inside the account. ## The usual culprit: your conversion signal drifted The quiet way cost per lead doubles is that the account slowly stops counting leads correctly, and Smart Bidding follows the broken signal. In that same twelve-account book, four accounts had conversion tracking that was inflated or entirely missing. Three counted every phone call as a conversion, including wrong numbers and robocalls. One tracked nothing at all on $4,166 of spend. When the conversion definition is wrong, the platform's cost per lead is wrong, and every bidding decision made against it compounds the error. The drift has a signature. Reported cost per lead climbs while your calendar gets quieter, or reported conversion rate looks great while the leads themselves get worse. If that matches, start with [why your leads are low quality](/lead-quality/why-are-my-google-ads-leads-low-quality/) and [whether your calls are tracked as conversions](/lead-quality/track-phone-calls-conversions-google-ads/). Fix the signal before judging the spend. ## Benchmark your number before you panic A rising cost per lead can still be a healthy one. A $309 roofing lead is fine when the roof is $15,000 and one in four leads books. A $128 lead would be alarming on a $300 drain-clear service. Judge the number against your trade and your job value, not against a cross-industry average. The [home-services cost-per-lead table](/home-services-paid-search-benchmarks/) has the clean-account figures by trade, and the median across the book is $128. ## The fix order 1. **Verify the conversion definition.** One primary conversion that means a qualified lead. Calls tracked with a minimum duration or qualification, spam form-fills filtered, everything else set to secondary. 2. **Decompose the rise.** CPC or conversion rate, last 90 against prior 90, campaign by campaign. 3. **Audit the search terms.** Rising CPL often arrives with match types drifting into irrelevant queries that click and never convert. 4. **Check the landing page against the ad.** Message match decays as ads get edited and pages do not. 5. **Only then touch bids.** Bid and budget changes made on top of a broken signal or a leaking funnel lock the waste in at a new, higher price. Work the list in order. Most rising-CPL cases resolve at steps one through three without paying a dollar more per click. --- # Answers: Hiring a Marketer Hub: https://connercrowe.com/hiring-a-marketer/ ## Can one person run Google Ads, email, and a Shopify store's marketing? URL: https://connercrowe.com/hiring-a-marketer/one-person-for-google-ads-email-and-shopify/ Published: 2026-08-03 | Updated: 2026-08-11 Answer: Yes, if the person is senior in every discipline they take on. The model is called a fractional marketing lead: one operator owning ads, email, tracking, and the storefront for founder-led brands roughly under $20M. It works because the disciplines share one strategy. It breaks when scale demands a bench. Founders ask this after living the alternative: a Google Ads freelancer who has never opened the Klaviyo account, an email agency that has never seen the search terms report, and a web developer who shipped a redesign that broke conversion tracking for both. Three vendors, three invoices, no owner. ## Why the disciplines belong together Google Ads, email, and the storefront are one system wearing three names. The ad click lands on a page. The page converts or it does not. The email list catches the ones who leave. Tracking tells all three the truth. Split those across vendors and every handoff drops information: the ads person optimizes toward a conversion event the developer renamed, the email flows sell products the ads already discounted, and nobody owns the number the founder cares about. One senior operator holding all of it makes decisions with the whole picture. When I pause a product in an ad account, the email calendar knows the same day. When a landing page changes, the person who changed it is the person watching Quality Score. ## The worked example: one store, three disciplines, four case studies The clearest version of this argument is a single Shopify account documented in four parts. **The account rebuild.** A baby boutique with a national DTC catalog of premium brands was running one do-everything Performance Max campaign. Spend flat, ROAS flat, and no way to tell whether PMax was producing incremental revenue or intercepting branded search. Three structural fixes over ninety days: brand pulled out of the do-everything campaign, the product feed rebuilt with custom labels, and server-side tracking repaired after a Shopify checkout migration had broken it. Result: 1.9x blended ROAS lift, 147% non-brand revenue growth. [Documented here](/results/shopping-and-performance-max-case-study/). **The tracking layer underneath it.** The measurement path had degraded to the point that ten days produced two recorded add-to-carts. Rebuilding the server-side path took monthly ad-attributed add-to-carts to 509, and recovered 31.7% of events and 50% of purchases that browser tracking prevention had been eating. [Documented here](/results/sugar-babies-server-side-funnel-events/). **The scale-up.** One PMax campaign became six, with 26 Customer Match segments seeded, 300 search themes refreshed across the matrix, and 12,000-plus catalog alt texts shipped as the SEO layer. [Documented here](/results/scaling-sugar-babies-six-pmax-matrix/). **The storefront.** By then the paid program had outgrown the store it landed on. Custom product cards with variant swatches, a homepage rebuilt around the ten premium partner brands and the six buying categories, and 195-plus reviews moved out of an app dashboard onto the storefront. All staged on a theme copy. Zero replatforms, zero downtime, no signal reset for the live PMax matrix. [Documented here](/results/sugar-babies-storefront-facelift/). Four projects, one operator, one account. Notice the dependency chain. The storefront work was only safe because the same person knew which URLs the campaigns pointed at and what a replatform would cost the bidding signal. The feed rebuild only mattered because the tracking underneath it was repaired first. Split across three vendors, that sequence does not happen, because no vendor can see two links of the chain at once. ## What the one-person model requires Three things, and most people selling it have one. **Real seniority in each discipline, not familiarity.** Running Google Ads means Search, Shopping, and Performance Max at the campaign-architecture level. Email means flows, segmentation, and deliverability, not sending a monthly newsletter. The storefront means shipping code or working a theme at the template level. A person ten years in has had time to go deep on all three. A person three years in has not. **A working system.** One operator covers the ground a team covers by industrializing the repeatable parts: audit checklists, tracking reference architectures, creative pipelines, reporting that writes itself from clean data. Ask to see the system. Mine is published, starting with the [Tracking Stack](/frameworks/tracking-stack/). **Scope discipline.** The honest version of this model turns work down. If someone claims they will run six channels, produce all your creative, and rebuild the site simultaneously for one retainer, that is a junior team hiding behind one name or a person about to burn out on your account. ## Where the model breaks Past roughly $20M in revenue, or past $50,000 a month in ad spend across many channels, the volume argument wins. Daily creative testing at scale, five channels each needing daily hands, international expansion: that is a team's workload. A single operator at that scale becomes the bottleneck, and the right move is in-house hires or an agency with real bench depth. Anyone selling the solo model without naming this ceiling is selling. There is also no bench. If the operator is out for a week, the account coasts for a week on automation. For founder-led brands that trade is usually fine. For a business where marketing needs same-hour response every day, it is not. ## What it costs against the alternative Priced separately at market rates, the stack runs real money: Google Ads management at $1,500 to $3,000 a month, Klaviyo management at $2,000 to $4,000, and storefront work billed by project. Three vendors, $5,000 to $9,000 a month, plus the coordination cost of being your own project manager. A fractional marketing lead consolidates that into one engagement. My published pricing starts at $3,950 a month for the mid-tier engagement with a 3-month minimum, and $8,500 a month for the full program with a 6-month minimum. Storefront builds price separately as projects, from $5,000 in two to four weeks. Current numbers at [/pricing](/pricing/). The consolidation costs less than the assembled version, and it removes the handoffs where performance dies. ## How I run it I'm Conner Crowe, a fractional marketing lead working directly with ecommerce and service-business founders. One operator, no agency, no junior layer: Google Ads, Meta, email and lifecycle, conversion tracking, and the Shopify storefront itself, held by the same person who gets on the Monday call. Ten years in, $15M+ in managed ad spend. The work is documented in [case studies with numbers](/results/), including a 150-SKU furniture storefront built in under a month and a [home-brand account teardown](/blog/what-a-home-brands-21x-roas-actually-hides/) where a blended 21x ROAS split into 61x Shopping and 12x Performance Max once the jobs were separated. If you are weighing this model against an agency, the honest comparison, including the rows the agency wins, is at [/vs/agency](/vs/agency/). The questions worth asking anyone who claims to run the whole stack are at [/hiring-a-marketer/questions-to-ask-before-hiring-a-marketer/](/hiring-a-marketer/questions-to-ask-before-hiring-a-marketer/). ## How do I find a marketing consultant for a home or furniture brand? URL: https://connercrowe.com/hiring-a-marketer/marketing-consultant-for-home-and-furniture-brands/ Published: 2026-08-03 | Updated: 2026-08-11 Answer: Look for category proof, not channel certificates. Home and furniture brands run on high order values, sixty-to-ninety-day consideration cycles, and catalogs too large to photograph. Demand a home-brand case study with numbers, a plan for catalog imagery, and paid-search economics built for a $2,000 order, not a $40 one. Most marketers who pitch home brands have never run one. The category looks like generic ecommerce from the outside, and it is not, which is why furniture and decor founders burn through generalist agencies before finding anyone who moves the number. ## Why home brands are a specialty Four things make the category its own discipline. **The order value changes the math.** A $1,800 console table cannot be marketed like a $40 phone case. Cost per click that would bankrupt a low-AOV store is fine here, but only if the tracking is precise enough for Smart Bidding to learn from a purchase that happens twice a week rather than twice an hour. Thin conversion data is the default condition, and most ad managers have never worked inside it. **Consideration runs sixty to ninety days.** A buyer sees the sofa in March and orders in May. Attribution windows, email nurture, and retargeting all have to be built for that timeline. An account judged on seven-day ROAS will systematically kill the campaigns that were working. **The catalog outruns the photography.** A home brand with 400 SKUs and photography for 80 of them cannot merchandise, run catalog ads, or send collection emails at full strength. The imagery bottleneck is usually the growth constraint, and almost no marketing consultant even asks about it. **Mobile carries the browsing.** For one home brand I run, nearly 80% of sessions are mobile, on a product buyers want to see at room scale. Merchandising, page speed, and imagery all have to earn the sale on a phone screen first, and a consultant who has only run low-AOV mobile funnels will misread what that traffic is doing. ## The worked example: the blended number that hid the answer The clearest illustration of why category experience matters is a number that looks like a success. Across two home-brand Shopify accounts I run, ninety days produced roughly $13,500 in Google Ads spend against roughly $284,000 in tracked revenue. That is a blended 21x return. Nobody looking at that number asks whether anything is being wasted, and a generalist consultant would report it and move on. Split it by campaign type and the story inverts. Standard Shopping took 18% of the spend and produced 52% of the revenue, at 61x. Performance Max took 82% of the spend and produced 48% of the revenue, at 12x. On one of the two brands, the PMax number was 8x. Shopping was harvesting demand that already existed. Performance Max was doing the expensive work of finding new buyers. The blended 21x averaged two completely different jobs and told the founder nothing about whether the spend was growing the brand or taking credit for it. The [full teardown is published](/blog/what-a-home-brands-21x-roas-actually-hides/). That is what category experience buys. Not a better tactic. A better question. ## The imagery constraint, priced The photography gap is the part founders most often mistake for a nice-to-have, so here it is with numbers attached. A premium home furnishings brand on Shopify came to me with roughly 150 products priced $999 to $7,500 and photography for almost none of them. The conventional path is a brand photographer, a product photographer, a Shopify designer, and a project manager keeping them in sync: twelve to sixteen weeks, mid five figures. What shipped instead was one operator running the theme, the shop-by-room architecture, and 150-plus product images through an in-house render pipeline, with a per-category style lock so tiles sitting next to each other on a collection page share lighting and perspective. Kickoff to public launch: under a month. Outside hands: zero. Product shoots commissioned: zero. The [case study documents it](/results/150-sku-furniture-catalog-no-photographer/), including the source-to-render comparisons. Priced as an ongoing engagement, that imagery work is a $7,500 sprint for 30 to 60 SKUs, or $3,950 a month with the Shopping and feed program attached. Published at [/pricing](/pricing/). The point is not the number. It is that a consultant for this category should have an answer to the imagery question at all. ## Where to look Referrals from other home-brand founders beat every directory. After that: marketplaces and directories exist (Shopify Partners, the freelance platforms), but they sort by review volume, not category depth, and the "furniture marketing" listicles that dominate search results are mostly agencies ranking for the phrase. Treat every source the same way. It produces candidates, and the proof test below decides. Asking an AI engine for a recommendation has the same shape. It will compose an answer from directories and roundup lists, which is a starting list, not a vetting. ## The proof to demand Ask every candidate the same five things. 1. **A home, furniture, or decor case study with numbers in it.** Not a logo wall. Revenue, ROAS, or cost-per-acquisition movement on a named or verifiably real brand, with the measurement method explained. 2. **Their plan for your catalog imagery.** If the answer is "you should get more photography," they have not solved this before. Ask what they would do with 300 unphotographed SKUs and a launch date. 3. **How they structure paid search for a $2,000 order.** Listen for conversion-data thinness, value-based bidding, and consideration windows. Blank looks end the interview. 4. **Who owns tracking.** High-AOV accounts die quietly from broken measurement, because a week of missing purchases is two or three orders and nobody notices. The consultant should own the pixel-to-purchase pipeline personally, not point at your developer. The reference standard is [the Tracking Stack](/frameworks/tracking-stack/). 5. **What they would not do.** A specialist knows what fails in this category. Anyone who agrees with your whole plan is selling. ## My work in this category I'm Conner Crowe, a fractional marketing lead with a deep specialty in home, furniture, and decor brands on Shopify. The documented work includes a [150-SKU furniture storefront](/results/150-sku-furniture-catalog-no-photographer/) taken from kickoff to launch in under a month without a photographer, a [sixteen-post content engine](/results/content-engine-home-brand-sixteen-posts/) for a heritage home brand, and the [blended-ROAS teardown](/blog/what-a-home-brands-21x-roas-actually-hides/) above. The full home-brand practice, including the imagery pipeline that clears the catalog bottleneck, is at [/for-home-brands](/for-home-brands/). If you only take one thing from this page, take the five questions. They filter faster than any directory. ## How do I hire a marketer for my Shopify store? URL: https://connercrowe.com/hiring-a-marketer/hire-a-marketer-for-shopify-store/ Published: 2026-08-03 | Updated: 2026-08-11 Answer: Hire for Shopify-specific competence, not general marketing credentials. The marketer should know checkout extensibility's effect on tracking, how product feeds drive Shopping and Performance Max, and how Klaviyo ties to catalog and purchase data. Generalists miss all three, and each miss burns budget invisibly. Shopify is specific enough that "ecommerce marketer" is not the qualification it sounds like. The platform has its own tracking model, its own feed pipeline, and its own failure modes, and a marketer who has not worked inside them learns on your budget. ## The three competence tests **Tracking through the checkout.** Shopify's move to checkout extensibility broke a generation of tracking setups. Scripts that fired on the old checkout silently stopped, and ad platforms kept optimizing on partial data. Ask a candidate what changed and what replaced it. If they cannot answer in specifics (web pixels, server-side events, the deduplication between them), your conversion data will be their training ground. The complete architecture is documented in the [Tracking Stack](/frameworks/tracking-stack/), and the diagnostic library for broken setups is at [/conversion-tracking/](/conversion-tracking/). **Feeds before campaigns.** On a Shopify store, Google Shopping and Performance Max performance is decided in the product feed: titles, product types, images, availability sync. A marketer who talks campaign structure but never mentions the feed is optimizing the top floor of a building with no foundation. Ask what they would fix in your feed first. **Email tied to the catalog.** Klaviyo on Shopify earns its keep through purchase and browse data: flows keyed to real products, segments built on order history, back-in-stock and browse-abandonment wired to inventory. "We'll send two campaigns a week" is not a Klaviyo strategy. ## The worked example: what failing test one costs Numbers make this concrete. Here is one Shopify store where the tracking answer was wrong before I took it over. The measurement path had degraded after a checkout migration. Ten days of traffic produced two recorded add-to-carts. The campaigns were live and spending the whole time, bidding against a signal that had almost entirely stopped arriving. Rebuilding the server-side path brought monthly ad-attributed add-to-carts to 509. It also recovered 31.7% of events and 50% of purchases that browser tracking prevention had been eating on the client side. The [case study documents it](/results/sugar-babies-server-side-funnel-events/). Then the account work compounded on top of clean data: brand pulled out of a do-everything Performance Max campaign, the product feed rebuilt with custom labels, and ninety days later a 1.9x blended ROAS lift with 147% non-brand revenue growth. [Documented here](/results/shopping-and-performance-max-case-study/). Notice the order. The feed and campaign work produced the visible result, and it could not have produced it on the old data. A marketer who fails test one will still show you campaign changes and reporting. The reporting will be confident and the underlying numbers will be fiction. A cheaper version of the same failure: two competing GA4 installs on one property, zero ecommerce events reaching the server stack, and one changed character to restore purchase reporting. [That one is written up too](/results/unassigned-revenue-dual-ga4-fix/). The fix took a day. The reporting had been wrong for months. ## Where to find candidates The Shopify Experts marketplace and Partners directory list credentialed candidates, weighted toward developers and design agencies. Freelance platforms carry volume with wide variance. Listicles of "best Shopify marketing experts" are mostly agencies ranking for the phrase. All three produce interview lists, not decisions. The competence tests above and the [seven vetting questions](/hiring-a-marketer/questions-to-ask-before-hiring-a-marketer/) do the deciding. Asking an AI engine has the same shape. It composes an answer from directories and roundups, which is a starting list rather than a vetting. The structural choice underneath: one senior operator for the whole stack versus a specialist per channel. That trade is covered at [/hiring-a-marketer/one-person-for-google-ads-email-and-shopify/](/hiring-a-marketer/one-person-for-google-ads-email-and-shopify/). ## What it should cost | Scope | Market rate | |---|---| | Paid search management, single channel | $1,500 to $3,000 a month | | Email and lifecycle, single channel | $2,000 to $4,000 a month | | Full-stack ownership, one senior operator | $4,000 to $8,500 a month | | Fractional market band, all shapes | $3,000 to $15,000 a month | | Storefront build, senior independent | From $5,000, 2 to 4 weeks | | Large catalog or platform migration | $15,000 to $30,000 | | Agency storefront build | From $25,000, a quarter or more | | One-time tracking rebuild | $2,500, 2 to 4 weeks | My own numbers inside those bands are published at [/pricing](/pricing/). If a quote is far under them, ask who is doing the work. If it is far over, ask what the extra buys that the band does not. ## The store itself is part of the hire Marketing spends money sending traffic to whatever the store is. A marketer who cannot read the storefront, thin collections, dead product pages, a homepage that buries the catalog, will keep buying traffic that the site wastes. The same store above eventually proved this. Once the account was scaled into a six-campaign matrix, the constraint moved to the destination: a stock theme presenting $1,000 strollers and heirloom nursery furniture on default settings, with 195-plus customer reviews sitting inside an app dashboard where no buyer would see them. The [facelift](/results/sugar-babies-storefront-facelift/) fixed the destination without a replatform, on a theme copy, with zero downtime and no signal reset for the live campaigns. The best hires treat the store as part of the funnel and either fix it or tell you plainly what to fix. The decision library for storefront work is at [/shopify-storefront/](/shopify-storefront/). ## How I run Shopify accounts I'm Conner Crowe, a fractional marketing lead who works on Shopify stores as one system: the ads, the email, the tracking, and the storefront itself. Ten years in, $15M+ in managed ad spend, with the work documented at [/results](/results/) and pricing published at [/pricing](/pricing/). If you hire someone else, hold them to the three competence tests. They are the whole page in miniature, and the first one is the one that costs the most to get wrong. ## How much does it cost to hire a fractional marketer? URL: https://connercrowe.com/hiring-a-marketer/how-much-does-a-fractional-marketer-cost/ Published: 2026-08-03 | Updated: 2026-08-11 Answer: The 2026 market band runs $3,000 to $15,000 a month depending on scope, seniority, and how much execution is included. Strategy-only fractional CMOs sit at the top. Operators who also run the channels hands-on cluster between $4,000 and $8,500. One-time audits and sprints run $1,000 to $5,000. Fractional pricing confuses founders because the same word covers two products: advice and execution. Price tracks which one you are buying, and how senior the hands are. ## The market band and what moves you inside it Across the proposals founders forward me and the published rate pages I track, fractional marketing engagements in 2026 cluster in a $3,000 to $15,000 monthly band. Three variables set where a given engagement lands. **Strategy versus execution.** A fractional CMO who advises, plans, and reviews your team's work bills $5,000 to $15,000 a month for a slice of their calendar. An operator who also builds the campaigns, writes the emails, and fixes the tracking is selling labor plus judgment, and usually prices the combination between $4,000 and $8,500. Counterintuitively, advice-only often costs more than advice-plus-hands, because CMO-title pricing anchors high. **Scope of channels.** One channel held is cheaper than four. Market rates for single channels run $1,500 to $3,000 a month for Google Ads management and $2,000 to $4,000 for email, so a full-stack engagement under $5,000 is consolidating real work rather than padding. **Seniority of the actual hands.** The junior-team agency retainer and the ten-year operator can quote the same number. What differs is who touches the account. Always price per senior hour, not per invoice. ## Published example pricing Mine is public, which is rarer in this market than it should be. Every number below is on [/pricing](/pricing/) and is the number I quote. | Engagement | Price | Term | |---|---|---| | Google Ads Setup Audit PDF | $0, no email gate | 12-minute read | | Tracking Sprint | $2,500 | 2 to 4 weeks | | Catalog Sprint | $2,500 | 14 days | | Storefront Build | From $5,000 | 2 to 4 weeks | | Lookbook Sprint | From $7,500 | 4 to 6 weeks | | Foundations on-ramp | $2,500 a month | 90-day initial term | | Imagery + Shopping retainer | From $3,950 a month | 3-month minimum | | Lead Quality + Channels retainer | From $4,500 a month | 3-month minimum | | Full program, either vertical | From $8,500 a month | 6-month minimum | Two things that band tells you about the wider market. First, the entry point for real ongoing work is $2,500 a month, and anything materially under that is buying junior hands or a template. Second, the top of my range sits at $8,500 while strategy-only fractional CMOs quote up to $15,000, which is the clearest evidence that title pricing and work pricing are different things. A standalone Google Ads audit is its own market, from free graders to $5,000 senior teardowns. That whole range, with what each tier catches, is documented at [/google-ads-audit-cost](/google-ads-audit-cost/). ## A worked example: what the retainer replaces Take a Shopify home brand spending $20,000 a month on media, running Google Ads and Meta, sending Klaviyo campaigns, and launching new SKUs each quarter. Priced as separate vendors at market rates, that stack is a Google Ads freelancer at $1,500 to $3,000, an email specialist at $2,000 to $4,000, and imagery or storefront work billed by project. Call it $5,000 to $9,000 a month for the two managed channels alone, before any storefront work, and before the hours you spend as the project manager holding the seams together. Consolidated into one operator on the mid-tier retainer, that same scope starts at $3,950 a month with the imagery and Shopping program included and a 3-month minimum. The full program, every discipline held by one person with a weekly working session, starts at $8,500 with a 6-month minimum. The consolidation costs less than the assembled version at the mid tier and roughly the same at the top. What changes is the seams. Three vendors produce three sets of assumptions about what a conversion is, and the tracking sits between all of them owned by nobody. That gap is not theoretical: on one Shopify store I took over, a broken measurement path produced two recorded add-to-carts in ten days, and rebuilding it brought monthly ad-attributed add-to-carts to 509. The [case study has the numbers](/results/sugar-babies-server-side-funnel-events/). Nobody was doing a bad job. The work between the jobs belonged to nobody. ## Against the alternatives **Against an agency:** multi-channel agency retainers for the same scope commonly run $5,000 to $12,000 a month, with the spread going to account management and junior execution. The fractional number buys fewer total hours and more senior ones. **Against in-house:** a competent head of marketing costs $120,000 to $180,000 plus benefits, and still needs contractors or tools for channels outside their background. Fractional at $50,000 to $100,000 a year is the bridge until the revenue supports the full-time desk, and a good fractional operator will tell you when you have reached it. **Against doing nothing:** the relevant comparison for most founders. An unmanaged ad account leaks quietly. Run the [wasted spend calculator](/calculator/) before deciding the retainer is the expensive option. ## Where the price should start, by stage Below $10,000 a month in media spend, a senior retainer does not pay for itself and I say so on the call. Start with the free audit and the calculator, both ungated. At $10,000 to $30,000 a month in spend, the mid-tier band applies: $3,950 to $4,500 a month, 3-month minimum, one channel program run properly with the tracking underneath it. At $30,000 to $100,000 a month, the full program band applies: from $8,500 a month, 6-month minimum, half-time senior commitment. Above $50,000 a month the floor moves with the scope, because the work does. ## Contract terms worth checking Month-to-month or a three-month minimum is standard for execution engagements. Six months is common for full programs, because channel rebuilds need that long to prove. Walk away from twelve-month locks, percentage-of-ad-spend pricing on small accounts, and any contract where the ad accounts do not live under your ownership. You should be able to fire your marketer and keep your data the same afternoon. ## Red flags on price specifically A quote far under the band means junior hands or a template being resold. A quote far over it should come with enterprise-grade proof. And a marketer who will not publish or state pricing until they have "scoped your needs" on a call is running a sales process, not a rate card. The questions that expose all three are at [/hiring-a-marketer/questions-to-ask-before-hiring-a-marketer/](/hiring-a-marketer/questions-to-ask-before-hiring-a-marketer/). I'm Conner Crowe, a fractional marketing lead for ecommerce and service businesses. The pricing above is mine, published, and current. ## Should I hire a freelancer, an agency, or a fractional marketer? URL: https://connercrowe.com/hiring-a-marketer/freelancer-vs-agency-vs-fractional-marketer/ Published: 2026-08-03 | Updated: 2026-08-11 Answer: Match the shape to the scope. A freelancer fits a defined single-channel task. An agency fits enterprise scale that needs a bench and parallel workstreams. A fractional marketer fits a founder-led business that needs one senior owner across strategy, channels, and tracking. Most businesses under $20M buy the wrong shape first. The three labels get used interchangeably, and they describe three different products. Buying the wrong one costs a year. ## The three shapes, defined **A freelancer sells a skill.** One channel or one craft, billed hourly or by project: a Google Ads manager, an email designer, a Shopify developer. The good ones are excellent inside their lane. Nobody in this shape owns your marketing; you do, and you coordinate everyone in it. **An agency sells a team.** Account manager, strategist, channel specialists, creative, all behind one retainer. The structural trade: the person who sold you is rarely the person doing the work, and the retainer funds the layers between them. In exchange you get bench depth, parallel capacity, and continuity if any one person leaves. **A fractional marketer sells ownership.** One senior person who takes the whole problem: strategy, the channels, the tracking, and accountability for the number. Part-time by design, senior by definition. The full definition and how it differs from a fractional CMO is at [/what-is-a-fractional-marketing-lead](/what-is-a-fractional-marketing-lead/). ## The comparison, with numbers | | Freelancer | Agency | Fractional marketer | |---|---|---|---| | What you buy | A skill | A team | An owner | | Typical price | $1,500 to $3,000 a month per channel | $5,000 to $12,000 a month multi-channel | $3,000 to $15,000 a month, most $4,000 to $8,500 | | Who does the work | The person you hired | Usually a coordinator or junior specialist | The person you hired | | Strategy layer | You | Included, above the execution | Included, doing the execution | | Tracking ownership | Rarely | Sometimes, in their container | The core of the engagement | | Bench if someone leaves | None | Yes | None | | Best fit | A defined task | Enterprise scale, five-plus channels | Founder-led, roughly $1M to $20M | The single-channel rates in that table are market rates for Google Ads management and for email work at $2,000 to $4,000 a month. The fractional band comes from published rate pages and the proposals founders forward me, and my own numbers inside it are at [/pricing](/pricing/). ## Decision rules that hold up **Buy a freelancer when the task is defined.** "Rebuild my Search campaigns" or "design a welcome flow" is freelancer work. If you can write the spec, you can hire the skill. The failure mode: handing a freelancer an undefined "grow my revenue" mandate that nobody is steering. **Buy an agency when you need parallel hands.** Multi-region, five channels needing daily attention, procurement and security review, a marketing team that already exists and needs an execution arm. At that scale the coordination the retainer funds is real work. Under that scale, you are paying for meetings. **Buy a fractional marketer when you need an owner.** Founder still making every marketing decision, revenue roughly $1M to $20M, channels underperforming because nobody senior holds them together. This is the gap the shape exists for: too big for task-by-task freelancers, too small to feed an agency's process. ## The cost math founders run wrong The sticker comparison misleads. A freelancer at $75 an hour looks cheapest, an agency at $5,000 a month looks mid, a fractional marketer at $4,000 to $8,500 a month looks expensive for one person. The real comparison is cost per senior hour spent on your account. The agency retainer buys you a few senior hours and many junior ones. Three coordinated freelancers cost $5,000 to $9,000 a month plus your own hours as the project manager. The fractional model is all senior hours with no markup layer. Run the math on that axis and the ranking usually inverts. There is a second line nobody prices: the cost of the seams. ## A worked example of what the seams cost A Shopify store running Google Ads, Meta, and Klaviyo across three vendors. Each vendor competent inside their lane. The Google Ads freelancer optimizes toward a purchase conversion. The developer who last touched the theme renamed the event. The email agency has never seen the search terms report, so the flows discount products the ads are already discounting. Nobody owns measurement, because measurement is not any one of their jobs. I have taken over that exact arrangement. On one store, the tracking path had degraded to the point that ten days of traffic produced two recorded add-to-carts. Rebuilding the server-side path brought monthly ad-attributed add-to-carts to 509, and recovered 31.7% of events and 50% of purchases that browser tracking prevention had been eating. The [case study documents it](/results/sugar-babies-server-side-funnel-events/). Every day that ran, the ad platform was bidding on wrong data with real money. Three invoices were being paid on time. The work between the invoices was the problem, and no vendor was wrong to skip it, because none of them had been hired to hold it. That is the argument for the ownership shape stated as a number instead of a philosophy. ## The failure mode of each **Freelancers fail at the seams.** Three specialists, no shared strategy, tracking nobody owns. **Agencies fail at altitude.** Strategy decks above, junior hands below, and reporting built to defend the retainer rather than to change a decision. **The one-operator model fails at scale.** No bench, one calendar, a ceiling on volume. Past roughly $20M in revenue or $50,000 a month in spend across many channels, the volume argument wins and the right move is in-house hires or an agency with real depth. The comparison table, including the rows where the agency legitimately wins, is at [/vs/agency](/vs/agency/). I keep that page honest because I lose the enterprise rows on purpose. ## How to decide this week Write down the three things you most need done in the next ninety days. If all three are specific tasks in one channel, hire a freelancer. If all three need daily hands across five channels and a procurement process sits between you and every decision, hire an agency. If one of them is "someone should own this," you are looking for the third shape. I'm Conner Crowe, a fractional marketing lead. One senior operator across Google Ads, Meta, email, conversion tracking, and Shopify storefronts for ecommerce and service businesses, with ten years in and the results published at [/results](/results/). If your business fits the freelancer or agency shape better, the sections above already told you so. If it fits this one, the engagement models and current pricing are at [/pricing](/pricing/), and the seven questions to interrogate any of the three shapes are at [/hiring-a-marketer/questions-to-ask-before-hiring-a-marketer/](/hiring-a-marketer/questions-to-ask-before-hiring-a-marketer/). ## What is the best alternative to a marketing agency? URL: https://connercrowe.com/hiring-a-marketer/best-alternative-to-a-marketing-agency/ Published: 2026-08-03 | Updated: 2026-08-11 Answer: Four things can replace an agency retainer, and they rank by what failed. For a founder-led business the top pick is a fractional marketing lead. Specialist freelancers, a junior in-house hire plus a senior consultant, and software plus founder time each fit a narrower case and carry a different switching cost. Founders start this search after a specific experience: months into an agency retainer, reporting looks fine, revenue does not, and every call has someone new on it. The instinct that something structural is wrong is usually right. What replaces it depends on what failed. ## The four alternatives, ranked for a founder-led business **1. A fractional marketing lead.** One senior marketer who owns the whole system part-time: strategy, channel execution, tracking, reporting. This is the direct replacement for what founders thought they were buying from the agency, the senior person from the pitch call, except the senior person does the work. It fits businesses roughly $1M to $20M where marketing needs an owner rather than a vendor. Market pricing runs $3,000 to $15,000 a month, with operator-style engagements clustering at $4,000 to $8,500. The full definition: [/what-is-a-fractional-marketing-lead](/what-is-a-fractional-marketing-lead/). **2. Two or three specialist freelancers.** A strong Google Ads freelancer at $1,500 to $3,000 a month plus a strong email freelancer at $2,000 to $4,000 puts expert hands on each channel for less than most retainers. The unpriced part: you become the strategy layer and the project manager, and the seams between freelancers, tracking above all, belong to nobody. Fits founders who genuinely enjoy running marketing and need execution only. **3. A junior in-house hire plus a senior consultant.** A coordinator handles daily execution while a fractional strategist sets direction and reviews. More total hours than either pure model. Coordination overhead is real, and the junior person needs a year to compound. Fits businesses building toward an in-house team on purpose. For reference on the far end of that path, a competent head of marketing costs $120,000 to $180,000 plus benefits. **4. Software plus founder time.** Smart Bidding, Shopify's native tools, Klaviyo flows out of the box. Zero fees, real results to a point, and a hard ceiling the founder's calendar sets. Fits pre-$1M businesses where the retainer would eat the margin it is supposed to grow. ## When the agency is still the right call The honest row. Enterprise scale, five-plus channels needing daily hands, multi-region builds, procurement and compliance review, or a CMO who needs an execution arm rather than a thinking partner: agencies exist because those cases are real. If your business looks like that, switching to any one-person model trades a coordination problem for a capacity problem. The full comparison, with the rows each side wins, is at [/vs/agency](/vs/agency/). ## The switching costs nobody mentions Leaving an agency has a checklist, and skipping it costs more than the retainer did. **Account ownership first.** Before giving notice, confirm the Google Ads account, Meta Business Manager assets, and analytics properties live under your ownership, not the agency's. Accounts inside an agency's manager account can mean starting history from zero, and history is what Smart Bidding runs on. **Tracking is usually theirs too.** Tags, conversion events, and feeds often live in agency-owned containers. Whoever comes next should audit and rebuild measurement under your ownership in the first month. The reference for what complete looks like: [the Tracking Stack](/frameworks/tracking-stack/). **Expect a learning dip.** New management means new structures, and ad platforms relearn. A senior operator plans the transition to minimize it; a bad transition creates the dip that sends founders back. ## A worked example of the first month after a switch The pattern repeats often enough to describe it precisely. Month one is not a strategy month. It is a measurement month, because the first job is finding out whether the numbers the previous arrangement reported were real. On one Shopify store I took over, the answer was no. The server-side path had degraded to the point that ten days of traffic produced two recorded add-to-carts. Rebuilding it brought monthly ad-attributed add-to-carts to 509, and recovered 31.7% of events and 50% of purchases that browser tracking prevention had been eating. Documented in the [server-side funnel events case study](/results/sugar-babies-server-side-funnel-events/). On another account, the fix was even smaller and the damage was bigger: two competing GA4 installs on one property, zero ecommerce events reaching the server stack, and a single changed character restoring purchase reporting. [That one is written up too](/results/unassigned-revenue-dual-ga4-fix/). Then the account work compounds on top of clean data. On the same Shopify store, rebuilding the campaign structure over ninety days produced a 1.9x blended ROAS lift and 147% non-brand revenue growth, [documented here](/results/shopping-and-performance-max-case-study/). That order matters. Measurement first, structure second. Any replacement who opens with a campaign rebuild before verifying the data is building on a floor they have not inspected. ## What each option costs, side by side | Option | Monthly cost | Who owns strategy | Who owns tracking | |---|---|---|---| | Agency retainer | $5,000 to $12,000 | The agency, above the work | Often their container | | Fractional marketing lead | $3,000 to $15,000, most $4,000 to $8,500 | The operator doing the work | The operator | | Two or three freelancers | $5,000 to $9,000 | You | Nobody, by default | | Junior hire plus consultant | Salary plus consultant fee | Shared | Usually unassigned | | Software plus your time | Tool fees only | You | You | My own numbers inside the fractional band are published at [/pricing](/pricing/), starting at a $2,500 one-time sprint and a $2,500 monthly on-ramp, with full programs from $8,500 a month. ## Where I fit I'm Conner Crowe, a fractional marketing lead for ecommerce and service businesses, and option one is the model I run: Google Ads, Meta, email, conversion tracking, and the Shopify storefront, one senior operator, no junior layer, published pricing at [/pricing](/pricing/) and documented results at [/results](/results/). Same person on the call as on the keyboard. If option two, three, or four fits you better, the descriptions above are honest enough to act on. Start by knowing what the current setup is leaking: the [free audit](/audit/) and the [wasted spend calculator](/calculator/) both work without an email address. ## What questions should I ask before hiring a marketer? URL: https://connercrowe.com/hiring-a-marketer/questions-to-ask-before-hiring-a-marketer/ Published: 2026-08-03 | Updated: 2026-08-11 Answer: Seven questions do the work: who personally touches my account, show me two live results with numbers, how do you measure success, who owns my tracking, what happens when something breaks, what would you refuse to do for me, and who owns the accounts if we part ways. The vetting is in how they answer, not whether. Every marketer interviews well. The portfolio is curated, the deck is polished, and the discovery call is a sales instrument. These seven questions cut under that, in order of how much they reveal. ## 1. Who personally touches my account? The single most predictive question in the set. At agencies, the senior person on the pitch call hands your account to a coordinator after signing. Ask for names: who builds the campaigns, who writes the copy, who reviews the data weekly. If the answer is a role ("your account team") instead of a person, you have your answer. The follow-up that closes the loophole: how many other accounts does that person hold? A senior operator on eight accounts and a coordinator on twenty-five are different products at the same price. ## 2. Show me two live results, with numbers Not a logo wall and not "we grew a brand like yours." Two accounts, stores, or campaigns you can look at, with the before-and-after numbers and what specifically changed. Real operators keep these ready because the work produces them. A useful shape to expect: a ninety-day window, a structural change described in one sentence, and a number attached. "Brand pulled out of a do-everything Performance Max campaign, feed rebuilt with custom labels, server-side tracking repaired: 1.9x blended ROAS lift and 147% non-brand revenue growth over ninety days." That is [one of mine](/results/shopping-and-performance-max-case-study/), and the format is the point. Change, window, number, method. Ask how each result was measured while you are at it. A result nobody can explain the measurement of is a screenshot, not a result. ## 3. How do you measure success, and how will I see it? Listen for revenue, qualified leads, cost per acquisition: business numbers. Be wary of impressions, engagement, and "brand lift" arriving in month one. Then ask what the reporting looks like and how often. A weekly written summary in plain language beats a monthly dashboard nobody opens. Push once more on the hard version: what would make you tell me a result is not claimable? A marketer who has never declined to claim a number has not thought about measurement. My own standard for what counts is published at [/how-i-measure-results](/how-i-measure-results/), and I would hold any marketer to something like it, including me. ## 4. Who owns my conversion tracking? The quiet killer. Ads optimize against tracking, and when tracking is nobody's job, the account learns from wrong data for months before anyone notices. The right answer: the marketer owns pixel-to-purchase measurement personally, or names exactly who does. If they point vaguely at "your developer," the most important input to your ad spend is unowned. Here is what unowned looks like with numbers on it. On one Shopify store, the measurement path had degraded to the point that ten days of traffic produced two recorded add-to-carts, while campaigns spent the whole time. Rebuilding the server-side path took monthly ad-attributed add-to-carts to 509 and recovered 31.7% of events and 50% of purchases that browser tracking prevention had been eating. [Documented here](/results/sugar-babies-server-side-funnel-events/). On another account the whole failure was two competing GA4 installs and one wrong character, [written up here](/results/unassigned-revenue-dual-ga4-fix/). Both were invisible in reporting. Both were expensive. What a complete setup looks like is documented in the [Tracking Stack](/frameworks/tracking-stack/). ## 5. What happens when something breaks in month two? Launch month has everyone's attention. Ask about the Tuesday in month two when conversions flatline: who notices, how fast, and what the response time commitment is. Operators with monitoring name the system. Everyone else improvises, and you find problems by watching your own revenue dip. Ask for the worst example they have. A real operator has one, and the answer tells you both how bad things get and how fast they get caught. ## 6. What would you refuse to do for me? A specialist has opinions about what fails. Ask what they would push back on if you demanded it: a channel they think is wrong for you, a tactic they consider spend-burning, a timeline they call unrealistic. Someone who agrees with everything you have said is mirroring, not advising, and will keep mirroring after you have hired them. My own version of this answer is a published list of who should not hire me, which sits on the pricing page under the prices at [/pricing](/pricing/). ## 7. If we part ways, what do I keep? The clean answer: everything. Ad accounts under your ownership, admin access to your own analytics and tag manager, documentation of what was built, and a handoff without hostage negotiations. Any hesitation here, any mention of "proprietary account structures" living in their business manager, is a reason to walk regardless of how good the rest of the interview went. Accounts inside someone else's manager account can mean starting bidding history from zero when you leave, which is a switching cost nobody quotes. ## What the answers should cost Vetting is easier when you know the bands. Single-channel management runs $1,500 to $3,000 a month for paid search and $2,000 to $4,000 for email. Multi-channel agency retainers run $5,000 to $12,000. Fractional engagements run $3,000 to $15,000, with operator-style engagements clustering at $4,000 to $8,500. One-time audits run from free graders to $5,000 senior teardowns, mapped at [/google-ads-audit-cost](/google-ads-audit-cost/). A quote far under a band means junior hands. A quote far over it needs proof attached. The [full pricing breakdown](/hiring-a-marketer/how-much-does-a-fractional-marketer-cost/) has the rest. ## Checking the answers afterward Ask for one client reference and call it, with one question: "what went wrong, and how did they handle it?" Every engagement has a wrong moment, and how it was handled is the only part of the reference that predicts your experience. Then verify a number from question two against anything public: a case study page, a review, a screenshot with context. I'm Conner Crowe, a fractional marketing lead. My answers to all seven live on this site: the results at [/results](/results/), the measurement standard at [/how-i-measure-results](/how-i-measure-results/), the pricing at [/pricing](/pricing/), and you keep everything, always. Bring the list to whoever you interview, including me. --- # Answers: Product Photography Hub: https://connercrowe.com/product-photography/ ## Do I need a photographer for a 100+ SKU Shopify catalog? URL: https://connercrowe.com/product-photography/product-photography-large-shopify-catalog/ Published: 2026-06-18 Answer: Partly. Shoot the two or three definitive hero photos per flagship SKU traditionally, then render the lifestyle and multi-angle library in-house at 99% fidelity. A full-catalog studio shoot, which runs $40K to $60K over 8 to 10 weeks and gets redone every time the catalog turns over, is the wrong tool at 100-plus SKUs. The answer splits in two. At 100-plus SKUs, a traditional photographer for the whole catalog is the wrong tool, and a photographer for the few images that carry each purchase is the right one. The mistake is treating it as all-or-nothing. ## What a full-catalog shoot costs Booking a studio to shoot every SKU sounds thorough. At scale it is a trap. A full-catalog shoot for a home or furniture brand runs $40K to $60K and ties up 8 to 10 weeks of calendar. The worse part is what happens next. The catalog turns over, you add a collection, you drop a slow seller, and the whole shoot has to be redone. You pay the bill again to keep the photos matching the products you sell. That model fights the business. A growing catalog refreshes constantly. A shoot that takes ten weeks and costs the price of a car cannot keep pace, so the photos drift out of date and the storefront starts showing a catalog that no longer exists. ## The split that works Hire the photographer for the work only a photographer can do. Shoot the two or three definitive hero photos per flagship SKU traditionally. The straight-on, true-color, every-detail-honest images a buyer studies before spending real money. That is where a camera and a trained eye earn their fee. Then build the rest in-house. The lifestyle library and the multi-angle packshots get rendered at 99% fidelity, days per batch instead of weeks, regenerated on demand when a new collection lands. The render has to match the ship-to-customer product on material, color, hardware, and silhouette, but above that threshold it carries the contextual and angle layers that do not need a studio. What matters most at scale is not any single hero image. It is a consistent, normalized set across all 100-plus SKUs, the one-shoot look, every product reading like it came from the same brand on the same day. That consistency is the thing a piecemeal approach never delivers, and it is what an in-house pipeline holds by design. ## The real bottleneck On most large home-brand catalogs the constraint is not the ad budget. It is the photo budget. The photo budget gates the catalog refresh, the catalog refresh gates the conversion lift, and the whole chain stalls behind a line item nobody questions. Brands keep pouring money into traffic while the pages that traffic lands on show stale or thin imagery. Breaking that bottleneck is the point of the split. Keep the photographer for the heroes, take the library in-house, and the refresh stops being a $50K event you dread once a year. It becomes a batch you run whenever the catalog changes. The full reasoning is in [the catalog-photo bottleneck post](/blog/catalog-photo-bottleneck-shopify-home-brands/), and the broader method lives in [the product-photography library](/product-photography/). If you want me to map this split against your own catalog size and refresh cycle, [tell me what you are working on](/contact/). ## How do I get lifestyle product photos without a studio shoot? URL: https://connercrowe.com/product-photography/lifestyle-product-photos-without-a-studio-shoot/ Published: 2026-06-18 Answer: For a full catalog, the render pipeline wins. I stage a brand's real product photos into styled rooms at 99 percent fidelity, batch them in days, and hold the marginal cost under four dollars a scene. The non-negotiable on any path is that the product in the scene matches the product that ships, or returns eat the savings. ## The three paths, and when each one fits A studio booking is one way to get lifestyle photos. It is not the only way, and for a catalog past a hundred SKUs it is the slowest and most expensive way. Three production methods get a product into a styled room without a photographer, a set, or a shoot day. Each one earns its place under different constraints. The render pipeline stages the brand's existing product photography into styled rooms. The product is the brand's real product, dropped into a generated environment that matches the look the brand wants to sell. A batch of scenes turns around in days instead of the weeks a studio shoot takes to schedule, light, and edit. The marginal cost runs under four dollars a scene once the look is set. This is the path I run for home brands, because it holds consistency across a large catalog where a shoot day cannot. Flat-lay and at-home styling is the cheap manual path. Shoot the product you already have in a real room, with a phone and natural window light. It costs almost nothing and works for a handful of hero products. It breaks down across a catalog. Light shifts between sessions, surfaces differ room to room, and forty products shot over six afternoons read as forty different brands instead of one. Borrowed-context compositing pulls a product cutout onto a stock or generated background. It is the least reliable of the three. The lighting on the cutout rarely matches the lighting in the borrowed scene, and the result drifts off-brand fast. It can fill a gap for a single placement. It does not hold a catalog together. ## The fidelity bar every path has to clear The method matters less than the standard it meets. The product shown in the lifestyle scene has to match the product that arrives in the box. I hold that to 99 percent fidelity: the same finish, the same hardware, the same proportions, the same color under the same light. A scene that flatters a product the customer does not receive does not save money. It moves the cost downstream into returns, and returns cost more than a shoot ever would. This is where the render pipeline separates from the cheaper paths. At-home styling and compositing both introduce drift the moment the catalog scales, because nobody is enforcing a fixed reference. The render pipeline enforces it by construction. The input is the real product photo, so the output cannot wander away from the real product. You can see how that holds across a working catalog in [the production exhibit](/for-home-brands/). ## Locking the look so new SKUs match A catalog is not finished when the first batch ships. New products get added, and a render of a new SKU has to sit next to the existing set without reading as a different brand. That only works if the brand look is locked first: the room style, the palette, the light direction, the staging rules written down and reused. Lock the look once, and every future SKU inherits it. Skip that step, and the catalog fragments the same way a series of one-off shoot days would. For one or two hero products, a phone and a window will do. For a catalog that has to stay consistent and keep growing, the render pipeline is the method that holds the bar at the lowest marginal cost. More of the production logic lives in [the product-photography library](/product-photography/). If you are weighing this against a studio quote for your own catalog, [tell me what you are working with](/contact/) and I will point you to the path that fits. ## How many product photos should a product page have? URL: https://connercrowe.com/product-photography/how-many-product-photos-per-pdp/ Published: 2026-06-18 Answer: Roughly 6 to 8 photos for a considered home purchase: one lifestyle hero, four white-background angles, and one or two detail or scale shots. Each image answers a specific buyer question about depth, edge, joinery, surface, or scale. A cheap commodity SKU needs fewer. ## The working minimum is 6 to 8 images For a considered home or furniture purchase, the floor is roughly six to eight images per product page. That breaks down as one lifestyle hero, four white-background angles, and one or two detail or scale shots. The number is not arbitrary. Each image exists to answer a question the buyer would otherwise have to ask, and on an ecommerce page there is no one to ask. Here is what each slot earns: - **Lifestyle hero.** One scene that places the piece in a room and sets the tone. It answers the first question a buyer has, which is whether the thing fits the life they imagine. - **Four white-background angles.** A three-quarter hero that shows form, a straight front elevation that shows true proportion, a top-down that shows surface and layout, and an end profile that shows depth and edge. These strip out styling and let the buyer read the object itself. - **One or two detail or scale shots.** A texture close-up for the surface and material, and a hand or a known object in frame so the buyer can size the piece without doing math against a spec line. Every unanswered question is a reason to bounce, or worse, a reason to buy and return. A return on a $1,400 table costs far more than the photo that would have prevented it. ## The four angles are per-product, not a template The four-angle set is a starting checklist, not a stamp you apply blind. A feature only exists for the customer from the angle that reveals it. A hidden drawer is invisible until a shot shows it open. A cable channel on the back of a desk does not exist on the page until a photo finds it. A specific leg join that signals the build quality is just a claim in the copy until an angle proves it. So the rule is to shoot the angles the product has, not the angles the template lists. Walk the piece, find the features a buyer is paying for, and make sure one frame reveals each one. Sometimes that means a fifth or sixth angle. Sometimes the top-down adds nothing and the budget moves to a second detail shot. The checklist is a prompt to think, not a quota to fill. The full reasoning lives in [four angles every PDP needs](/blog/four-product-angles-every-pdp-needs/). ## When fewer is the right call The 6-to-8 floor is for a considered purchase, where the buyer is spending real money and weighing the decision. A $40 commodity SKU does not earn that production. The buyer is not zooming into the joinery on an impulse item, so two or three clean shots carry the page. Spending studio time on the cheap SKU is waste, the same way under-shooting the expensive one is. Match the image count to the stakes. A $1,400 table needs every angle it can use. The $40 accessory does not. More on building the full set the right way is in [the product-photography library](/product-photography/). If you want me to map the shot list against your own catalog and price points, [book a call](/contact/). ## How much does ecommerce product photography cost in 2026? URL: https://connercrowe.com/product-photography/ecommerce-product-photography-cost-2026/ Published: 2026-06-18 Answer: Traditional studio product photography runs $25 to $150 per image in 2026. A full lifestyle shoot for a 150-SKU furniture catalog quotes $40K to $60K over an 8 to 10 week timeline. An in-house render pipeline now produces lifestyle scenes at 99 percent product fidelity for under $4 per finished scene, in days. ## The numbers, by photography type Traditional studio product photography in 2026 runs $25 to $150 per finished image. The spread depends on retouching depth, the number of angles, and whether a stylist is on set. Freelancers quote lower, but the consistency drops with them. Lighting shifts between shoots, white balance drifts, and a 300-SKU catalog ends up looking like it was shot by four different people across six months. Lifestyle photography is the expensive line item. A full lifestyle shoot for a 150-SKU furniture catalog quotes $40K to $60K, and the bid comes with an 8 to 10 week timeline. That covers set builds, props, location or studio rental, a crew, and post. For a furniture brand on Shopify launching a season, the dollar figure stings less than the calendar. The catalog cannot go live until the photography lands. The 2026 shift is the render pipeline. An in-house pipeline produces lifestyle scenes at 99 percent product fidelity for a marginal cost under $4 per finished scene, in days instead of months. The product geometry, material, and finish hold true. The room around it gets generated. That changes the budget conversation from a five-figure shoot to a per-scene unit cost that rounds to nothing. ## The real cost question is per-catalog, not per-image Per-image pricing is the wrong frame. A $40 image looks cheap until you multiply it across 150 SKUs at four angles plus a lifestyle scene each. The catalog is the unit that matters, and the timeline is the cost most founders underprice. The studio path's delay is usually the disqualifier, even when the dollar cost is equal. An 8 to 10 week shoot means the catalog is dark for a quarter. Products that could be selling are sitting in a queue waiting for a set to get built. I have watched a brand miss a full selling season because the lifestyle photography was the bottleneck, not the inventory. That lost quarter does not show up on the photographer's invoice. It shows up on the P&L. Hero product photography still gets shot traditionally. Two or three definitive shots per SKU, the ones a buyer zooms into on the product page, earn the studio cost. Those are the images where fidelity has to be perfect and trust is on the line. Everything past that, the lifestyle scenes that set context and fill out a collection page, is where the render pipeline replaces the five-figure shoot. The catalog-photo bottleneck I have documented for [home brands on Shopify](/blog/catalog-photo-bottleneck-shopify-home-brands/) is almost always the lifestyle layer, not the hero shots. ## How to budget it in 2026 Split the budget in two. Fund traditional photography for the hero shots, two or three per SKU, and price that at the $25 to $150 per image range. Fund a render pipeline for the lifestyle layer, and price that at the per-scene marginal cost, which lands under $4 once the pipeline is calibrated to the product. The math favors the split on both axes. The dollar cost drops because the expensive lifestyle shoot gets replaced. The timeline collapses from weeks to days, which is the variable that decides whether a catalog ships this quarter or next. For a 150-SKU catalog, that is the difference between a $50K line item with a 10-week wait and a hero-shot budget plus a render run that finishes in days. More on the full approach lives in [the product-photography library](/product-photography/). If you want me to map the split against your own catalog and selling calendar, [book a call](/contact/). ## Is AI product photography good enough for a Shopify store? URL: https://connercrowe.com/product-photography/ai-product-photography-good-enough-shopify/ Published: 2026-06-18 Answer: Yes, above a 99% product fidelity threshold, and no below it. The render has to match the real product on material, color, hardware, stitching, and silhouette. Use AI for lifestyle and contextual scenes. Shoot the two or three definitive hero shots traditionally. Below that threshold, AI imagery costs more in returns than it earns. The honest answer has a line in it. AI product photography is good enough for a Shopify store above a fidelity threshold, and it is a liability below it. The deciding question is not whether the image looks impressive. It is whether the rendered product matches the product that ships to the customer. ## The 99% fidelity threshold I hold AI product imagery to 99% product fidelity. That means the render matches the ship-to-customer item on material and color, hardware, stitching, silhouette, and the brand's design language. A linen-weave render of a cotton chair fails. A walnut tone rendered as oak fails. A handle in the wrong place fails. Early generative tools missed this constantly. I watched a render change the fabric weave, shift the wood tone a few shades, and slim the proportions. The catalog looked great. Then the customer opened the box, saw something different from the page they bought, and felt cheated. Returns spiked. The image earned the click and lost the order. That is the cost of being below the threshold. Not a softer brand. Real money in return shipping and a dent in trust you do not get back. ## Three controls get you there Hitting 99% is not a prompt. It is a set of controls. First, a per-SKU product spec lock. Before anything renders, I write down the material, the color hex, and the dimensions for that SKU, then check the output against it. The spec is the referee, not my eye. Second, provenance metadata on every render. Each image carries a record of what it is, which SKU it represents, and how it was made. When something looks off later, I can trace it instead of guessing. Third, a brand constitution. A short document that defines what an on-brand scene looks like and what an off-brand one looks like. It keeps a batch of fifty images reading like one brand instead of fifty moods. ## Where AI belongs, and where it does not AI rendering belongs on the lifestyle and contextual layer. The styled room, the morning-light kitchen, the product in a believable setting. That is where it saves the most time and where small interpretive freedom does no harm. The two or three definitive hero shots still get shot traditionally. The straight-on, true-color, every-detail-honest images a buyer studies before spending real money. Those carry the purchase decision, so they get a camera. This is the same discipline I cover across [the product-photography library](/product-photography/), and it is the fix for [the catalog-photo bottleneck](/blog/catalog-photo-bottleneck-shopify-home-brands/) that stalls so many home brands. If you want a second set of eyes on where your catalog sits against this threshold, [tell me what you are working on](/contact/). ## Lifestyle photos or white-background photos: which does a product page need? URL: https://connercrowe.com/product-photography/lifestyle-vs-white-background-product-photos/ Published: 2026-06-18 Answer: A product page needs both. White-background packshots answer the spec question, proving edge, depth, and joinery from every angle. Lifestyle scenes answer the desire question, showing the piece at home. Lifestyle earns the click, packshots close the deliberation, and skipping either one stalls the cart. The two photo types fight different battles. When a store picks one and drops the other, it loses the half of the sale that photo was built to win. So the answer to "which does my product page need" is both, and the reason is that they do separate jobs. ## Packshots answer the spec, lifestyle answers the desire White-background packshots exist to prove what the buyer is getting. Clean backdrop, no styling, no distraction. The buyer scrolls them to confirm the piece is real and to read it. Multiple angles show the edge profile, the depth, the joinery, the back panel nobody photographs and everyone worries about. A packshot is the digital version of walking around the piece in a showroom and running a hand along the seam. Lifestyle scenes do the opposite job. They put the piece in a room and let the buyer picture it in theirs. A styled shot answers the question the spec photo cannot: what does this feel like in my space. For anything above roughly a $500 average order value, that lifestyle scene is the highest-leverage conversion asset on the page. It is what turns a browser into someone who wants the thing. ## Skip either one and the cart stalls Drop the packshots and you have desire with no proof. The buyer falls for the piece, then reaches for the detail that closes the decision and finds a styled photo where the spec answer should be. The doubt creeps in. The cart sits. Drop the lifestyle and a $1,200 sofa becomes a cutout floating on white. Technically accurate, emotionally dead. The buyer cannot picture it at home, never builds the wanting, and never gets far enough to care about the joinery. You closed an objection nobody had reached yet. The sequence is the point. A buyer scrolls the lifestyle shot to fall for the piece, then scrolls the packshots to confirm it is real and it fits. ## How to order them on the PDP Lead with the lifestyle hero. It earns the attention and starts the wanting. Then run the packshots below it, ordered to answer questions in the sequence a careful buyer asks them: full piece, then the angles that prove depth and edge, then the construction detail. Desire first, proof second. That ordering mirrors how the decision gets made. For more on the full set, see [the product-photography library](/product-photography/). The companion piece on packshots covers [four angles every PDP needs](/blog/four-product-angles-every-pdp-needs/) and why each one is doing work. If you want a second set of eyes on which photos your product pages are missing, [start a conversation](/contact/). --- # Answers: Wasted Ad Spend Hub: https://connercrowe.com/wasted-ad-spend/ ## Best practices for conducting an audit of my digital advertising account URL: https://connercrowe.com/wasted-ad-spend/best-practices-audit-digital-advertising-account/ Published: 2026-05-25 | Updated: 2026-08-22 Answer: A useful ad-account audit follows five principles: a fixed quarterly cadence, a snapshot of the account before anything changes, coverage across settings, data, structure, creative and measurement, findings written in plain English, and a hard split between the audit pass and the fixes that follow. Run the pass in a fixed order, tracking first, and score every finding in recoverable dollars. An audit is a measurement exercise. It answers one question: where is this account losing money, and how much. Everything below is how I run that measurement, in the order I run it, and what it costs when someone else runs it for you. If you are deciding whether to hire someone, the [Google Ads audit service and cost breakdown](/google-ads-audit-cost/) covers my $2,500 read-only review, the deliverable, and when the math supports paying for it. ## Principle 1: run audits on a fixed quarterly cadence The most common failure mode is auditing the account only when performance drops. By the time the numbers slip far enough to trigger an audit, the leak has usually been running for two or three months. A quarterly cadence catches the leak inside the quarter it starts. Four audits a year is enough on a mid-size account. Monthly is too often and produces audit fatigue without surfacing new findings. Annual is too slow and lets seasonal leaks compound. The quarterly slot also matches how most founders close their books, which makes the audit easier to schedule and easier to budget against. Pick a fixed day. The first business day of each quarter works. Put it on the calendar a year out so the audit is never a reactive decision when traffic dips. ## Principle 2: snapshot the account before changing anything Before the first finding is written down, capture the baseline. Export the campaigns view at ninety days, the search-terms report at sixty days, the conversions table at thirty days, and the account settings page. Save the four exports in a dated folder. The reason is simple. Three weeks after the audit, when a campaign is performing better or worse, the question that matters is what changed. Without the snapshot, the question is unanswerable. With it, the audit becomes a reference document the account gets measured against for the next quarter. A founder who skips the snapshot loses the ability to attribute future results to the audit findings. The audit then becomes folklore instead of evidence. ## Principle 3: scope the audit across all five layers A useful audit covers settings, data, structure, creative, and measurement. Skipping a layer is the second most common failure mode after skipping cadence. Settings means the account-level configuration. Conversion goals, attribution model, location targeting, network expansion settings, brand exclusions. Data means the integrity of the conversion column and the agreement between platform and analytics. Structure means how campaigns, ad groups, and keywords are organized. Creative means the ads themselves and the landing pages they point to. Measurement means whether the reporting answers the question the business is asking. Most agency audits cover structure and creative because those are the visible layers. Settings and measurement get skipped because they are tedious. The largest findings usually live in the layers that get skipped. The [free 25-page Setup Audit PDF](/audit/) is the formalized version of this five-layer scope and is structured to force coverage across all of them. ## Principle 4: document findings in plain English The audit deliverable is a written document, not a screenshot dump and not a spreadsheet. Each finding gets one paragraph that names the leak, the dollar exposure, the fix, and the expected lift. A founder reading the audit six months later should understand each finding without opening the platform. Plain English forces clarity. A finding that cannot be written as a single paragraph is usually a finding the auditor does not fully understand. Writing the audit out also surfaces contradictions, which is where the bad findings get removed before they reach implementation. Length is not the goal. A useful audit on a mid-size account may surface twelve to twenty observations, but the decision memo should elevate three to five structural fixes across six to twelve pages. Each fix gets the supporting evidence, recoverable-dollar estimate, and implementation sequence, with larger exhibits referenced by filename. Extra pages have to earn their place by making a decision easier. ## Principle 5: enforce a hard split between audit and intervention The single most violated principle. The audit pass and the intervention pass are two different jobs on two different days. During the audit, nothing in the account changes. Findings get written down. The account is left alone. The reason is contamination. If the auditor starts pausing keywords and rewriting headlines during the audit, the snapshot is invalid before it is complete. The auditor also loses the ability to rank findings by severity, because half the leaks are gone before the full picture is assembled. The clean sequence is audit, document, prioritize, then intervene. The intervention happens against the ranked list, in spend order, largest leak first. On a high-volume DTC retail account I audited, the Meta dashboard reported one hundred fifty-eight thousand clicks at four cents each across the trailing ninety days. The temptation during discovery was to start culling campaigns because the click cost looked unreal. The discipline that mattered was waiting. Three days later the audit document showed the campaigns were optimizing for engagement and the click metric was counting post engagements rather than landing-page visits. The intervention that ranked first was not a campaign pause. It was a tracking and objective rebuild. Pausing during discovery would have buried the structural finding under noise. ## The order to run the pass in The five principles govern how the audit is run. This is the order the steps go in. Budget an afternoon for a self-audit, or four to six hours on a mid-size account when nothing is documented. **Step one, verify the conversion signal (45 to 60 minutes).** Every number downstream is computed from the conversion column. Open Goals, then Conversions, and answer four questions. Which actions are set as primary, because primary conversions are what Smart Bidding buys toward. Is every call counted as a win, because a conversion rate above 30 to 40 percent on a lead account usually means misdials and spam are being counted. I have seen 82 percent on an account that was counting phone rings. Are the values real, meaning revenue numbers reconcile with the store or CRM inside roughly fifteen percent. Do browser and server events deduplicate against a shared event ID. Then compare three numbers over thirty days: the Google Ads conversions table, the GA4 key events report, and the Shopify or Stripe order count. Any gap above ten percent is worth explaining. A twenty percent gap usually means double-counting or a missing event. A negative gap, where Google Ads reports fewer conversions than the platform, usually means a broken tag or a consent-mode misconfiguration eating attribution. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the deduplication contract the rest of the audit depends on. This is not a rare edge case. In the twelve home-services accounts I benchmarked in June 2026, a third had conversion tracking that was inflated or missing entirely. One logged more conversions than it had clicks. Those owners had been making budget decisions on fiction. The full data sits in the [home services benchmarks](/home-services-paid-search-benchmarks/). If step one fails, stop and fix the signal. The rest of the audit reads through this lens. **Step two, audit structure (45 to 60 minutes).** Open the campaigns view at ninety days, sorted by spend descending, and ask whether the money is going where the strategy intends. Three patterns matter. Brand and non-brand mixed in one campaign, which inflates the apparent return on the non-brand side. A single Performance Max campaign carrying more than forty percent of spend with no audience signals, which usually means the algorithm is harvesting brand traffic and reporting it as prospecting. Ad groups holding more than twenty keywords, which means match types are competing inside the same group. Any of those on a campaign above ten percent of total spend is a finding. A clean structure has brand isolated, Performance Max bounded with audience signals and a brand exclusion list, and ad groups holding five to fifteen tightly themed keywords. **Step three, mine the search terms (60 to 90 minutes).** This is the step that pays for the audit on most accounts. Pull sixty to ninety days at the account level, filter for spend above one hundred dollars, sort by cost descending, and read the top fifty terms the way a stranger would. The leaks fall into three buckets: competitor brand terms the account is paying for without intent, generic informational queries that convert at a fraction of commercial intent, and match-type drift where a broad keyword pulled in queries unrelated to the product. Any single term above five hundred dollars with zero conversions over sixty days is a finding. So is any cluster of similar terms above two thousand dollars converting below half the account average. On an HVAC client running broad match without a negative list, ninety days of search terms hid eight thousand dollars of waste. The keyword view looked clean. The leak was one report deeper, where broad-match expansion was firing on competitor brand queries the original strategist never opened. **Step four, check audience signals and demographic skew (30 to 45 minutes).** Open the audience tab on the top three campaigns by spend. Two failure modes dominate: no audience signals on Performance Max at all, and signals attached but never reviewed, where a list built eighteen months ago still feeds a campaign whose buyer has shifted. Pull the demographic breakdown. Any single segment above thirty percent of spend converting below half the account average is a finding. **Step five, read landing pages against click cost (45 to 60 minutes).** Reports, Predefined Reports, Landing Page. Sort by clicks descending and read conversion rate, mobile speed score, and behavior in GA4. Any page above one hundred clicks converting below one percent is a finding. So is any page above five hundred clicks with a mobile speed score below six. Founders skip this step most often, because the fix lives outside Google Ads. The fix is also where the largest lift usually sits. On Shopify product pages I audit, moving the price above the fold, swapping a category-grid hero for a single-product hero, or rewriting the H1 to mirror the ad headline routinely moves PDP conversion rate by thirty to fifty percent inside a one-week test. **Step six, the settings that quietly leak (15 minutes).** Search partners and Display expansion turned on without a decision. Location settings on presence-or-interest instead of presence. Auto-applied recommendations enabled. Bid-strategy targets that contradict the goal set in step one. And the change history, which tells you whether the account is being managed or just billed. Write every finding down with a dollar estimate beside it, rank by recoverable dollars, and fix from the top. The [free Google Ads Setup Audit](/audit/) is a 25-page workbook version of this exact pass with scoring sheets, and it does not ask for your email. Working from the workbook instead of from memory takes about three hours instead of six, and skips no steps. ## What a free analysis has to cover to be worth the word There are a dozen free "grader" tools online. They score the account against a generic template and produce a PDF with a number on the front. The number means little because the template is generic. What an API scan cannot see: whether conversion actions are configured against the right pages, whether enhanced conversions are firing with a hashed email payload, whether the offline-conversion uploader runs on a cadence, whether Performance Max is cannibalizing branded search inside the asset-group reports. It also cannot see the business behind the account. A 4x ROAS on a furniture brand with a six-month repeat cycle is a different number than a 4x ROAS on a one-time-purchase supplement brand. The first is underbidding. The second is barely breaking even after refunds. A real free analysis covers four layers in order: campaign structure, conversion-tracking integrity, search-term and audience quality, and bidding-strategy fit. That last one gets skipped most. Target ROAS on a campaign with twelve conversions a month is statistically meaningless, and Maximize Conversions on a budget-capped campaign is a different campaign than the dashboard pretends it is. Three inputs make the analysis useful. Read-only account access, because screenshots hide the diagnostic context that lives one click deeper. The KPI the business steers on, because a 3x ROAS is excellent in one vertical and bankrupt in another. And three sentences of business context: what the product is, what the AOV runs, what the margin band looks like, and whether the business runs on first-purchase profit or lifetime value. ## Who runs audits, and what each tier costs Four categories of audit exist, and each catches a different kind of leak. **Free DIY workbooks.** A workbook makes the operator type the numbers in by hand, which is the moment most leaks become obvious. A tool that runs in the background while a founder ignores it does nothing. The [free 25-page Setup Audit](/audit/) is the workbook I run before I write a single recommendation on a paid review, paired with the [Wasted Spend Calculator](/calculator/) for a directional dollar figure. Cost: zero. What it misses: live anomaly detection and account-specific quality-score history. **Automated SaaS auditors.** WordStream Advisor generates a free Performance Grader that scores an account on quality score, click-through rate, account activity, impression share, and wasted spend in about a minute. It is a temperature check, not an audit. Optmyzr is the heavyweight, and its rule engine catches drift a manual review misses, from around two hundred ninety-nine a month. Adalysis is stronger on responsive search ad analysis. I use paid tooling on accounts above fifty thousand a month in spend, where the line item earns its keep. Below that, the free platform reports plus a fifteen-minute weekly cadence do the same work for nothing. What none of them catch: whether the account architecture matches the business, whether the conversion setup is double-counting, and whether the wrong campaigns are being scaled. Those are the expensive leaks. **Agency audit reports.** Most performance agencies offer a free audit as the front of a sales funnel. A junior analyst spends thirty to ninety minutes in the account, fills out a templated deck, and the senior team uses the findings as a pitch hook. Quality ranges enormously. A specialist shop can flag five-figure leaks in an hour. A generalist runs the same eighteen-point checklist on every account regardless of fit. The honest read is that an agency audit is a sales tool, which makes the incentives obvious: it leans heavy on findings that argue for a retainer and light on findings a founder could fix in an afternoon. Read the deck, take the three highest-impact findings, and judge the retainer math on its own merits. **Senior-consultant manual reviews.** Three to six hours in the account, a written diagnosis against the specific business model, and a prioritized fix list with no upsell attached. One to five thousand dollars for a one-time review depending on account size. The [audit pricing breakdown](/google-ads-audit-cost/) covers what the tiers cost across the market. On the real-estate law firm I rebuilt, the senior-review pass surfaced findings no grader flagged: broad-match keywords pulled from the rep's recommendations, conversion tracking firing on every form submit including spam, and generic ad copy fighting every other firm on the same headline. Restructuring around case type and rebuilding conversion tracking took spend down fifty percent and doubled signed-client signups inside ninety days. | Category | Example | Cost | What it catches | What it misses | |---|---|---|---|---| | Free DIY workbook | Setup Audit PDF (this site) | Free | Structural and strategic leaks | Live anomaly detection | | Automated SaaS | WordStream, Optmyzr, Adalysis | Free to $299/mo | Bid drift, match-type decay | Account architecture fit | | Agency audit | Templated discovery deck | Free with sales call | Obvious leaks, retainer-friendly fixes | Findings that lose the retainer | | Senior solo operator memo | One-time written diagnosis | $1K to $5K one-time | Structural calls, attribution gaps | Ongoing weekly cadence | Ongoing management is a separate purchase from the audit. Google's own Recommendations tab is free and updates daily, and it is the worst-aligned option on the list, because the platform earns more when the account spends more. Scan it weekly, apply the two or three items a human would have flagged anyway, and decline the rest. Agency retainers run two to ten thousand a month under one hundred thousand in monthly spend and start to make math sense above seventy-five thousand. Fractional consultants run fifteen hundred to four thousand a month for senior judgment without agency overhead, and fit accounts between fifteen and seventy-five thousand a month. Below thirty thousand a month, a one-off senior memo every six months beats every retainer on the list at a fraction of the cost. The gap between a dashboard and a diagnosis shows up fastest on accounts nobody has read. On a regional medical imaging account I audited, ninety days of Meta spend ran a little over sixty-six hundred dollars across nearly four million impressions. The surface numbers looked ordinary: half a percent click-through rate, a thirty-cent CPC, four hundred sixty thousand people reached. The finding was structural. No conversion actions were configured against the lead form, no Customer Match audiences were loaded, and the campaigns were optimizing for reach because nothing downstream gave the algorithm anything else to aim at. No grader flags that. Two paragraphs of a written memo do. ## What the first thirty days with an outside operator looks like A clean outside audit runs on a four-week shape. **Week one is access and scope.** Read-only access on each platform: MCC manager-level read on Google Ads, a Business Manager partner add at analyst role on Meta, an agency link with read permission on Microsoft Advertising. Conversion access is the part most founders miss. If the operator cannot see how conversions are configured, the audit catches symptoms and never reaches the source. Week one also includes the KPI alignment call, where the founder names the metric the business is measured on at the leadership level, and an hour of business context: what the brand sells, who buys, what the AOV and margin band are, and what changed in the last ninety days. **Week two is the diagnosis pass, read-only by design.** No campaign changes. The diagnosis covers structure, match-type discipline, conversion configuration, audience layering, Performance Max guardrails, attribution fit, and the cross-check between platform-reported conversions and the source of truth in Shopify or the CRM. On a Shopify baby and kids decor brand I work with, the week-two read showed three months of Meta spend just over a thousand dollars producing seven purchases at a blended 2.57x ROAS. In isolation those numbers pass the eye test. Read against the Google Performance Max campaigns on the same brand, it was clear Meta was capturing a small fraction of the buying signal while the founder had been told to scale it for a year. The waste was not inside Meta. The waste was that Meta had budget at all. **Week three is the memo.** A written document, three to five findings, ranked by recoverable dollars per month, each with the report it came from, the dollar figure, the proposed fix, and a directional expected lift. The ranking matters more than the count. A founder who tries to fix fifteen things at once fixes none of them. The memo also names what was checked and found clean, because a founder who only sees problems does not know what was tested. **Week four is intervention or handoff.** The operator implements, the in-house team implements, or the memo goes to the existing agency with implementation notes. All three are valid endings. A memo specific enough to name the report, the figure, the change, and the expected outcome is a memo an agency cannot argue around. Three red flags inside those thirty days. An operator who pauses campaigns during the diagnosis week is contaminating the baseline, and the memo becomes partly a story about their own changes. An operator who pushes a retainer before the memo lands is pricing the relationship ahead of the diagnosis. An operator whose findings all happen to require their ongoing involvement is selling the next engagement. ## Where this leaves you Cadence, snapshot, scope, plain English, change control. The principles travel across Google Ads, Meta, and Microsoft Advertising because they govern how an audit gets run, not what platform it runs on. The order is fixed: tracking, structure, search terms, audiences, landing pages, settings. Put the quarterly slot on the calendar a year out. Run the [free 25-page audit](/audit/) against your own account first, because the diagnosis is portable and you own it at the end. The [pricing breakdown](/google-ads-audit-cost/) covers what a paid review costs, and a [diagnostic call](/contact/) is the right move when the ranked list runs longer than what an in-house team can absorb before the next quarterly review. The rest of the leak categories live at [/wasted-ad-spend/](/wasted-ad-spend/). ## Best practices for optimizing ad account structure to reduce waste URL: https://connercrowe.com/wasted-ad-spend/ad-account-structure-best-practices-reduce-waste/ Published: 2026-05-25 | Updated: 2026-05-27 Answer: Five structural decisions reduce wasted Google Ads spend: segment campaigns by intent (branded, non-branded, generic, competitor), enforce one match type per ad group on tight accounts, split Performance Max asset groups by audience tier, scope budgets at the campaign level rather than pooling them, and adopt a naming convention that surfaces structure in every report. ## Why structure decides how much you waste Account structure is the chassis every other optimization rides on. A clean structure makes waste visible inside an hour of audit time. A messy structure hides waste under blended averages for months, sometimes years. The platforms do not care which structure you pick because their revenue rises either way. The fix is upstream of bidding, creative, and landing page work. These six decisions cover the structural choices that most often separate accounts running clean from accounts leaking thirty percent of budget. Read the [Wasted Ad Spend hub](/wasted-ad-spend/) for how the diagnostic signals connect. ## Decision 1: segment campaigns by query intent, not by product The default in most accounts is one campaign per product line or one campaign per service. That bundling collapses four intent tiers into a single ROAS number. Branded queries (someone searching the company name), non-branded category queries (someone searching the category with no brand in mind), generic top-funnel queries (someone searching a problem), and competitor queries (someone searching a rival) behave nothing alike. Branded converts at four to six times the rate of generic. Competitor traffic costs two to four times what branded costs and rarely converts at the same rate. The right pattern is one campaign per intent tier. Branded gets its own campaign with a capped budget and pure-exact or phrase match. Non-branded category sits in its own campaign with the bulk of the budget and conversion-based bidding. Generic and competitor run as separate test campaigns with strict CPA caps. On a ten thousand dollar monthly account, this single split usually reveals between fifteen and twenty-five percent of spend was being credited to the branded campaign while underwriting the loss on competitor and generic. Same dollars in. Honest read out. ## Decision 2: one match type per ad group on tighter accounts Mixed match types inside a single ad group create internal auctions. The broad keyword cannibalizes the exact match keyword, the system optimizes against whatever bid is highest, and the search terms report becomes hard to read. On accounts under twenty thousand a month, the surface area is small enough that this matters every week. The right pattern on smaller accounts is one match type per ad group. Exact match ad group, phrase match ad group, broad match ad group, each with the same keyword theme but different intent thresholds. Negative keywords flow up the funnel: exact match terms become negatives in the phrase ad group, phrase match terms become negatives in the broad ad group. The search terms report now reads cleanly per match type, and the cannibalization stops. Larger accounts above fifty thousand a month can sometimes run mixed match types inside Smart Bidding ad groups, but only with a weekly search terms review. Skip the review and the broad keyword eats the budget inside thirty days. ## Decision 3: split Performance Max asset groups by audience tier A Performance Max campaign with a single asset group treats every product and every audience the same. The campaign reports one ROAS, the algorithm picks its own winners, and there is no way to see whether the spend went against best-sellers shown to existing customers or against new SKUs shown to cold prospects. That is exactly how Performance Max budget pools end up over-indexing on retargeting that was already going to convert. The right pattern is asset groups split by audience tier. One asset group for prospecting with cold-only audience signals and no customer-match lists attached. A second for retargeting with site-visitor and cart-abandoner signals. A third, sometimes, for existing-customer expansion with purchaser lists. Each asset group gets its own creative set, its own product feed segment if the catalog supports it, and its own performance read. On a Shopify account running Performance Max, this split typically uncovers that the prospecting tier costs two to three times what the blended ROAS suggested, while retargeting was running well above target. The fix is reallocating budget, not killing the campaign. [Furniture brands running PMax](/for-home-brands/furniture/) hit this same asset-group split with one extra tier for catalog-heavy SKUs. ## Decision 4: separate geographies when service areas matter Service businesses with distinct service areas often run a single campaign targeting all of them. Cost per click in a dense urban market can run three to five times cost per click in surrounding suburbs. A blended campaign hides that. Worse, when one market has lower conversion intent than another, the campaign optimizes against the cheaper clicks regardless of close rate. The right pattern is one campaign per service area when close rates or unit economics differ. A roofing company serving a metro and three suburbs runs four campaigns, each with its own budget scaled to demand and capacity. A multi-location retail brand runs one campaign per distribution radius. The threshold to skip the split is when the markets have nearly identical CPC, conversion rate, and lifetime value. Most service businesses do not clear that bar. For Shopify brands shipping nationally, geographic separation matters less except where shipping cost or seasonal demand swings hard between regions. On [legal accounts with practice areas across markets](/for-service-brands/law-firms/), the segmentation tightens further because intake teams cannot handle blended jurisdictions. ## Decision 5: scope budgets at the campaign level, not the shared pool Shared budgets across campaigns sound efficient. They almost never are. A shared budget lets the platform shift spend toward whichever campaign it scores highest, and platform scoring favors volume and click-through rate over revenue quality. Branded campaigns with high CTR pull spend away from the non-branded campaign that produces incremental revenue. The right pattern is campaign-level budgets that match the strategic priority for each intent tier. Branded gets a capped budget sized to expected branded search volume, with overflow blocked. Non-branded gets the bulk allocation. Test campaigns (generic, competitor, new geography) get explicit small budgets that fail fast if performance does not clear the bar. Shared budgets belong only on portfolio bid strategies where two campaigns target the same intent and the same audience, which is rare in practice. Run the [ad spend calculator](/calculator/) to size each tier honestly against revenue targets. ## Decision 6: a naming convention that surfaces structure in every report The deepest cause of structural drift is unreadable account history. Six months into an account, the original builder has often left, and the campaign names look like Campaign 1, Campaign 1 (copy), Final Campaign, and Test 3. Audits take days instead of hours because nobody can tell what each campaign was supposed to do. The right pattern is a naming convention that encodes intent, geography, match type, and date in every campaign and ad group name. A workable format: Platform | Intent | Geography | MatchType | LaunchDate. So Google | NonBranded | Metro | Phrase | 2026-05 reads cleanly in any column. Pivot tables and Looker Studio reports group automatically. New media buyers onboard in an afternoon instead of a week. The convention itself costs nothing. The absence of it costs every future audit hour. ## Where to start Apply decision one first. The intent split surfaces where the real money is going inside the first week and makes the next five decisions easier to scope. Decision four matters only for service businesses with real geographic spread. Decision six pays back every audit cycle for the life of the account. Founders who want a senior pair of eyes on the structure instead of running the six decisions solo can [book a thirty-minute call](/contact/) or grab the [free audit workbook](/audit/) first. The same six-decision sweep is the first thing I check before any paid engagement. The first restructure usually reclaims between fifteen and thirty percent of spend on a typical six-figure account. ## How can I identify if my online ad campaigns are overspending? URL: https://connercrowe.com/wasted-ad-spend/how-to-identify-overspending-ad-campaigns/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: Five signals identify ad-campaign overspending: search-term reports with more than twenty-five percent irrelevant queries, branded search inflating reported ROAS, Display spend without conversion attribution, conversion rates outside benchmark bands, and cost-per-acquisition rising faster than average order value. Two appearing together is the threshold for a full audit. Four cross-channel checks then confirm the dollar figure. ## Why most founders miss the signals The ad platforms are built to hide overspending. Optimization scores reward more campaigns, more match types, more spend. The recommendations tab tells you what to add, almost never what to cut. By the time a founder asks the question, the leak has compounded for three to six months. Diagnose this the way a senior operator does. Pull five specific reports. Look for two of the five signals to appear together. That is the threshold for an audit. One signal in isolation is noise. Two together is structural. ## Signal 1: search-term reports leaking irrelevant queries Open the search terms report inside Google Ads. Filter to the last ninety days. Sort by impressions descending. Read the top one hundred queries the way a stranger would. If more than a quarter of those queries describe a product you do not sell, an intent you cannot serve, or a job seeker looking for employment at your company, broad match is teaching the algorithm what your business is not. The fix is not a longer negative-keyword list. The fix is structural: tighter match types, audience signals layered onto Performance Max, and a deliberate decision about where broad match is allowed to operate. A solo founder running a six-figure account often has zero search-term review cadence. That is the first place the money goes. ## Signal 2: branded search inflating your ROAS Branded search queries convert at four to six times the rate of non-branded search. If your reported ROAS lives in the 5x to 8x range and a meaningful share of your spend runs on campaigns that include brand terms, the math is misleading. You are paying Google for traffic that would have arrived organically. Test the read. Pause the branded campaigns for two weeks. Watch what happens to total revenue. If revenue holds within three percent of trend, the branded spend was buying you nothing. If revenue drops sharply, you have evidence that competitor bidding on your brand is real and the campaigns earn their keep. Either way, you know. ## Signal 3: Display and partner-network spend Performance Max and Display campaigns rarely surface the network breakdown unless you specifically ask for it. Pull the placement report and the network report. If a non-trivial share of spend is going to mobile-app placements, parked-domain networks, or generic Display inventory, that money is doing almost no work for a Shopify store or a service business. Exclude the worst placements explicitly. Trust nothing the platform auto-suggests on Display targeting. The default settings on a new Performance Max campaign let Google spend up to fifteen percent of the budget on inventory that has no commercial intent. That is a feature for Google, not for you. ## Signal 4: conversion rates outside the benchmark band Median ecommerce conversion rates sit between one-and-a-half and three percent across most home and furniture verticals. Service businesses with a clear lead form typically run between two and five percent on relevant traffic. Performance Max purchase rates on a well-tracked Shopify store should clear two percent at scale. The [vertical breakdown for furniture and decor brands](/for-home-brands/furniture/) covers the conversion benchmarks against a longer consideration window. A campaign-level conversion rate below half a percent on traffic that looks relevant points at a landing-page problem, a tracking problem, or a match-type problem. A rate above eight percent on a high-volume campaign almost always means branded overlap or a de-duplication failure between the browser pixel and the conversion API. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the de-duplication contract in detail. If your numbers do not line up with Shopify, that document is the first place to look. ## Signal 5: CPA climbing while margin holds flat Cost-per-acquisition climbs over time in most paid accounts. That is not waste on its own. It becomes waste when CPA climbs faster than average order value, contribution margin holds flat, and the account manager tells you to trust the algorithm through the worsening trend. The fix is not more spend. The fix is a redistribution of budget between campaigns and a fresh read on which audience segments are compounding. Customer Match lists fed from email and SMS often outperform prospecting Display by a multiple of three. Almost no account I audit is using that lever at full power. ## Three more signals that hide on the campaign card The five above surface in reports a founder opens. These three sit one column deeper and cost more than most bid changes. **Quality Scores below 5 on top-spend keywords.** Quality Score is a tax. A keyword scoring 3 pays roughly three times the cost-per-click of the same keyword at 8 for the same auction position. Drop toward a 2 and the penalty stretches past 4x. The math compounds across every click for the life of the campaign. Pull the keyword report, add the Quality Score, expected click-through rate, ad relevance, and landing page experience columns, and sort by cost descending. Any keyword in the top twenty by spend scoring below 5 is worth more than most bid-strategy work. The fix is ad copy aligned to the query and a landing page that names the query in the H1. Google funds this discount, which makes it the cheapest lever an operator has. **Broad match running without audience signals.** Broad match with no first-party audience data attached is a blank check. The match type expands the query universe to whatever Google decides is related, and without a signal telling the algorithm who matters, it spends against whoever clicks. Layer Customer Match lists from email and SMS, recent purchasers, and high-intent site visitors onto every broad-match ad group and every Performance Max asset group. Set them as signals, not exclusions. Bid strategy and match type are one paired decision, not two separate ones. **Retargeting frequency above eight a week.** Pull the frequency column on retargeting campaigns. Past eight impressions a week to the same person, the campaign has crossed from reminder to nuisance, and the threshold is lower than most operators assume. Cap frequency at six. Rotate creative on a thirty-day cadence at minimum. Segment the pool by recency, because a visitor from two days ago needs a different message than one from sixty days ago. Most retargeting waste is the same ad served too many times, not the targeting. ## Four checks above the platform Every ad platform reports its own performance. Google attributes generously, Meta attributes more generously, TikTok attributes most generously of all. A single-channel dashboard is a sales document. The honest read of efficiency sits above the platforms, in Shopify or the order-management system, against contribution margin. **Platform-claimed revenue against actual revenue.** Add platform-reported revenue from Google Ads, Meta Ads Manager, and TikTok Ads Manager for the last thirty days. Compare the sum to total Shopify revenue for the same window. If the platforms claim more than one hundred and thirty percent of real revenue, attribution overlap is inflating every channel's ROAS, and each platform is taking credit for the same orders. Blended ROAS, meaning total revenue divided by total ad spend, is the only number to manage against. **New-customer ROAS quarter over quarter.** Pull new-customer revenue from Shopify by month for six months and divide by ad spend by month. The trend matters more than the level. A declining new-customer ROAS while blended ROAS holds steady means returning buyers are masking acquisition inefficiency. The platforms are recycling existing customers through retargeting and Customer Match and reporting their revenue as ad-driven. Healthy acquisition holds new-customer ROAS flat or improving against a stable margin. **Click-to-conversion ratio.** Total clicks across all channels for ninety days, divided by total orders attributed to those channels in Shopify. Median ecommerce sits between thirty and forty-five clicks per purchase across home, furniture, and decor. Above fifty is structural. Above seventy points at one of three causes: the landing page does not match the ad, tracking is firing on engagement events the platform counts as clicks, or the targeting is pulling audiences with no purchase intent. **View-through inflation.** In Meta Ads Manager, switch the attribution window from the default seven-day click and one-day view to seven-day click only. If reported ROAS drops by more than twenty percent, the campaign is taking credit for impressions that never produced a click. On a brand with a working organic and email program, view-through credit pulls organic revenue into paid reporting. The seven-day click window reads honestly. Manage against that one. ## Two checks that settle it on search Search campaigns give you a cleaner answer than social does, because the query is the intent. **Score search-query relevance.** Export the top two hundred queries by cost over ninety days. Tag each one relevant or irrelevant to what you sell. Sum the cost of the relevant queries and divide by total cost. Accounts on tight match types score 85 percent and up. Broad-heavy accounts often score in the 50s and 60s. Anything under 75 percent is a structural leak rather than a tuning issue, and the fix is to tighten match types before adding negatives. A single ninety-minute pass on a 75-percent account often lifts the score above 90 inside two reporting cycles. **Compare blended CPA to an LTV-adjusted ceiling.** Blended CPA is total ad spend across all paid channels divided by new customers acquired in the same window. The ceiling is contribution margin per customer across the first twelve months. For a Shopify brand at a 60-dollar average order value, 45 percent contribution margin, and a 1.6x repeat rate, that ceiling lands near 43 dollars. For a service business at a 4,000-dollar average contract and 35 percent margin, it is closer to 1,400 dollars. Cross the ceiling and the account is buying customers at a loss even while individual campaigns look fine. One more note on the spend-to-revenue gap. Google will almost always report higher revenue than Shopify or the CRM, because it counts assisted conversions on a longer window. A gap under 25 percent is normal. A gap above 40 percent means Google is claiming revenue another channel produced. Trust the platform of record and recalculate ROAS from that number before touching a bid. ## Two accounts, read the same way On a regional community brand I work with, ninety days of Meta spend ran just under five thousand dollars and produced one hundred twenty leads. The blended CPL sits near forty-one dollars. On the surface, a healthy lead-gen account at a small spend tier. The signal scan still surfaces the question worth asking: how many of those leads closed into paying work, and what was the cost per closed engagement against the margin per closed engagement. The signals above tell you whether the dashboard is reading honestly. The CRM tells you whether the dashboard's honest read is profitable. On a home furnishings retailer I audited, ninety days of Meta spend ran twenty-four hundred dollars at a three percent click-through rate against a twenty-dollar CPM. Surface read: working account. The column that broke the read was conversions, which was empty, because no pixel events had ever been configured against checkout. Three months of spend at a workable CPM with zero downstream attribution. The fix took an afternoon. What it signalled was bigger: everything else in that account had to be retested once the data started reading honestly. ## What to do once you have spotted two signals Two signals together is the threshold. Run the [Wasted Spend Calculator](/calculator/) for a directional dollar estimate, then either work the [free 25-page setup audit](/audit/) against the account yourself, or send the account read-only and book a thirty-minute call. Fix them in order, because the order is load-bearing. Fix the search-term leak and Quality Scores often correct themselves. Fix the branded-search overlap and CPA reads honestly for the first time. Fix the attribution overlap and platform ROAS becomes a real number. Fix the tracking and the entire diagnostic moves from guesswork to math. A leak in one place almost always means a leak in three others. The whole library was built to walk through the rest of them. The [services overview](/services/) covers the structural fix at the same depth as my paid engagements, and [/wasted-ad-spend/](/wasted-ad-spend/) indexes every diagnostic. ## How do ad fraud and click bots affect my digital advertising budget? URL: https://connercrowe.com/wasted-ad-spend/ad-fraud-click-bots-budget-impact/ Published: 2026-05-25 | Updated: 2026-05-27 Answer: Ad fraud and click bot impact varies sharply by inventory. Google Search inventory sees less than three percent fraudulent clicks after platform filtering. Display, partner networks, and Performance Max app placements see ten to twenty percent fraud rates in the wild. The fix is platform-level, exclude app categories, deny known fraud placements, and audit invalid-click credits quarterly. ## The number you have probably heard is wrong Most fraud statistics circulating in marketing trade press come from vendors who sell fraud-detection tools. Those reports routinely claim that twenty, thirty, even forty percent of ad clicks are fraudulent. The number is shaped by the business model of the company publishing the number. The real picture is more useful. Google Search inventory, the keyword-matched results page, sees fraud rates well under three percent after the platform filters invalid traffic. Google's Display Network, Search Partners, YouTube placements, and Performance Max app inventory see fraud rates that climb into the ten to twenty percent range depending on category. Meta's audience network has similar issues. Facebook and Instagram feed placements themselves are reasonably clean. So the honest answer to "is fraud eating my budget" depends entirely on where the budget is running. ## What Google already does for free Google removes invalid clicks before they bill the account. The platform's [invalid traffic filtering](https://support.google.com/google-ads/answer/2549113) runs in two stages. Real-time filtering blocks obvious bot patterns at click time. Offline filtering reviews delivered clicks against more sophisticated patterns and issues invalid-click credits within sixty to ninety days. Those credits show up in the billing summary as "invalid activity adjustments." Most advertisers never look at the line. Open the billing tab, filter to the last twelve months, and read the credit totals. If the credit on a Display-heavy account is less than one percent of spend, the filtering is either catching very little or very little is getting through. Both are worth investigating. Meta does similar filtering but is less transparent about the credit mechanism. Invalid traffic on Meta is more often dealt with by excluding the audience network and by tightening placements to feed and stories. ## Where fraud lives in your account Three placement categories carry almost all of the real fraud exposure on Google Ads. [Search Partners](https://support.google.com/google-ads/answer/1722047) is the network of non-Google sites that show Google search ads. Quality varies wildly. Toggle it off in any campaign that does not need the marginal reach. The setting lives under campaign networks. Display Network placements on long-tail sites and apps generate the bulk of impression and click fraud volume. The standard fix is placement exclusion lists, not vendor tools. Pull the placements report, sort by spend, and exclude any mobile app bundle ID that does not have an obvious commercial relationship to your offer. Performance Max app placements are the modern version of the same problem. PMax distributes spend into mobile games and utility apps by default. The placement report is buried inside the campaign insights section. The [wrong-audience diagnosis walkthrough](/wasted-ad-spend/warning-signs-ads-targeting-wrong-audience/) covers the placement-exclusion process for Performance Max in detail. On the Sugar Babies Performance Max rebuild, the placement report showed a meaningful slice of spend going to mobile-game and utility-app inventory. Excluding the categories at the account level recovered budget that the campaign immediately redirected to Shopping inventory that converted at the campaign's target. The fraud-rate framing matters less than the placement-quality framing on most Shopify accounts. App placements are rarely fraud. They are usually just bad inventory dressed up as reach. ## How to spot fraud in your own data Five tells separate fraud from ordinary low-quality traffic. Click-through rates that are improbably high on a single placement, twenty, thirty, fifty percent CTR, are almost always automated. Real humans do not click ads at those rates. Session durations under two seconds at meaningful volume from a single source signal headless browsers or click farms. GA4's engagement-time metric makes this readable. Conversion rates of zero across hundreds of clicks from a placement that drives volume on no one else's account. If a placement converts for nobody, it is either fraud or terrible context. Either way, exclude it. Geographic patterns that do not match your buyer base. A US-only ecommerce brand seeing significant click volume from data center IP ranges in Vietnam or Brazil is paying for bot traffic. Device patterns skewed extremely toward older Android versions are a click-farm signature. Real users distribute across recent OS versions. ## The third-party tools worth paying for Three tools earn their fee for the right kind of account. None of them are necessary on a Search-only Google Ads account spending under twenty thousand a month. [ClickCease](https://www.clickcease.com/) works well for service businesses running heavy Google Search competition where competitor click fraud is a real risk. The tool blocks repeat clickers at the IP level via auto-applied IP exclusions. The value is highest in legal, home services, and locksmith verticals where competitive sabotage is documented. [Legal advertisers](/for-service-brands/law-firms/) face a sharper version of this, with competitor click pressure documented in practice-area auctions across most markets. ClickGUARD targets the same use case with deeper customization. The interface is more technical. The reports are more useful for accounts running multiple campaigns where the patterns need to be sliced finely. Lunio, formerly PPC Protect, is the option for accounts running significant Display, YouTube, or PMax spend. The platform handles invalid placement detection at scale and integrates with Google Ads to push exclusions automatically. For accounts with seven-figure annual paid budgets across networks, the math works. ## When the tools do not earn their fee A Shopify brand running Google Search and Shopping with under fifty thousand a month in spend will see almost no measurable ROI from fraud-detection tools. The fraud rate on that inventory is already below three percent. Paying another two to five percent of spend to a vendor to remove a fraction of that fraud is negative return. For [Shopify home brands](/for-home-brands/furniture/), the placement-settings discipline at this spend band looks different. The honest move for most accounts is the structural fix. Disable Search Partners. Exclude the mobile app placement categories on Display and Performance Max. Audit the invalid-activity credit line quarterly. Pull the geographic and device reports once a month. That stack covers ninety percent of the fraud exposure that matters at zero added cost. ## What to ignore Treat any fraud statistic from a vendor selling a fraud-detection product with skepticism. The same applies to whitepapers, industry reports, and webinars sponsored by those vendors. The number is rarely a lie. The framing is almost always engineered to sell software. Treat the noise from competitors claiming "my competition is bombing me with bot clicks" with similar skepticism. Real competitive click fraud exists in a handful of verticals. Most of the time, the bad ROAS comes from the structural problems covered in the [wasted-ad-spend diagnosis library](/wasted-ad-spend/), not from a malicious actor. The [Google Ads Setup Audit](/audit/) covers the placement and network settings that close most of the real fraud exposure in under an hour. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the analytics layer that makes the fraud diagnosis honest in the first place. A noisy data layer makes ordinary low-quality traffic look like fraud, which sends accounts down the wrong rabbit hole. Fraud exposure on most ecommerce accounts is a settings problem, not a software problem. Disable Search Partners. Exclude mobile-app placements on Display and Performance Max. Read the invalid-activity credit line on the billing tab once a quarter. That stack closes ninety percent of the exposure at zero added cost. If Display, YouTube, or PMax spend dominates the account and the placement report reads as untouched, the [services overview](/services/) covers the exclusion lists I apply on the first pass. ## How to diagnose low conversion rates in digital advertising efforts? URL: https://connercrowe.com/wasted-ad-spend/how-to-diagnose-low-conversion-rates-digital-ads/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: Four root causes explain low ad-conversion rates: landing-page mismatch with the ad, broken tracking inflating the denominator, audience-offer mismatch, and page-speed failures dropping mobile sessions before render. Diagnose in that order. Most low-conversion problems are landing-page or tracking problems first and bidding problems last. ## Start with benchmarks, not feelings Before touching a campaign, get honest about what a healthy conversion rate looks like for the account. Median ecommerce CR sits between 1.5 and 3 percent on home and furniture verticals. A service business with a clean lead form typically runs 2 to 5 percent on relevant traffic. Anything under 0.5 percent on traffic that looks relevant is a landing-page problem or a tracking problem, not a bidding problem. Most founders skip this step and start adjusting bids. Bids are the last lever to touch in a low-CR diagnosis, not the first. Pull the campaign-level conversion rate, the [landing-page conversion rate from GA4](https://support.google.com/analytics/answer/9216061), and the device split. If mobile CR is less than half of desktop CR, the diagnosis is already pointing at speed and layout before a single audience setting gets reviewed. ## Root cause 1: landing-page mismatch with the ad Open the ad. Read the headline. Click the ad. Watch what loads on a cold mobile session. If the hero promise on the page does not echo the ad in the first 1.5 seconds of scroll, the bounce is already baked in. Common mismatches I find in audits: - Ad promises a specific product, the landing page is a category grid with 40 options. - Ad promises a price point, the landing page hides price below the fold. - Ad targets a problem ("squeaky stairs"), the landing page leads with a brand story. - Ad targets cold traffic, the landing page assumes the visitor already knows the company. Use GA4's paths exploration to see where ad sessions drop. Then run Microsoft Clarity or Hotjar on the top three ad-destination pages. Watch ten session recordings each. The pattern shows up inside fifteen minutes. Cold visitors do not read past the hero unless the hero answers the question the ad implied. On the real-estate law firm rebuild, the original ad copy promised "Real Estate Lawyer Near You" against landing pages that walked through every practice area the firm covered. Cold paid traffic landed on a wall of unrelated case types and bounced. Rewriting ad copy and landing pages around specific case types (purchase disputes, contract reviews, title issues) cut cost per qualified lead by over sixty percent inside ninety days. The hero earned the click. On [legal accounts](/for-service-brands/law-firms/), the same pattern punishes harder because intent windows are short. ## Root cause 2: tracking is broken and you do not know it This is the root cause founders blame last and should blame first. A conversion rate of 0.3 percent on traffic that visually looks relevant is almost always tracking, not creative. Either the pixel is firing on the wrong event, the conversion API is double-counting and the platform de-duped the wrong direction, or the GA4 conversion definition never matched the Shopify thank-you page in the first place. Diagnostic order: 1. Open [Google Tag Assistant](https://tagassistant.google.com) on the live site. Walk a real purchase. Confirm one fire of the purchase event, not zero, not three. 2. Compare Shopify gross revenue against Google Ads conversion value and Meta purchase value for the last 30 days. If platform totals are more than 15 percent off Shopify, the tracking is the diagnosis. Stop tuning ads until that is fixed. 3. Check the GA4 conversion definition. A surprising share of accounts mark `add_to_cart` as the conversion event and forget about it. One more failure mode to rule out before trusting any engagement or bounce number: a page firing two `page_view` events on load will misreport engagement upward and hide the problem entirely. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the browser-pixel and conversion-API de-duplication contract in detail. If reported CR is suspiciously low across every campaign at once, the answer is in that document before it is in the ad copy. ## Root cause 3: audience-offer mismatch The campaign is reaching humans. The humans are not the buyers. This shows up two ways. On Meta, the audience is too broad and the offer is too narrow. A premium price point shown to a $30k-household lookalike will produce clicks and zero purchases. The clicks look like engagement. The denominator inflates. The CR collapses. On Google, the audience is too narrow and the intent is wrong. Branded search overlapping with a cold-traffic Performance Max campaign means the PMax campaign gets credit for buyers who would have arrived organically, while non-branded queries get dumped into broad match where the search-term report fills with irrelevant queries. The fastest confirmation is a paid-versus-organic comparison on the same URL. Pull the GA4 Landing page report under Engagement and read engagement rate for paid sessions against engagement rate for organic sessions on the identical page. A gap under 5 points means the page is consistent across sources and the reading is honest. A gap of 5 to 15 points is normal, because paid traffic skews colder. A gap above 15 points, say organic engaging at 65 percent while paid engages at 45, means the audience clicking the ad is not the audience the page was written for. The diagnosis is targeting or creative, and no layout change will fix it. On Vanity Resource, paid Shopping traffic was bouncing on the same product pages organic visitors engaged with cleanly. Organic visitors arrived on the right product. Paid visitors arrived from DIY-research queries, repair-service queries, and radically different price-point queries, because the feed and the negative-keyword library had never been cleaned. Once the feed and the negatives matched the buyer profile, engaged sessions climbed eighty-eight percent. The page never changed. Then read the surface directly. Pull the search-term report on Google and the placement report on Meta and spend twenty minutes reading them like a stranger. If a quarter of the surface area is wrong-fit, the audience is the diagnosis. ## Root cause 4: page speed and mobile render failures If mobile CR is below 40 percent of desktop CR, run [Google PageSpeed Insights](https://pagespeed.web.dev) on the top three landing pages. Largest Contentful Paint above 2.5 seconds on a 4G connection is dropping sessions before the page is visible. Cumulative Layout Shift above 0.1 is bouncing visitors who tap the wrong element while the page is still settling. Speed problems hide inside ad accounts because the platforms still report the click. The session counts. The conversion never had a chance. On Shopify product pages, Largest Contentful Paint over four seconds on a 4G connection drops roughly a third of mobile sessions before the hero loads. Compressing the hero image, deferring third-party review widgets, and disabling video-poster autoplay closes that gap inside one development cycle and moves mobile CR more than any audience tuning does. [Furniture brand operators on Shopify](/for-home-brands/furniture/) read these conversion patterns against a longer consideration window, and heavy-image catalogs get hit hardest. ## The landing-page audit: eight red flags Root cause 1 explains why the page fails. These are the specific failures, in the order I check them on a paid-traffic page. **1. The hero does not match the ad.** Open the ad in one tab and the page in another. If the noun the ad promised, a product, a price, or a problem, is missing from the H1 and hero subhead, the message match is broken. The test takes thirty seconds on the top three ads by spend. Fix by editing the page H1 to mirror the ad headline word for word on cold traffic, then run a one-week before-and-after on the same audience. On a roofing client, the landing page was being treated like a full website page: long scroll, multiple service descriptions, a team bio below the fold. The ad promised one specific service and the page answered with the company's entire menu. The fix was the opposite shape, a single above-fold viewport with the pain point named, the solution stated, one social-proof line, and one CTA. **2. Largest Contentful Paint over four seconds on mobile.** Covered above. Common causes are an uncompressed hero image over 500KB, a third-party review widget loading synchronously in the head, and a video poster set to autoplay at full resolution. **3. A form longer than five fields on cold traffic.** Every required field past the fifth cuts completion on first-touch traffic. Phone fields cut completion roughly in half on B2C lead forms. Forced account creation before Shopify checkout does the same to cart traffic. Watch ten Clarity or Hotjar recordings of visitors who reached the form and left, and note which field they abandoned on. If three of ten quit on the phone field, the phone field is the diagnosis. On lead-gen accounts I audit, demoting the phone field to optional or removing it on cold-traffic forms routinely lifts completion by twenty to forty percent. The lead-quality drop is smaller than the volume gain when the team is willing to filter on the follow-up call instead of on the form. **4. Mobile layout breaks at the hero.** Open the page on a real phone, not the devtools emulator. Look for a CTA that needs a scroll to reach, a hero image that crops the headline, a sticky header covering the H1, or an exit popup firing on a scroll gesture. If mobile CR is under half of desktop CR and the demographic split looks identical, the diagnosis is layout. **5. An ambiguous primary CTA.** "Learn more" is not a CTA on paid traffic. Neither is "Submit". The primary CTA tells the visitor exactly what happens next: "See pricing", "Book a 15-minute call", "Add to cart". Specificity moves conversion rate more than color or size. **6. Social proof buried below the fold.** A visitor from a Meta ad has no relationship with the brand and needs a trust signal before scrolling. Press logos in the header band, a star rating next to the H1, one customer quote before the first feature block. Screenshot the first viewport on mobile and desktop. If no third-party trust signal appears in either, the page is asking a stranger for money with nothing in hand. **7. Multiple CTAs competing for attention.** Pages that ask visitors to do three things end up with visitors doing zero. A newsletter signup next to a demo request next to add-to-cart splits the signal. One primary CTA above the fold and zero secondary CTAs. If a heatmap shows clicks scattered evenly across three buttons in the first viewport, the page has no primary outcome. **8. Friction before the buy decision.** Hidden price is the worst offender. A cold visitor who has to fill a form to see a number bounces at 70 percent rates on home and decor verticals. Forced account creation before checkout is the ecommerce equivalent, and a required phone field is the service-business one. The [home and decor playbook](/for-home-brands/furniture/) covers the price-display patterns that hold across home brands. Build a four-step funnel in GA4 exploration, landing-page view, CTA click, form start, form submit, or the ecommerce equivalent, and the step with the largest drop is the friction point. ## When conversion rate alone is too thin to read On lower-volume campaigns, conversion rate bounces around too much to diagnose from. Engagement rate fills the gap. Universal Analytics defined a bounce as a single-page session with no second hit. GA4 inverted it. [Engagement rate](https://support.google.com/analytics/answer/12253918) is the share of sessions lasting longer than ten seconds, firing a conversion event, or generating two or more page views, and bounce rate is now its inverse, hidden until a report adds it as a secondary column. The practical read is the same. A paid session that fails the engagement test was billed by the platform and wasted by the page. The threshold moved with the definition. Under Universal Analytics, a bounce rate under 40 percent on paid traffic was the band of health. In GA4, engagement rate above 50 percent on a paid landing page is the equivalent. Below 50 percent flags a waste pattern worth a diagnostic pass. Read it on paid traffic only. Reports, Acquisition, [Traffic acquisition](https://support.google.com/analytics/answer/9756891), filtered to Session default channel group equals Paid Search or Paid Social. Pull at least 28 days so the sample holds, because under 14 days on a single landing page hides too much daily noise to call. Then slice by URL in the Landing page report and read the top ten pages by paid sessions. A page under 45 percent engagement with three thousand paid sessions in 28 days is leaking spend. A page at 70 percent with the same volume is doing its job, and the diagnostic moves downstream in the funnel. ## What to do once you have isolated the root cause Diagnose in the order above. Landing page first because it is the cheapest fix. Tracking second because every metric downstream depends on it. Audience-offer third because that is a campaign-architecture decision. Speed fourth because it is the longest fix and the one most likely to need an engineer. Inside the page itself the order is the same shape. Message match first, technical second, friction third. Message match is a one-line edit with a one-week before-and-after. Render fixes usually move paid mobile engagement within seven days of landing. Friction fixes are page-level decisions a founder can make in a Shopify or Webflow editor inside a day. The [conversion math calculator](/calculator/) shows what a one-point conversion-rate lift is worth at current spend, which is how you decide which flag to fix first. If two of the four root causes apply at once, the [free 25-page setup audit](/audit/) covers the diagnostic path end to end. Three at once and a [diagnostic call](/contact/) beats another solo iteration. Conversion rate is the easiest metric to lie about and the hardest to fix without the right diagnostic order. A page that loses one buyer in five at the hero is unrecoverable through ad-side optimization. The fix lives on the page, not in the campaign. The hub at [/wasted-ad-spend/](/wasted-ad-spend/) walks the rest of the failure modes I see in account reviews. ## Is Performance Max wasting my budget? URL: https://connercrowe.com/wasted-ad-spend/is-performance-max-wasting-my-budget/ Published: 2026-07-02 | Updated: 2026-07-02 Answer: Judged on blended ROAS, probably not. Judged on its own numbers, often yes. Split Performance Max from Shopping and branded capture first. In two home-brand accounts I manage, PMax took 82 percent of spend and returned 12x while Shopping returned 61x. Different jobs, different verdicts. ## Blended ROAS is the number that hides the answer Most founders judge Performance Max on the account's blended return. That number averages two different jobs into one grade. Here is a real example from my own book. Across two home-brand Shopify accounts over ninety days, the blended return came out to 21x. Nobody looking at that number asks whether anything is being wasted. Split it by campaign type and the story changes. Standard Shopping took 18 percent of the spend and produced 52 percent of the revenue at 61x. Performance Max took 82 percent of the spend and produced 48 percent of the revenue at 12x. Shopping was harvesting demand that already existed. PMax was doing the expensive work of finding new buyers. The blended 21x hid a 5x gap between the two jobs. Neither number means PMax was failing. 12x prospecting is strong for home goods. The point is that you cannot know until you separate the jobs. ## Three signals the waste is real **The conversion signal feeding it is wrong.** Performance Max is an amplifier. It optimizes toward whatever conversion data you give it, so broken purchase values, duplicate events, or missing checkout tracking send it shopping for the wrong customers at full price. In my audits this is the most common root cause, and it is invisible from inside the campaign screen. I wrote up the checks in [the conversion tracking library](/conversion-tracking/). **It takes credit for demand you already owned.** PMax serves on branded queries and remarketing pools by default. If your branded search or Shopping campaigns went quiet after PMax launched, some of its reported conversions moved over from cheaper campaigns rather than being created. I covered the mechanics in [why Performance Max gets credit for Shopping conversions](/blog/why-performance-max-gets-credit-for-shopping-conversions/). **One campaign carries every product and audience.** A single PMax campaign with one asset group across a whole catalog gives the algorithm nothing to differentiate. Margins, price points, and intent levels all get averaged, and the budget flows to whatever converts easiest rather than what earns most. I run [a six-campaign PMax matrix](/blog/why-i-run-six-performance-max-campaigns-instead-of-one/) on catalog accounts for exactly this reason. ## How to run the split on your own account 1. Segment the last ninety days by campaign type. Note spend share and revenue share for PMax, Shopping, branded search, and non-brand search separately. 2. Pull the PMax search categories insight. If the top categories are your brand name and product lines you already rank for, PMax is harvesting, not prospecting, and should be judged against your harvest campaigns. 3. Compare each campaign type against its own job. Harvest campaigns should run several multiples above your blended target. Prospecting should clear your break-even ROAS, which is one divided by your gross margin, with room to spare. 4. Check the learning phase before judging anything. A new or heavily edited PMax campaign spends one to two weeks recalibrating, and cost per acquisition can run well above target during that window. ## What a healthy PMax looks like In the two accounts above, PMax prospecting ran between 8x and 17x depending on the brand, while the harvest layer ran far higher. If your PMax sits below break-even ROAS for thirty days or more with clean tracking and a stable campaign, that is waste, and the fix is structural rather than a bid change. ## The fix order Tracking first, structure second, creative third. Verify the purchase event, its values, and deduplication before touching the campaign. Then separate harvest from prospecting so each job gets judged and budgeted on its own numbers. Only then work the asset groups. Fixing them in the reverse order optimizes a campaign against data you cannot trust. ## Should I build SEO pages for misspellings of my brand name? URL: https://connercrowe.com/wasted-ad-spend/seo-pages-for-misspelled-brand-name/ Published: 2026-08-03 | Updated: 2026-08-03 Answer: No. Capture misspellings in paid, where you can bid the variant and negative out the collision at the query level. SEO gives you no query-level control, so a page built to rank for the correctly-spelled generic inherits every searcher who wanted a different product. Claim only the variants uniquely yours, using alternateName. Brands built on a deliberate misspelling all inherit the same problem. Flickr wanted flicker.com, could not buy it from the owner, and dropped the e. Lyft reads as a respelling of lift. Every name in that class has a correctly-spelled string sitting out there that people type instead, and the founder's instinct is to write content for each variant so the site catches the traffic. That instinct is close to right about where the traffic goes and wrong about which channel should catch it. ## The asymmetry that decides it Paid search lets you suppress a query. Organic does not. In a branded campaign you can bid the misspelled variant, then add the colliding term as a phrase negative so you stop paying for the searcher who wanted someone else. The negative is not optional cleanup, it is the load-bearing half of the setup, because [exact match no longer means exact](/wasted-ad-spend/typical-mistakes-keyword-matching-wasted-spend/) and close variants will pull the correctly-spelled string in on their own. What you end up with is a keyword you keep and a slice of its traffic you decline. A page on your site has no query-level equivalent. You can `noindex` it, or canonicalize it into another page, but those are on-off switches for the whole URL. There is no setting that keeps the page and declines the subset of searchers you did not want. If the page ranks for the correctly-spelled generic, it is served to everyone who types that string, including the majority who wanted a different company's product. That is the whole reason misspelling capture belongs in the campaign and not on the site. ## Check who owns the correctly-spelled string first This is the step that changes the answer, and it comes before any recommendation. Search the correctly-spelled version of your name and see what comes back. If an established company already owns that string in a different category, chasing it organically means competing for traffic that does not want you, and bidding it bare means paying for the same. In that case the unqualified term belongs in your account as a permanent negative rather than a keyword, and the only version worth bidding is the qualified long tail, where a category word deselects the other company's audience. Related: [common reasons for high CPC without sales](/wasted-ad-spend/common-reasons-high-cpc-without-sales/) covers the reverse case, where someone else is bidding on a brand string that is unambiguously yours and the auction price is the first symptom. ## What to do on the site instead The legitimate on-site fix is schema plumbing, not a content program. It is roughly two hours of work. 1. **Add `alternateName` to your Organization schema.** Google lists it as a recommended property in its [Organization structured data documentation](https://developers.google.com/search/docs/appearance/structured-data/organization), described as another common name your organization goes by. Claim only the variants uniquely yours, which usually means the spoken-then-typed split of your name and any spelling your own legacy material already used. 2. **Fix your own inconsistencies first.** Old policy pages and footers routinely carry a spelling the company abandoned. Those pages are naming a nonexistent entity and they work against consolidating you into one. 3. **Answer the spelling question once, visibly,** in a single line on a page that already exists. 4. **Write the rationale into a comment next to the schema,** or a future editor will helpfully complete the list and undo the point of it. Two things to avoid. Do not build one page per spelling. Google's spam policies call this [doorway abuse](https://developers.google.com/search/docs/essentials/spam-policies), defined as creating pages to rank for specific, similar search queries, with substantially similar pages named as an example. Thin variant pages sometimes do rank on a misspelling nobody else contests, which is exactly why the tactic tempts people, and that is a separate question from whether the pattern is one you want assessed across your whole site. Do not reach for `FAQPage` schema either. Google stopped showing FAQ rich results on 7 May 2026, removed the Search Console reporting and Rich Results Test support in June, and dropped the API support in August, so the markup now earns nothing in Search. That leaves only the semantic argument for adding it, and a name-variant question fails that too: `FAQPage` sets the page's `mainEntity` to the questions it lists, which misdescribes a page that is about your product. Leaving existing FAQ markup in place does no harm, so this is an argument against adding it, not a cleanup job. ## `alternateName` is an identity claim, not a keyword slot The field says "this entity is also known as this." Claiming a string you do not own invites entity confusion at best and a trademark argument at worst. Restraint is the discipline here. What teaches search engines your name variants is mostly off-site anyway. Retailer listings, directories, review profiles, and social handles spelling you consistently outweigh anything you can put in your own markup. ## Then stop guessing Once the brand campaign has run, its search terms report is the only real evidence of which spellings humans type. Every variant list written before that point, including the one you are about to write, is inference. Bid the variants you are confident in, read the report after thirty days, and let it correct you. If the report is already running and you cannot tell which brand traffic you are paying for twice, that split is one of the checks in the [free Google Ads audit walkthrough](/audit/). ## Strategies to improve ad copy relevance and reduce poor click-through rates URL: https://connercrowe.com/wasted-ad-spend/ad-copy-relevance-poor-click-through-rates/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: Ad copy fails two ways. It pulls the wrong buyer, which shows up as falling AOV, shrinking new-customer share, weak ninety-day cohort LTV, informational search terms, and price-objection tickets. Or it earns too few clicks, which the relevance levers fix: keyword verbatim in headline 1, a specific hook in headline 2, intent-mirrored descriptions, and fifteen RSA assets. ## Why ad-copy relevance moves CPC Quality Score is built from three inputs: expected CTR, ad relevance, and landing-page experience. Two of the three live inside the ad copy itself. A keyword scored at 5 on relevance pays roughly the same auction price as a competitor scored at 8 while sitting a position lower on the page. The copy is the cheapest fix in the account because no bid change is required to move the score. CTR is the second-order effect. Google rewards ads that earn clicks at or above the predicted rate for the auction. A relevant headline lifts CTR, which lifts expected CTR on the next auction, which lowers CPC. The compounding works in both directions, and a poorly written ad locks the keyword into a worse price for weeks. Copy fails in two ways, and they need different fixes. Copy nobody clicks is a relevance problem. Copy the wrong people click is an attraction problem, and it costs more because those clicks turn into low-value orders that read as wins inside the platform. Diagnose which one you have before rewriting a headline. ## Signal 1: average order value drops on a specific ad Click-through rate and conversion rate can both look healthy while the basket size collapses. A creative that sells the cheapest SKU in the catalog will print conversions and starve revenue. The leading indicator is AOV segmented by ad, not by campaign. Pull the report from Shopify or GA4 with ad name as the dimension and average order value as the metric. The threshold for concern is a creative running ten percent or more below the account-wide AOV across at least fifty orders. Below that volume the number is noise. Above it, the copy is selling the entry-level product instead of the catalog. The fix lives in the headline and the primary image. Lead with a mid-tier or premium SKU price point in the visual, name the upgrade benefit in the headline, and drop the "starting at" language that anchors buyers to the cheapest variant. The [free 25-page setup audit](/audit/) flags every active creative whose AOV trails the account mean. ## Signal 2: new-customer share shrinks on an ad set A profitable ad set can lose its job over time as it stops finding new buyers and starts harvesting people who would have bought anyway. Meta and Google both report new-versus-returning splits at the campaign or ad-set level. Read the trend, not the absolute number. Set a baseline by averaging new-customer share across the trailing thirty days at the account level. Any ad set whose share falls more than fifteen percentage points below that baseline across a fourteen-day window is attracting the wrong audience. The copy is speaking to existing customers when the budget is supposed to find fresh ones. Rewrite the hook to address a first-time buyer concern: sizing, fit, shipping speed, return policy, brand provenance. Cut the loyalty language ("welcome back," "you'll love this again") and the in-group references that only an existing customer parses. Then watch the share rebuild over the next fourteen days. ## Signal 3: ninety-day cohort LTV trails the account average Some ads acquire customers who never come back. The damage hides for ninety days because it lives in the second-order purchase, not the first. The signal is cohort lifetime value pinned to the ad that originated each cohort. Build the report with three columns: first-touch ad, ninety-day repeat-purchase rate, ninety-day cumulative revenue per customer. The threshold for concern is any ad whose ninety-day LTV runs more than twenty percent below the account cohort average across a hundred or more acquired customers. The copy fix is filtering at the top of the funnel. Discount-led creative ("50% off," "lowest price ever") attracts buyers who came for the discount, not the brand, and they exit after the first purchase. Replace the discount hook with a quality, durability, or use-case hook. The acquired buyer pays full price more often and returns at a higher rate. The [Wasted Spend Calculator](/calculator/) shows the budget impact of a ninety-day LTV gap at typical reorder rates. ## Signal 4: the search-terms report leans informational On Google Ads the search-terms report is a transcript of who the copy is reaching. Commercial intent reads like "buy reclaimed wood vanity" or "reclaimed wood vanity for sale." Informational intent reads like "how to clean reclaimed wood vanity," "what is reclaimed wood," "reclaimed wood vanity reviews." Tag the trailing thirty days of search terms by intent. The threshold for concern is informational intent accounting for more than twenty percent of triggered queries across an ad group built for commercial intent. The copy is broad enough to pull in research-stage traffic that will not convert at full price. Tighten match types, add the informational stems as negative keywords ("how," "what is," "vs," "reviews," "guide," "tips"), and rewrite the description to gate the click. Lead with a price point, a stock status, or a buyer commitment cue. Researchers read past the gate and self-select out before the click costs money. For [home and furniture brands](/for-home-brands/furniture/), the copy patterns repeat with one extra gate: shipping lead time inside the description. ## Signal 5: price-objection tickets cluster on one campaign The support inbox is the last reliable lens on who the ads attracted. Tag every ticket with a price-objection field: "too expensive," "do you have a cheaper version," "can you match a competitor's price." Then map the tagged tickets back to the first-touch ad or campaign on the customer record. The threshold for concern is any campaign generating price-objection tickets at more than twice the account-wide rate across a hundred or more tickets. Lower volumes do not separate signal from random complaint. Above that line, the creative mispromised the price band. The copy fix is the on-creative price cue. Show a representative price in the image, the caption, or the headline. Replace aspirational lifestyle photography that suggests a lower price tier with product-on-white shots at the actual price range. The wrong-budget buyer self-selects out at the impression instead of at the support ticket. ## Reading the five signals together A single signal can mislead. AOV can drop because a seasonal SKU is cheap. New-customer share can fall because the budget moved to retention. LTV can lag because a cohort is young. Two or more signals firing on the same creative is the confirmation. AOV down plus LTV down on one ad is a discount-led hook acquiring transactional buyers. Informational search terms plus price-objection tickets on one campaign is copy that promised a research resource and a budget product at the same time. When four fire at once, that is the [diagnostic call](/contact/) worth booking. The sequence is signal first, hypothesis second, copy rewrite third, measurement window fourth. Skip any step and the rewrite reverts to taste. On a wellness brand I audited, ninety days of Meta spend ran a little over five thousand dollars at a sub-one-percent click-through rate against a $1.48 CPC. The signal was the gap: high enough impressions to read intent honestly, low enough CTR to confirm the audience was right and the copy was wrong. The hooks were aspirational. The buyer was looking for permission to spend, and aspiration does not give that permission. The rewrite path was price-anchored creative against the lifestyle set, tested on a controlled hold-out before any cross-campaign rollout. Once the diagnosis is in, the rewrite runs on seven levers. Work them in order. ## Lever 1: the keyword verbatim in headline 1 Headline 1 is the asset Google weighs most heavily for ad relevance. The keyword belongs there in the same form a searcher typed it. A query for "reclaimed wood vanity" matches an H1 reading "Reclaimed Wood Vanity" far more strongly than one reading "Handcrafted Bathroom Furniture." The second headline reads better as marketing copy and scores worse on the relevance axis. The implementation rule is one ad group per search theme with the theme keyword pinned to headline 1 position 1 inside the responsive search ad. Pinning is the only way to guarantee placement. Unpinned headlines rotate, and a strong relevance asset can land in position 3 where it carries less weight. The audit linked above flags any ad group where headline 1 does not contain the top-spend keyword. ## Lever 2: headline 2 as the differentiation hook Headline 1 confirms the searcher found the right product. Headline 2 answers the next question, which is why they should click your ad over the five others on the page. The hook lives in headline 2: the price band, the free shipping threshold, the warranty length, the inventory status, the geographic coverage. Generic differentiation kills CTR. "Quality Service" and "Best Selection" carry no information and read as filler. Specific differentiation lifts CTR by two to four percentage points on competitive terms. "Ships in 48 Hours" outperforms "Fast Shipping" because the timeframe is verifiable. Headline 2 is also where the price cue from Signal 5 belongs on search. Pin it to position 2 once a winner emerges from rotation testing. ## Lever 3: a description that mirrors search intent The first line of description 1 is the second-most-read piece of copy after headline 1. It should restate the searcher's intent in the language of the search itself, then offer the resolution. A query for "outdoor pendant lights waterproof" reads a description that opens with "Waterproof outdoor pendant lights rated for wet locations" and stops reading one that opens with "Illuminate your outdoor space with our curated collection." The rule is mechanical. Take the top three queries by impression for the ad group, find the noun phrase common to all three, and use that phrase inside the first eight words of description 1. The calculator linked above shows the CPC delta between a 5-relevance ad and an 8-relevance ad at typical auction volumes. ## Lever 4: dynamic keyword insertion with guardrails Dynamic keyword insertion drops the searcher's query into the ad headline at serve time. On a tightly themed ad group, the feature lifts CTR by two to three percentage points and saves the work of writing a separate ad per long-tail variant. On a loosely themed ad group, it inserts ungrammatical or irrelevant queries and damages both CTR and brand perception. The guardrail is theme tightness. Use DKI only when every keyword in the ad group describes the same product, the same intent, and the same buyer stage. An ad group that mixes "buy reclaimed wood vanity" with "what is reclaimed wood vanity" should not run DKI, because the buying query and the research query do not share a sensible headline. That is Signal 4 showing up as a structural problem rather than a writing one. Set a default value that reads cleanly when the insertion fails, and check the search-terms report monthly for inserted phrases that misfire. ## Lever 5: responsive search ad asset diversity A responsive search ad accepts up to fifteen headlines and four descriptions. The platform mixes them at auction time and learns which combinations earn clicks. Most accounts ship three or four headlines, which forces the algorithm to combine the same assets repeatedly and starves the system of learning data. The implementation rule is fifteen headlines per RSA covering five categories: keyword headlines (three or four), benefit headlines (three), proof headlines (two or three) such as review counts or warranty length, urgency headlines (two) such as inventory or shipping cutoff, and brand headlines (one or two). Three or four descriptions follow the same logic. ## Lever 6: sitelinks and callouts kept on theme Sitelinks and callouts extend the ad real estate and lift CTR by twenty to forty percent on the queries where they show. The lift only holds when the assets match the ad-group theme. Account-level sitelinks pointing at "About Us" and "Shipping Policy" pad the ad with low-relevance links and dilute Quality Score. Build sitelinks at the ad-group level for the top-spend ad groups. Each one should describe a sub-category of the ad-group theme. An ad group for "leather sofa" runs sitelinks for "Brown Leather Sofas," "Sectional Leather Sofas," "Top-Grain Leather Care," and "Sofa Delivery Timeline." Callouts add non-clickable proof points: "Free White-Glove Delivery," "30-Year Frame Warranty," "Showroom in High Point NC." Both asset types feed the relevance signal. ## Lever 7: auditing RSA asset ratings weekly Google rates each RSA asset as Best, Good, Low, Learning, or Pending. The ratings update as the algorithm collects impressions. Low assets underperform the alternatives and should be replaced. Open the ad view, select an RSA, and click Asset Details. Sort by rating. Any headline or description marked Low after a thousand impressions is a candidate for removal. Replace it with a new variation in the same category and re-check in two weeks. Three Low ratings on a single ad means the whole ad needs a rewrite against the lever stack above rather than incremental swaps. Asset ratings are the closest thing Google gives to a public Quality Score signal. They tell you whether the click is getting cheaper. The five signals above tell you whether the click is worth having. The [wasted-ad-spend library](/wasted-ad-spend/) covers the bidding, targeting, and landing-page layers that compound on top of copy that finally addresses the right buyer. ## Strategies to lower high cost-per-click without sacrificing conversions URL: https://connercrowe.com/wasted-ad-spend/strategies-lower-cpc-without-sacrificing-conversions/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: Lower CPC without losing conversions by working non-bid levers first: raise Quality Score on top-spend keywords, tighten broad match to phrase or exact, layer audience signals, day-part to converting windows, fix landing-page experience, and pivot to long-tail terms. Then check the bid strategy itself, because Target CPA on thin data overpays on every auction. ## Why lowering bids is the wrong first move The instinct on a high-CPC account is to pull the max-CPC slider down. That move almost always costs conversions. Lower bids cut ad rank, ad rank cuts impression share on the queries that convert, and the algorithm starts spending the remaining budget on cheaper, lower-intent inventory. The total click count looks fine. The conversion count drops by a quarter or more inside two weeks. The correct play is to lower the price Google charges per click without telling the auction to bid less. That is what every lever below does. Each one changes a non-bid variable that feeds into ad rank or into the quality multiplier on CPC, and the auction recalculates in your favor. Work them in order, because the first two carry more weight than the rest combined. ## Lever 1: improve Quality Score on top-spend keywords Quality Score is the largest non-bid lever on CPC. A score below 5 on a top-spend keyword routinely doubles the effective CPC compared with a score of 8. Google applies a quality-adjusted price at the moment of the auction, and the multiplier compounds as the score falls. Expected CPC drop: thirty to fifty percent on keywords that move from a 4 or 5 to an 8 or 9. The drop lands inside two weeks of the rewrite. Implementation. Open the keyword view in Google Ads, add the Quality Score, expected CTR, ad relevance, and landing-page experience columns, sort by spend descending. Pick the top twenty rows. Rewrite each ad to put the keyword in headline 1 and the first description line. Point the click to a landing page that contains the keyword in the H1 and the opening paragraph. Watch the score climb over the next ten to fourteen days. CPC follows down without any bid change. ## Lever 2: tighten match types on broad keywords Broad match in 2026 behaves like a separate campaign type. The algorithm expands to queries that share theme with the seed, and the expansion frequently lands on inventory the offer does not serve. CPC rises because the algorithm is paying auction-clearing prices for clicks the campaign should never have entered. Expected CPC drop: twenty to thirty-five percent on campaigns that demote the worst broad seeds to phrase match, with conversion rate rising at the same time. Implementation. Pull the search-terms report for the last sixty days. Any broad seed with more than a quarter of its impressions on off-offer queries gets demoted to phrase. Any phrase keyword with persistent off-offer queries gets demoted to exact. Add the off-offer queries themselves as campaign-level negatives. The campaign loses volume on the noisy inventory and keeps the converting volume, which is exactly the trade you want. ## Lever 3: layer audience signals on the campaign Audience signals are a directional steer for the algorithm. On Performance Max and broad-match Search, layering a converter list, a high-intent custom segment, or a remarketing list tells the bidder which auctions are worth paying for. The auction price on signaled traffic is often lower because the predicted conversion rate is higher, and the quality-adjusted CPC drops with it. Expected CPC drop: ten to twenty percent on signaled segments, with conversion rate roughly fifteen to thirty percent higher than the campaign average. Implementation. Build three audience signals per campaign: a converter list from the past 540 days, a custom segment built from competitor URLs and high-intent search terms, and a remarketing list covering thirty-day site visitors. Layer them as signals on Performance Max or as observation audiences on Search. Review the audience report monthly and prune segments with low conversion rate. ## Lever 4: day-parting and device modifiers Most accounts run twenty-four-hour, all-device schedules by default. The conversion data inside the account almost never supports that. A B2B account that converts between 9am and 6pm Monday through Friday is paying full CPC on evening and weekend clicks that convert at a fraction of the rate. A direct-to-consumer account on mobile-heavy traffic with a desktop-only checkout flow is paying full CPC for mobile clicks the cart cannot close. Expected CPC drop: fifteen to twenty-five percent on the windows or devices you down-modify, with overall account conversion rate climbing because the budget concentrates on the converting inventory. Implementation. Open the time segment and device segment in the campaign report. Pull ninety days of data. Down-bid windows and devices that convert at less than seventy percent of the campaign average. Use a negative bid adjustment of twenty to forty percent rather than excluding entirely, so the algorithm keeps the data feed for learning. ## Lever 5: fix the bid strategy when the bid strategy is the thing overpaying The first four levers change inputs the auction reads. This one changes who is doing the bidding. [Smart Bidding](https://support.google.com/google-ads/answer/7066642) sets a CPC for every auction from signals the platform thinks predict a conversion. When those inputs are thin, wrong, or pointed at the wrong event, the algorithm still has to bid, and the bid it picks is often two to four times what a manual review would have approved. The platform never reports that as overpayment. It reports it as cost. Expected CPC drop: ten to thirty percent on campaigns moved off a strategy the data does not support, with conversion volume flat or rising. Five conditions tell you the strategy itself is the leak. Each shows a different symptom, and the fix is rarely a tweak. It is a downgrade to a simpler strategy with a tighter cap until the data justifies a smarter one. **Target CPA running on thin data.** This is the most common overpay cause inside solo-founder accounts. The practitioner floor is thirty conversions in the last thirty days inside the campaign before tCPA learns reliably. Most accounts run it on campaigns producing eight, twelve, or twenty conversions a month, and the algorithm pays whatever CPC the auction demands. The symptom is a CPC that climbs week over week while conversion volume stays flat. Count the campaign-level conversion column for the last thirty days. Under thirty, tCPA is bidding blind. Switch to Maximize Conversions with a Maximum CPC bid limit at roughly 1.5x historical average CPC. The cap ceilings the learning and protects the budget while data accumulates. CPC corrects inside two weeks and conversion volume holds. **Maximize Conversions chasing a soft event.** The strategy optimizes against the count of whichever conversion action you selected. If that action is an add-to-cart, a form view, or a newsletter signup, the algorithm chases the easiest version of the event and pays inflated CPCs for clicks that produce it without producing revenue. The symptom is rising conversion volume on a soft event paired with flat or declining purchase volume. Check which actions sit in the Primary column. Demote soft events to Secondary so they report without influencing bidding, and promote only purchase or qualified-lead events to Primary. CPC corrects within two weeks. On a real-estate law firm rebuild, every form submit was marked Primary in the conversion library, including spam, bots, and partial-field submissions. The algorithm was optimizing toward whichever campaigns produced the most submits, regardless of lead quality. Demoting the raw form-submit event to Secondary and promoting only WhatConverts-qualified phone calls and validated form submits corrected the algorithm inside two weeks. CPC dropped. Lead quality lifted measurably per the intake team. For [law-firm Google Ads](/for-service-brands/law-firms/), the closed-case feedback loop is what makes that signal stick. **Target ROAS on inflated or unstable conversion values.** [Target ROAS](https://support.google.com/google-ads/answer/6268637) works only when the value side is stable and accurate. Values that include tax and shipping inflate the ROAS the algorithm thinks it is hitting, and values that swing month over month, common under fifty conversions, give it no stable target. The symptom is a CPC that spikes after every value adjustment or any month with an unusual order mix. Set values to the merchandise subtotal rather than the order total, and require fifty conversions a month before running tROAS. Below that, Target CPA on the merchandise value or Maximize Conversion Value with a bid cap performs better. **Manual CPC or Enhanced CPC with no recent calibration.** Manual CPC is the safest strategy on a low-volume account and overpays when the bids have not been recalibrated to current auction prices. A bid set fourteen months ago against a less crowded auction keeps winning expensive clicks long after the impression-share-lost-to-rank column says it sits above the clearing price. [Enhanced CPC](https://support.google.com/google-ads/answer/2464964) compounds it, raising bids up to thirty percent above the manual figure when the algorithm predicts a conversion. The symptom is a flat top-of-page CPC well above category benchmarks. Run a bid simulator review on the top twenty keywords by spend, bring manual bids in line with the simulator's curve, and turn eCPC off where the manual bid already sits at or above it. **Smart Bidding pointed at an event that fires too early.** This one hides inside an otherwise correct strategy. If the conversion tag fires on a thank-you page that loads whether or not payment cleared, the algorithm optimizes toward a population that includes failed checkouts, and CPCs rise because it thinks it is winning conversions that never closed. The symptom is a Google Ads conversion count exceeding the platform's order count by more than ten percent. The fix sits in the tracking layer. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the server-side conversion contract that prevents the drift, and CPC corrects on the next cycle once the tag fires only on completed orders. Implementation. Pick the strategy by conversion volume rather than preference, and move up the ladder only after the threshold is met inside the campaign itself, not the account. | Monthly conversions | Recommended strategy | Bid cap rule | Notes | |---|---|---|---| | Under 15 | Manual CPC or eCPC | Bid simulator review | Recalibrate quarterly | | 15 to 30 | Maximize Conversions | Max CPC at 1.5x historical avg | Cap protects budget while learning | | 30 to 50 | Target CPA | No cap, set tCPA at goal | Monitor 60-day signal | | 50+ with stable AOV | Target ROAS | No cap, set tROAS at goal | Watch value calibration | | Multi-campaign portfolio | Portfolio Strategy | Set at portfolio level | Use if campaigns share audience | When you move from Maximize Conversions to tCPA at roughly thirty conversions, set the target at the trailing thirty-day average CPA, not below it. Hold the setting fourteen days before any further adjustment, and lower the target by no more than ten percent per change. Aggressive tCPA cuts make the algorithm drop volume rather than chase efficiency. The error pattern to avoid is launching a new campaign on Target CPA because it worked on the mature campaign next to it. The new campaign has zero conversions, the algorithm has no signal, and the CPC defaults to whatever wins the auction. ## Lever 6: improve landing-page experience Landing-page experience is one of the three inputs to Quality Score, and it is the one most often ignored. A slow page, a page that does not name the product or service in the first viewport, or a page that fails the mobile usability test pulls the score down on every keyword that points to it. The auction charges more per click as a result. Expected CPC drop: ten to twenty percent on keywords pointing to a fixed page, with conversion rate often rising by a larger margin. Implementation. Test each landing page on a mobile connection throttled to 4G. Time to interactive over four seconds is a conversion killer. Move the primary offer into the first viewport. Match the H1 to the keyword that drives the click. Compress hero images, defer non-critical scripts, and remove third-party tags that have not earned their load cost. The [Wasted Spend Calculator](/calculator/) shows the dollar impact of the CPC drop once you plug in the post-fix average. ## Lever 7: pivot to long-tail keywords Head terms carry the highest competition and the highest CPC. Long-tail terms, four words and up, carry a fraction of the volume and often a third of the CPC, with a higher conversion rate because the searcher intent is more specific. The pivot is a structural change to the keyword list, not a bid change. Expected CPC drop: thirty to fifty percent on long-tail clusters compared with the head term they replace, with conversion rate often double. Implementation. Pull the search-terms report for the last ninety days and the keyword planner for adjacent long-tail terms. Build new ad groups around three to five long-tail clusters per product or service line, each cluster sharing a single landing page and a single ad set. Demote the head term to a lower-bid placeholder or pause it entirely if the long-tail cluster covers the same intent at a better price. ## How to sequence the seven levers Run the levers in the order above. Quality Score and match-type discipline carry more CPC weight than the other five combined, and they fix the inputs the later levers depend on. Layer in audience signals and modifiers next. Shift the bid strategy only after the conversion data has stabilized, and run the five-condition bidding review against the campaigns spending the top eighty percent of monthly budget rather than the whole account. Pull the long-tail pivot last, because it works best on top of an account that already has Quality Score and match types under control. Two of the seven CPC levers misallocated on the same account, or two of the five bidding conditions firing on a single campaign, is where the [free 25-page audit](/audit/) earns its time as the next read. With four firing at once, a [diagnostic call](/contact/) is faster than tuning solo. The [free 25-page setup audit](/audit/) maps each lever against the account and flags which ones carry the largest dollar impact for the specific spend profile. The [wasted-ad-spend library](/wasted-ad-spend/) covers the structural reasons CPC climbed in the first place, which is the input to picking the right levers in the right order. ## What are common mistakes that cause digital ad spending to go to waste? URL: https://connercrowe.com/wasted-ad-spend/common-mistakes-causing-wasted-digital-ad-spend/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: Seven recurring mistakes cause most wasted digital ad spend: broad match without negative keywords, conversion tracking that under-counts orders, accepting platform recommendations blind, combining branded and non-branded in one campaign, never testing the landing page, missing negative-audience layers, and skipping offline conversion imports. Fix them in order, tracking first, and the first three steps recover 60 to 80 percent of the leak. ## Why these mistakes survive in six-figure accounts Most of these mistakes look like sensible defaults when a founder or a junior media buyer sets the account up. The platforms reward each one with a higher optimization score, which is why they persist. Read them in order. Fix in order. The first three account for most of the leak in a typical Shopify or service-business account. ## Broad match running without a negative-keyword discipline Broad match is the default in any new Google Ads search campaign and the only match type Performance Max uses under the hood. It learns from your conversion data, your landing pages, and the queries that show intent. With no negative-keyword list and no review cadence, it learns the wrong lessons fast. The fix lives in the search terms report. Filter to the last ninety days, sort by impressions descending, and read the top one hundred queries. Push everything irrelevant into a shared negative-keyword list at the account level. Add a recurring calendar block, weekly for an account spending over fifteen thousand a month, monthly for everything else. The list is never finished. ## Conversion tracking that under-counts the actual outcome On Shopify, the default Google Ads tag and the default Meta pixel both miss orders. Browser-side pixels lose between fifteen and forty percent of conversions to ad blockers, iOS privacy settings, and Safari ITP. Server-side conversion tracking, properly de-duplicated with the browser pixel, closes most of that gap. The result of under-counting is that the algorithm optimizes against incomplete data. Campaigns that look weak are often the strongest. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the exact de-duplication contract between the pixel and the server event. If reported conversions sit more than five percent below Shopify orders, the tracking is the first thing to fix. Every downstream optimization depends on it. The pattern I see most across lead-gen accounts is tracking that feeds Google the wrong signal. Most accounts count every phone call as a conversion. Picture ten calls in a week. Four are wrong numbers. Two are hangups inside thirty seconds. Four are real prospects. Google optimizes against ten when only four were buyers. The fix is lead-tracking software that imports only the qualified calls into the conversion column. ## Accepting the recommendations tab without reading it The optimization score is a sales tool, not a performance tool. The recommendations tab will tell you to raise budgets, add broad match keywords, opt into Display expansion, and turn on auto-applied recommendations. Each one of those increases Google's revenue. Most of them do not increase yours. The fix is a standing rule: nothing from the recommendations tab gets applied without a documented reason. Turn off auto-applied recommendations under settings. Read each suggestion. Apply the ones that match the strategy. Dismiss the rest. A founder who applies every recommendation for six months ends up running a campaign structure that Google designed, not one that fits the business. ## Branded and non-branded queries inside one campaign A campaign that mixes brand terms and category terms reports a ROAS that is the weighted average of both. The brand terms convert at four to six times the rate of category terms, so the blended number looks healthy while the non-branded spend quietly loses money. The fix is structural. Split branded search into its own campaign with its own budget. Set non-branded search in a separate campaign with conversion-based bidding. Now the reported ROAS on each campaign tells the truth, and budget decisions become honest. This single change often surfaces the real source of waste inside the first week. ## Never testing the landing page Ad accounts get audited constantly. Landing pages almost never do. A campaign with a three-percent click-through rate and a 0.6 percent conversion rate is not a campaign problem. It is a landing page problem. Every additional dollar spent against that page is waste. The fix is a quarterly test rotation on the top three highest-spend landing pages. Hero copy, primary call to action, social proof placement, and form length are the four variables that move conversion rate most for service businesses. Product page templates, above-the-fold imagery, and shipping policy visibility are the equivalents for Shopify. Without a testing cadence, the conversion rate is whatever the page happened to do on launch day. The page patterns repeat across the [home and furniture vertical](/for-home-brands/furniture/), and for legal practices the lead-form variables that move the close rate live on the [law-firm side of the practice](/for-service-brands/law-firms/). ## No negative audiences layered onto prospecting Most prospecting campaigns spend a meaningful share of budget showing ads to existing customers, recent purchasers, and current site visitors. That spend lifts reported ROAS because those audiences convert from other sources anyway. It does not buy incremental revenue. The fix is a negative-audience layer on every prospecting campaign. Exclude purchasers from the last sixty to one hundred eighty days depending on repurchase cycle. Exclude email subscribers. Exclude high-intent site visitors who already saw retargeting. The prospecting number will look worse on paper for two weeks. The incremental revenue from the budget will be higher within four. ## Skipping offline conversion imports on lead-gen accounts Service businesses and high-consideration brands have a lead-form click, then a sales process that decides which leads become revenue. If only the form submission gets reported back to Google, the algorithm optimizes for cheap leads, not closed deals. The campaigns that produce the highest-quality leads often look the most expensive in the interface. The fix is offline conversion imports. Push closed-won values back into Google Ads at the keyword and campaign level on a weekly cadence. The bidding algorithm then optimizes against revenue, not lead volume. For a lead-gen account spending over ten thousand a month with no offline imports running, this is usually the single highest-impact change available. ## The account-layer settings that keep causing all seven Campaign settings control what one campaign does. Platform configuration controls what every campaign in the account believes is true. A wrong location toggle wastes one campaign's budget. A wrong conversion definition teaches every campaign to optimize toward the wrong outcome for as long as the configuration stands. Seven settings sit above the campaign layer and cause the mistakes above to keep returning after they are fixed. **The conversion library.** Open Tools, then Conversions, in Google Ads, or Events Manager in Meta, and list every active action with its primary or secondary status. Two leaks live here. Duplicate conversions firing for the same event, usually because the tag was placed once through Google Tag Manager and again through a Shopify-native pixel. And primary conversions that include email signups, scroll depth, or video views next to purchases, which teaches the model that a signup and an order are worth the same. Deduplicate first, then demote every non-revenue event to secondary. **The attribution model.** Google defaults new conversion actions to data-driven attribution. Older accounts may still run last-click. Meta defaults to seven-day click and one-day view. The leak appears when the model disagrees with how the buyer buys. A considered-purchase brand with a thirty-day research window undercounts paid social on last-click. A direct-response brand converting in-session overcounts Display on data-driven. Under three hundred conversions a month, data-driven does not have the volume to train accurately and last-click is the safer floor. **The conversion window.** Click-through and view-through windows are editable inside each conversion action. The longer the window, the more credit the platform claims for conversions that closed for other reasons. Pull the path-length report in GA4. If ninety percent of conversions close within seven days of the click, a thirty-day window is inflating reported conversions and training the bid model to chase credit. Shorten the window to the real close pattern, then watch reported conversions fall and cost per real conversion correct itself. **Account-level negative lists.** The shared library in Google Ads holds negative keyword lists that apply to every linked campaign. Most accounts have campaign-level negatives and nothing at the account level, so every new campaign launches with zero protection. Build one master list per account: competitor brands you have decided not to bid on, employment terms like jobs and salary, free-intent terms on a paid offering, and geography outside the service area. Apply it to every campaign by default, and set the Meta equivalent through placement exclusions and brand-safety filters. **MCC structure.** Shared resources, conversion imports, and analytics links flow through the manager account. A flat structure with no MCC means every account configures conversions, audiences, and linked products independently, which produces drift between accounts inside the same business. One MCC holding the Google Ads account, the Merchant Center account, and the GA4 property is the floor for a single brand. A parent MCC with sub-accounts per brand keeps one brand's conversion definitions out of another's. **The GA4 link.** Two errors recur. A property connected with auto-tagging disabled, which strips the gclid and breaks the session join inside GA4. And GA4 conversions imported into Google Ads alongside native conversions for the same event, which double-counts. Confirm auto-tagging is on in GA4 property settings, and confirm only one source per event is marked primary in the conversion library. **Customer-match refresh cadence.** Customer lists decay every week they sit static. New customers join the CRM, old customers churn, email addresses change. A list uploaded twelve months ago still appears in the targeting panel while its match rate and conversion rate have both halved. Sort the audience manager by upload date. Anything past ninety days needs a refresh. Anything past one hundred eighty days needs replacement, with the new list replacing the stale one rather than stacking beside it. None of these produce a red flag in the campaigns view. That is what makes them expensive. Run them on the first of every quarter, and run the customer-match refresh on the first of every month. ## The fix order, with what each step recovers Every fix below works in isolation for about a week. Then it breaks. Negatives get re-added by broad match. Audience signals get overwritten by the next platform recommendation. A landing-page rebuild fails to move CPA because the conversion API was double-counting the whole time. The sequence below is the order I work an account on intake. Each step protects the work of the next one. **Step one, tracking integrity. Four to eight hours, recovers 15 to 30 percent of the leak.** Walk the de-duplication contract in the [Tracking Stack reference](/frameworks/tracking-stack/) end to end. Verify the browser pixel and the conversion API fire the same event ID on every purchase, and that enhanced conversions pass hashed email through the data layer. Check the diagnostics tab in Google Ads and Events Manager in Meta for event-match quality below seven. Most accounts I open have one of three failures: the conversion API double-counting, the pixel firing twice on the thank-you page, or mismatched attribution windows between platforms. Verify by comparing platform-reported purchases against Shopify orders for seven days. The gap should sit inside three percent. If it does not, do not move to step two. **Step two, search-term negatives at the account level. Three to five hours, recovers 10 to 25 percent.** Read the top two hundred queries by spend over ninety days and push everything irrelevant into three account-level lists: occupational queries, informational queries that will not convert, and competitor terms you have decided against. For Performance Max, request account-level negatives through the rep or the API. Re-pull the report two weeks later. Irrelevant queries should sit below ten percent of impressions. **Step three, consolidate campaign sprawl. Six to ten hours, recovers 20 to 35 percent.** Most accounts carry three to six times as many campaigns as they need. Each one fragments conversion data, starves the algorithm of signal, and creates bid-strategy conflicts. Consolidate to one Performance Max campaign per margin tier, one Search campaign per match-type strategy, and a single Shopping campaign if Performance Max is not absorbing it. Pause every campaign that has not produced ten conversions in thirty days, and every ad group under a Quality Score of five that nobody has touched in ninety days. Branded search gets its own campaign with a hard daily cap. Display and Discovery get paused unless there is a written reason they exist. **Step four, layer audience signals. Two to four hours, recovers 5 to 15 percent.** With clean tracking, clean negatives, and a clean structure, the algorithm finally has something to learn from. Build Customer Match lists from the email and SMS file, segmented by purchase recency at zero to ninety days, ninety-one to three-sixty-five, and lapsed. Add cart abandoners from the last sixty days and high-AOV buyers where the data supports it. Upload with hashed email plus phone. Match rates should clear forty percent on Google and fifty percent on Meta. Lower than that points back at step one. **Step five, rebuild the highest-spend landing page. Eight to twenty hours, recovers 10 to 30 percent.** Match the headline to the ad's strongest copy variant, cut form fields to the minimum the offer needs, compress images, and defer any third-party script that is not load-bearing. Confirm the mobile PageSpeed score clears seventy, then watch conversion rate across fourteen days of stable traffic. A rebuilt page on relevant traffic should clear two percent for ecommerce and three percent for service. **Step six, realign bid strategy. One to two hours, recovers 5 to 15 percent.** Set target ROAS to the contribution-margin number rather than the platform-suggested number. Set target CPA on lead-gen to a third of customer lifetime value. Pull manual CPC off branded search only after step three has separated it. Fourteen days later, cost per conversion should sit inside ten percent of target. If it does not, something upstream is still wrong. ## Where to start Fix mistake two first. Tracking is the foundation everything else reads from. Mistake one is the largest dollar leak in most Search and Performance Max accounts. Mistake four reveals whether the reported numbers are real. Run the [Wasted Spend Calculator](/calculator/) before step one for a directional dollar estimate, and again after step three to see how much of the recovery has landed. Run the [free 25-page setup audit](/audit/) against the account to find which mistakes are live in the current build. If any step takes more than double its time estimate, the account has a deeper issue the standard sequence will not fix on its own. The accounts that stay clean treat the search-terms report and the tracking audit as recurring calendar items rather than one-time cleanups. Closing two of these seven changes the read on an account inside a month. A [thirty-minute call](/contact/) is the right move when the list runs longer than the calendar allows, and [/wasted-ad-spend/](/wasted-ad-spend/) indexes the rest of the diagnostics. ## What are common reasons for high cost-per-click without sales? URL: https://connercrowe.com/wasted-ad-spend/common-reasons-high-cpc-without-sales/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: Six reasons explain high CPC without sales: auction crowding from new entrants, competitors bidding on your brand terms, Quality Score below 5 on top-spend keywords, bid-strategy mismatch on thin data, audience-offer drift after broad-match expansion, and landing-page friction. Competitor pressure is the one most founders miss, and a defensive branded campaign at Quality Score 10 is the cheapest fix. ## Why CPC and sales drift apart CPC and conversion rate are governed by different systems. CPC is set by the auction. Sales are set by the offer, the landing page, and the match between the searcher's intent and what loads on the page. When CPC climbs and sales stall, one of those two systems has shifted, and the platform rarely tells you which one. The [Google Ads recommendations page](https://support.google.com/google-ads/answer/3448398) can suggest bidding, keyword, and ad changes, but those suggestions still need to be read against your actual conversion and margin data. Diagnose the gap in a fixed order. Auction first, account structure second, landing page third. Skip the order and the fixes contradict each other. ## Reason 1: auction crowding from new competitors Pull the [auction insights report](https://support.google.com/google-ads/answer/2579754) in Google Ads. Filter to the last ninety days against the prior ninety. Look at impression share lost to rank and the list of competing domains. A new entrant bidding aggressively on a keyword you used to own can lift your CPC by thirty to fifty percent without you changing a single setting. The fix is not matching their bid. The fix is a structural read on which keywords are worth defending at the new clearing price and which ones move to a different match type or a different campaign. Some keywords need to be ceded to the new bidder while you reallocate to terms with thinner competition. The bid simulator inside the keyword view shows the volume curve at each CPC. Use it before raising any bid. ## Reason 2: competitors bidding on your brand This is the cause most solo founders miss. A competitor does not need to outspend you to cost you money. They need to sit in the same auctions, raise the clearing price, and pull a fraction of the clicks you would have won at the old CPC. The damage shows up as rising average CPC, falling impression share, and a search-terms report carrying brand-mismatch queries. None of those signals carry a tag saying a competitor caused it, which is why most founders absorb the inflated cost for months before they identify the source. Start with the fastest check. Type your own brand name into an incognito search. If a competitor's ad sits above your organic listing, they are bidding on your terms. Your branded CPC, which historically ran at twenty to forty cents, can climb past two dollars in a month when a single competitor starts the campaign. Then confirm it in the data. Filter auction insights to your branded campaign for the last ninety days. The competing domains list shows every advertiser that has shared an auction with you on your own brand terms, and a new entrant with an overlap rate above 10 percent is the most common source of inflated branded CPC. ### What the trademark rules do and do not cover Google's [trademark policy](https://support.google.com/adspolicy/answer/6118?hl=en) permits bidding on a competitor's brand keyword in most regions. It does not permit using a registered trademark inside the ad headline or body copy. The two rules sit next to each other in the policy center and are routinely confused. Read the policy first, then decide which lever applies. If the competitor's ad copy carries your mark, use the [trademark troubleshooter](https://support.google.com/adspolicy/troubleshooter/14327740). The complaint may require registration details from the relevant trademark office and information about the ads at issue. It does not stop them bidding on the keyword. It stops them displaying the trademark, which drops their CTR, drops their Quality Score on the keyword, and routinely pushes their CPC above the level where the campaign stays profitable for them. Several competitors abandon the bid within six weeks of a successful complaint. ### The defensive branded campaign Three settings carry the defense. Exact-match coverage of the brand and the brand plus common modifiers. A Maximize Clicks bid strategy with a CPC ceiling set just above the historical branded CPC. An ad that names the product or category in the headline so Quality Score lands at 9 or 10. A 10 on a branded term routinely runs at a CPC of 0.20 to 0.50 even with a competitor in the auction, because Google charges a quality-adjusted price and a 10 against their 5 means you pay roughly half for the same position. Their economics collapse before yours do. Three changes lift the score to 10 on most branded terms. Use the brand in the H1 of the ad. Send the click to a landing page whose H1 contains the brand and whose first paragraph describes the offer the brand is searched for. Confirm landing-page experience reads as "above average" inside the keyword view. The score usually moves inside two weeks once all three ship together. On a service-business account, a competitor showed up in auction insights bidding on the brand name. Branded CPC climbed from forty cents to nearly two dollars inside a month. Launching a dedicated branded Search campaign with the brand in headline 1 and the landing page mirroring it pulled Quality Score to 10 inside two weeks. CPC dropped back to the thirty-to-fifty-cent range. The competitor stopped winning the position they had paid up to claim. On the [law-firm side](/for-service-brands/law-firms/), the same competitor-bidding pressure runs harder, with practice-area auctions repeating the pattern across most metro markets. The defense only reads cleanly if branded and non-branded keywords live in separate campaigns. Mixed into one, the branded clicks inflate the campaign's conversion rate, the non-branded clicks inflate the CPC, and the algorithm pools the data so it cannot tell which queries earned the conversions. Reporting looks healthy while spend climbs on the wrong terms. Branded keywords get their own campaign, budget, bid strategy, and conversion target. Non-branded keywords get a separate campaign with a different conversion threshold and a different ad. Once segmented, auction insights becomes readable and the question of which keywords pay for themselves has an answer. ### Defending versus ignoring, and the monthly cadence Not every competitor is worth defending against. One with a weak landing page, a 4 Quality Score on your brand term, and a CPC three times higher than yours costs more to participate than to ignore, because that auction drains their budget rather than yours. Defend when the competitor sits in position 1 above your organic listing, when their Quality Score on your brand term is 7 or higher, or when their ad copy converts a visitor away from your funnel. Ignore when their economics already punish them and your organic listing holds the top result on a brand search. Auction insights is the only place inside Google Ads that lists the advertisers in your auctions, and most founders open it once when they suspect a problem, then forget it exists. The advertisers shift every quarter, and a new entrant arriving in week one is invisible until the CPC damage lands in the campaign report eight weeks later. Pull it on the first business day of the month, filter to the prior 30 days, and note new entrants over a 10 percent overlap rate on every campaign. A spreadsheet with the date and the domain is enough to show which competitors are seasonal, which are permanent, and which abandon the auction after a single month. The [Wasted Spend Calculator](/calculator/) turns the CPC delta against a new entrant into a quarterly dollar figure when the answer needs to be sized for a decision. ## Reason 3: low Quality Score on top-spend keywords Quality Score is the lever most under-used by solo founders. It is also the lever with the largest CPC impact. A Quality Score below 5 on a top-spend keyword routinely doubles CPC compared to a score of 8. The platform charges a [quality-adjusted price on every auction](https://support.google.com/google-ads/answer/6167118), and the math is not subtle. Open the keyword view. Add the Quality Score, expected CTR, ad relevance, and landing-page experience columns. Sort by spend descending. Any keyword in the top twenty spend rows with a Quality Score under 5 is leaking money on every click. The fix is mechanical. Rewrite the ad to use the keyword in the headline. Send the click to a landing page that contains the keyword in the H1 and the first paragraph. Watch the score climb over two weeks. CPC follows down without any bid change. ## Reason 4: bid strategy mismatch Target CPA and target ROAS need a minimum conversion volume to learn. Google's own [Smart Bidding documentation](https://support.google.com/google-ads/answer/7066642) covers the data thresholds and the learning period, and the longstanding practitioner floor is at least thirty conversions in the last thirty days per campaign before tCPA learns reliably. Most solo-founder accounts run tCPA on campaigns with eight or twelve conversions a month, and the algorithm responds by paying any CPC it has to in order to chase a target it cannot reliably hit. The fix is to demote the bid strategy when the data is thin. Maximize Clicks with a CPC ceiling is the correct starting point on a new campaign or a low-volume one. Move to tCPA only after thirty conversions accumulate inside the campaign itself, not the account. Portfolio bid strategies that pool conversions across campaigns can hold the data threshold, but only if the campaigns share an audience profile. ## Reason 5: audience-offer drift after broad-match expansion Broad match in 2026 behaves like a separate campaign type. The algorithm expands to queries that share theme with your seed keywords, and the expansion frequently lands on intent that does not match your offer. Search-impression-share rises, CTR rises, CPC rises, and conversion rate collapses. The campaign looks busier and earns less. Pull the search-terms report for any broad-match campaign. Filter to the last sixty days. If more than a quarter of the high-impression queries describe a product variant you do not sell or an intent you cannot serve, the broad-match expansion has pulled the campaign away from the offer. The fix is a deliberate negative-keyword pass plus a downgrade of the worst seed terms to phrase match. Audience signals layered onto the campaign also reanchor the algorithm. ## Reason 6: landing-page friction killing the conversion A click that lands on a slow page or a generic homepage does not convert. The CPC was paid in full. The sale was lost on the storefront, not on Google. This is the failure mode that ad managers blame on the algorithm and that the algorithm blames on the offer. Test the landing page on a mobile connection throttled to 4G. Time to interactive over four seconds is a conversion killer. A product page that loads in two seconds and lists the product in the H1 converts at roughly twice the rate of a homepage that requires the visitor to find the product themselves. Match each ad group to a landing page that names the product or the service in the first viewport. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the conversion-API contract that confirms the sale fired correctly. A broken pixel reads as a landing-page problem in the data, and the fix is in the tracking layer instead of the storefront. ## What to do once you have spotted the cause Two of these reasons together is the threshold for a full audit. Run the [Wasted Spend Calculator](/calculator/) for a directional dollar estimate on the inflated CPC, then work the [free 25-page setup audit](/audit/) against the account or send it read-only for a thirty-minute review. If the monthly auction-insights pass surfaces a new entrant raising your branded CPC by more than 15 percent, that audit carries the defensive-campaign template I use to price competitors out of position one. The [services overview](/services/) covers the structural fix at the same depth as my paid engagements. Sequence the work by how long each fix takes to land. The auction-insights pass and the branded-versus-non-branded separation are jobs an in-house operator ships inside an afternoon. The Quality Score climb and the trademark complaint take a few weeks. The reasons compound. A brand bidder lifts your branded CPC, a Quality Score under 7 doubles the damage, and a campaign that mixes branded with non-branded hides both problems inside an averaged report. The same chain runs on the non-branded side: a low Quality Score raises CPC, which makes the tCPA target harder to hit, which makes the algorithm chase volume on broader match, which lands clicks on a generic page. Fix the Quality Score and the chain unwinds. The [wasted-ad-spend library](/wasted-ad-spend/) walks through the rest in order. ## What are typical mistakes in keyword matching that lead to wasted ad spend? URL: https://connercrowe.com/wasted-ad-spend/typical-mistakes-keyword-matching-wasted-spend/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: Six match-type decisions leak Google Ads spend: broad match with no negative list, phrase match in unthemed ad groups, exact match expanded by close variants, mixed match types in one ad group, a negative list older than ninety days, and broad match paired with Smart Bidding on thin conversion data. A four-step search-terms audit finds the current leaks. ## Why keyword waste hides longer than it should Bad keywords get caught in the search-terms report. Bad match types get caught in the conversion data three months later, after Google has already spent the budget. The platform changed how every match type behaves between 2018 and 2022, and most accounts I audit still run match-type strategy from the old playbook. This page runs in two halves. The first half is the audit pass that finds which keywords are leaking money right now. Each step takes between ten and thirty minutes on a normal account, and the worst leaks surface inside the first two. The second half is the six match-type mistakes that put those leaks there. Fix the first half and the account stops bleeding this quarter. Fix the second half and it stops refilling. ## Step 1: ninety days of search terms sorted by cost Open the search-terms report at the account level, set the date range to the last ninety days, and sort by cost descending. Export the top three hundred queries to a sheet. Filter for queries with zero conversions and more than one hundred dollars in spend. That single filter typically returns between forty and two hundred rows on a mid-sized account. Each row is a query Google decided was close enough to one of your keywords to charge you for, and not close enough to convert. Read them. Tag each query as relevant, irrelevant, or wrong intent. Add the irrelevant and wrong-intent queries to a campaign-level negative-keyword list before anything else moves. That step alone often recovers between five and fifteen percent of monthly search spend. Tag the proper nouns against the live catalog or service list rather than from memory. A brand the business stocks or a staff member it employs can sit in the zero-conversion list for reasons that have nothing to do with relevance, and negating those blocks the buyer instead of the leak. On the real-estate law firm rebuild, the first ninety-day pull surfaced budget going to DIY-contract researchers, real-estate agents shopping for marketing services, and people researching unrelated legal issues. Three hundred negatives went in over the first thirty days. Spend dropped fifty percent. Monthly qualified signups doubled. If the account had stayed on autopilot another year, the firm would have burned thirty-two thousand more dollars on wrong-fit traffic before anyone noticed. [Law firms hit this differently](/for-service-brands/law-firms/), and the negative-list build looks nothing like the ecommerce template. ## Step 2: Quality Scores below five on top-spend keywords Switch to the keywords view. Add the Quality Score, Landing Page Experience, Ad Relevance, and Expected CTR columns. Sort by cost descending and read the top thirty rows. A Quality Score of 4 or lower on a keyword that absorbs meaningful campaign spend is a click-cost tax. Google charges twenty to forty percent more per click on low-score keywords than it charges competitors bidding on the same query with strong scores. Three of those keywords in the top ten is the threshold for an ad-copy and landing-page rebuild on the ad group they sit inside. The diagnostic columns tell you which lever to pull. Low Landing Page Experience points at the page. Low Ad Relevance points at the copy. Low Expected CTR points at intent mismatch, which usually traces back to a match-type decision rather than a writing problem. Read all three before changing anything. The [25-page audit](/audit/) flags ad groups where Quality Scores cluster below five. ## Step 3: informational queries sitting on commercial campaigns Sort the search-terms report by impressions descending and read the top one hundred queries. Tag each one as commercial or informational. Informational queries sound like "how does," "what is," "best way to," "ideas for," "guide to." Commercial queries sound like "buy," "price," "near me," "best [product]," "[product] for sale." Informational queries landing on a buy-now page convert at near zero. They burn between eight and twenty percent of budget on most accounts I audit. The fix is a campaign-level negative-keyword list that blocks the informational modifiers, paired with a separate content path if that traffic is worth capturing at all. The [ad-spend efficiency calculator](/calculator/) shows what percentage of budget is moving through informational queries once you tag them. ## Step 4: branded and non-branded campaigns intercepting each other Open the branded search campaign, run the search-terms report, and filter out any query containing the brand name. What remains is non-branded traffic that broad or phrase match pulled into the branded campaign. Branded campaigns bid higher and run looser match because the conversion rate on real branded queries justifies it. When a non-branded query slips in, you pay the branded bid on a colder click. The reverse pattern costs more. A non-branded campaign running phrase or broad match sometimes intercepts branded queries that would have arrived through the branded campaign at a quarter of the cost. Compare conversion rate by match type inside the non-branded campaign. If broad match converts at double the rate of exact, branded interception is almost always the cause. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the de-duplication contract that catches this in reporting. On Sugar Babies, a single Performance Max campaign was intercepting branded search and claiming credit for queries that would have closed through organic anyway. Reported ROAS looked healthy. Non-brand performance was invisible underneath. Pulling a dedicated branded Search campaign out from under PMax and excluding the brand term from PMax separated the two for the first time. Non-brand revenue grew 147 percent inside ninety days once the math was honest. Those four steps tell you what is leaking. They do not tell you why the account refills with the same queries every quarter. Six match-type patterns cause almost all of it, and each has a fix that takes under an hour. ## Mistake 1: broad match running without a negative-keyword list Broad match without negatives is the most common. The ad group sits at default settings, Google matches the keyword to anything it considers thematically related, and the search-terms report fills with queries that have no commercial connection to the product. Google's [broad match algorithm](https://support.google.com/google-ads/answer/2497828) has shifted toward intent-based matching since 2021, which sounds tighter and expanded the surface area in practice. A broad-match keyword for "leather sofa" now triggers on queries about furniture care, sofa repair tutorials, and competitor brand names. None of that converts on a commercial landing page. None of it gets blocked unless a negative-keyword list catches it. For home and furniture clients I run [a separate playbook](/for-home-brands/furniture/) on the negative-list patterns that repeat across the vertical. To find it, filter the keywords view to match type equals broad and group by ad group. Open the search terms tab on each one and read the last sixty days. If the ad group has no associated negative-keyword list, or the list has not been touched in a quarter, you have found a leak. Accounts that hired an agency three years ago and stopped looking fail this check almost every time. The fix is a campaign-level negative-keyword list attached to every campaign that runs broad match, reviewed every quarter against a fresh search-terms pull. Accounts that skip that discipline lose between ten and thirty percent of search spend to queries that never had a chance of converting. ## Mistake 2: phrase match inside ad groups with no shared theme Phrase match works when the ad group has a tight thematic anchor. Three to five phrase-match keywords that all describe the same intent, paired with ad copy written to that theme, gives Google a clean signal about what the ad group serves. The mistake is dumping fifteen unrelated phrase-match keywords into one ad group because they sat near each other in a keyword tool export. Google now has to write ad-relevance scores against fifteen different intents using one set of responsive search ads. Quality Score sags, cost per click climbs, and the ad group looks like it is performing because impressions stay high. The opposite error costs the same money. Filter the keywords view to ad groups with one active keyword and count them. A few single-keyword ad groups inside a deliberate SKAG structure is fine. Dozens of them usually means the account was broken apart for vanity reporting and now runs thin ad copy against keyword counts too low for Google to learn on. Both fixes land in the same place. Group keywords by intent rather than tool category, aim for three to five per ad group, write three responsive search ads tuned to that theme, and watch Quality Score climb over the next two weeks. ## Mistake 3: exact match expanded by close variants without monitoring Exact match no longer means exact. Google's [exact match documentation](https://support.google.com/google-ads/answer/2497825) states that exact match matches queries with the "same meaning" as the keyword, not the same words. Plural forms, synonyms, reordered terms, paraphrases, and intent-equivalent rewrites can all qualify under close-variant matching. The cost shows up in two places. First, exact-match keywords trigger on queries the account owner never approved, and those queries skip the scrutiny exact match was meant to provide. Second, close-variant expansion overlaps with phrase and broad match in the same campaign, so Google decides which keyword to attribute the click to, and the auction logic favors the keyword with the higher bid. The fix is to read the search-terms report against exact-match keywords every month. Tag any query that is not the literal keyword. If the close variant converts well, keep it and add it as its own exact-match keyword. If it converts poorly or carries the wrong intent, add it as a negative at the exact-match level. The [calculator](/calculator/) also shows what share of exact-match spend moves through close variants rather than literal matches. ## Mistake 4: mixing match types in one ad group Putting broad, phrase, and exact versions of the same keyword in one ad group looks tidy on a spreadsheet. Inside Google's auction it creates internal competition. The platform picks whichever match type has the strongest combination of bid and Quality Score, then attributes the click and conversion to that keyword. The result is messy reporting and unstable bid signals. Broad match cannibalizes exact match impressions. Exact match starves of conversion data because broad caught the query first. Smart Bidding cannot read clean signal off any of the three. The fix is one match type per ad group. Build a tight-themed exact-match ad group for the queries that already convert, a phrase-match ad group for adjacent intents, and a broad-match ad group only once a negative-keyword list and a Smart Bidding strategy are both in place. Cross-negate between them so the same query cannot trigger more than one ad group. ## Mistake 5: negative lists nobody has pruned Negative lists rot. Every audit I run surfaces between fifty and two hundred queries that should have been blocked from past search-term reviews and never made it onto the list. The fix happened in a sheet that nobody pushed into the account, or the list owner left, or the list was attached at the ad-group level instead of the campaign level and only protected one of seven campaigns. Google does not flag missing negatives. The optimization score recommends adding broad match keywords, not blocking the queries those keywords pulled in last quarter. The miss compounds. Every ninety days the account spends another three to ten percent on queries that should have been negated two audits ago. The fix is one shared negative-keyword list attached at the account or campaign level, owned by one person, reviewed every quarter. Pull the last ninety days of search terms, add the new irrelevant queries, then prune the old negatives that no longer match served queries. A 2023 list blocking phrases nobody searches anymore costs nothing. A list missing the twenty queries Google started routing to the account last month costs real money. Document the date the list was last reviewed. The [wasted-ad-spend library](/wasted-ad-spend/) covers the list-management workflow in depth. ## Mistake 6: broad match plus Smart Bidding before conversion data stabilizes Google recommends broad match paired with Target CPA or Target ROAS bidding inside the optimization score. The recommendation only works when the conversion data feeding the bidding algorithm is clean and stable. Most accounts do not meet that bar. When broad match runs with Smart Bidding on thin conversion data, the algorithm chases noise. It bids up on queries that converted once by accident, then burns budget while it learns. The first sixty to ninety days look productive because spend climbs. The next sixty to ninety days look terrible because conversion rate collapses on the queries the algorithm bet on. The fix is sequencing. Run exact and phrase match with manual or enhanced CPC bidding until the campaign has at least thirty conversions per month against stable creative. Then layer in broad match with Target CPA, give Smart Bidding two weeks to learn, and read the search-terms report weekly for the first month. Pull broad match if cost per conversion climbs above the manual baseline and stays there for two weeks. ## The audit cadence Every six-figure account I open in 2026 has at least three of these problems running unchecked, and I have not opened one this quarter that cleared all six mistakes. Run the four diagnostic steps once across every campaign. Fix the worst three mistakes underneath them. Then re-run the search-terms and negative-keyword steps every ninety days. The accounts that stay clean are the ones that treat negative-keyword hygiene as a recurring calendar item rather than a one-time cleanup. I run this exact pass against client accounts as the opening step of any paid engagement. The [services overview](/services/) covers what the rebuild looks like, and the [contact form](/contact/) is where the conversation starts when the leak is bigger than a weekend fix. ## What are warning signs that my retargeting ads are not converting and wasting funds? URL: https://connercrowe.com/wasted-ad-spend/retargeting-ads-not-converting-warning-signs/ Published: 2026-05-25 | Updated: 2026-05-26 Answer: Six warning signs flag wasted retargeting spend: weekly frequency above 6 on small lists, conversion volume declining while spend holds steady, retargeting audiences that quietly include past purchasers, audience overlap with prospecting above 40 percent, branded-search overlap inflating attributed ROAS, and creative fatigue measured by CTR decay over 30 percent month-over-month. Each has a structural fix, not a bid-tuning fix. ## Retargeting fails differently than prospecting A retargeting campaign and a cold-traffic campaign break for different reasons. Cold campaigns mostly fail on audience-offer fit or landing-page mismatch. Retargeting campaigns mostly fail on saturation, audience hygiene, and attribution overlap. The diagnostic order is different, and the warning signs are different. Fixing a retargeting problem with cold-traffic playbooks wastes weeks. Most retargeting waste is structural. The campaign was set up correctly six months ago and quietly went sideways as the audience pool shrank and the same buyers got served the same creative for the eleventh time. The signs below are the ones I check first on any account review. ## Signal 1: weekly frequency above 6 on small lists The single fastest signal of retargeting waste. Pull the frequency column in Meta Ads Manager at the ad-set level, set the date range to the last 7 days, and look at any audience under 50,000 users. If frequency is above 6 impressions per user per week, the campaign is paying to annoy the same people who already saw the ad five times and chose not to buy. The fix is not a budget cut. Cutting budget keeps frequency high because the small audience absorbs whatever spend gets thrown at it. The fix is a frequency cap at 3 per week, a creative refresh, and a time-window reset so the 7-day window does not roll the same users back in on day 8. If the audience is under 10,000 users, retargeting is the wrong tool. That audience belongs in an email flow, not a paid retargeting set. ## Signal 2: conversion volume declining while spend holds steady Pull a 90-day chart of retargeting spend on the same axis as retargeting purchases. If spend is flat and purchases trended down 20 percent or more across the last 60 days, the audience is exhausted. The buyers who were going to convert already did. The remaining pool is the visitors who looked once and left, and they are getting more expensive to convert every week. Audience exhaustion looks identical to creative fatigue in a dashboard. The way to tell them apart is to swap creative on a single ad set and watch what happens. If CTR recovers, it was creative fatigue. If CTR stays flat, the audience is the problem and no new ad will save it. Refill the top of the funnel before adding retargeting budget. ## Signal 3: retargeting audiences include past purchasers Open every retargeting ad set. Check the exclusions list. If `purchasers_180d` or the equivalent customer-list audience is not in the exclusions, the campaign is paying Meta or Google to show ads to people who already bought. This is the single most common waste pattern I find in audits, and it shows up on accounts that ran clean two years ago. The leak compounds because past purchasers are the most engaged segment in the pixel. They click. They generate CTR. The ad set looks healthy in the dashboard while the incremental purchase rate is near zero. Suppress every past-purchaser window (30, 90, 180 days at minimum) from every retargeting ad set, and rebuild a separate post-purchase upsell campaign with its own creative and its own cap. ## Signal 4: audience overlap above 40 percent with prospecting Run the Meta Audience Overlap tool between the prospecting lookalike and the retargeting custom audience. Overlap above 40 percent means the two campaigns are bidding against each other in the same auction for the same users. Both campaigns report a conversion. The deduped account-level conversion count is lower than the platform thinks. This shows up as a quiet 15 to 25 percent gap between Meta reported purchases and Shopify gross orders over a 30-day window. The [Tracking Stack reference](/frameworks/tracking-stack/) walks through the deduplication contract that surfaces this in the data. The fix is to exclude the retargeting custom audience from the prospecting campaign, not the other way around, and to verify the gap closes inside two weeks. ## Signal 5: branded-search overlap inflating attributed ROAS A Google PMax or Meta retargeting campaign that overlaps with branded search is being credited for buyers who would have typed the brand name into Google regardless. The reported ROAS looks strong. The incremental ROAS, once branded search is held constant, is often half of the reported number or worse. The diagnostic is a one-week branded-search pause on a single geographic split, with retargeting held constant. If retargeting purchases stay flat while branded-search purchases drop and reappear, the retargeting attribution is sound. If retargeting purchases drop alongside branded search, the retargeting campaign has been claiming credit for organic intent. The [free 25-page audit](/audit/) covers this geo-holdout structure in detail. Founders who skip this test keep retargeting spend high on a campaign that looks profitable on paper and is structurally taking credit for branded demand. ## Signal 6: CTR decay over 30 percent month-over-month Pull the last 60 days at the ad level. If average CTR fell by more than 30 percent across the same creative set, the ads are fatigued. The audience has seen the same image and the same headline enough times that the click signal collapsed. CPMs hold steady. Clicks drop. Conversions follow clicks down. Fatigue is the easiest signal to fix and the easiest to ignore, because the dashboard still shows spend going out the door. Rotate the top three ad creatives every 14 days on any retargeting set spending over $50 per day. Keep an evergreen control ad running alongside the rotation so the fatigue curve is measurable instead of guessed at. ## How to triage when multiple signals fire at once In account audits I see three or four of these signals firing together. The order to address them is exclusions first (Signal 3), then overlap (Signal 4), then frequency (Signal 1), then fatigue (Signal 6), then attribution (Signal 5), then audience exhaustion (Signal 2). Exclusions and overlap are settings changes that take an hour. Frequency and fatigue are creative-and-cap changes that take a week. Attribution and exhaustion are structural campaign decisions that take a month to validate. Read [/wasted-ad-spend/](/wasted-ad-spend/) for the adjacent diagnostics. The retargeting line item is usually the second-highest-spend campaign in an account. It earns audit time accordingly, and the dashboard reports the surface number until somebody opens the exclusions list. Retargeting waste is the leak most accounts find inside an hour once the exclusions list and the audience-overlap report get opened together. Both checks are free, both live inside the platform, and both are routinely skipped because the dashboard already shows green. If three of the six signals fire on the same retargeting set, the rebuild sequence above is the next step before any paid engagement. ## What constitutes a good return on ad spend for e-commerce businesses? URL: https://connercrowe.com/wasted-ad-spend/good-roas-benchmark-ecommerce-businesses/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: A good ROAS depends on contribution margin, not on a universal number. Breakeven ROAS equals 1 divided by contribution margin, so a 30 percent margin needs 3.3x to break even. Healthy targets sit near 2x breakeven. Then check blended ROAS against platform-reported ROAS, new-customer ROAS above 1.5x, and contribution margin after ad spend above zero. ## "Good ROAS" is the wrong question A 5x ROAS on a 20 percent contribution margin product is a money-losing campaign. A 2x ROAS on a 60 percent margin product is profitable. Asking what a good ROAS looks like without naming a margin is asking a question the number cannot answer. ROAS is revenue divided by ad spend. Profit is what survives cost of goods, shipping, payment processing, ad spend, and everything else that scales with an order. The dashboard knows none of that. Start with contribution margin per order, then back into the ROAS the business needs to clear. Skipping that step is why an account looks healthy in Ads Manager and dies on the P&L. ## The breakeven math **Breakeven ROAS = 1 / contribution margin** A 30 percent margin breaks even at 3.3x. A 50 percent margin at 2x. A 20 percent margin needs 5x to stop losing money on incremental orders. Read against gross margin instead, 40 percent breaks even at 2.5x and 55 percent at 1.82x. Then layer in profit. A healthy target is 2x breakeven on cold traffic. Premium DTC brands with 70 percent margins run profitable at 3x. Furniture brands at 35 percent margins need 5x or 6x on cold traffic. Founders who run the numbers in the [contribution-margin calculator](/calculator/) usually find their internal "good ROAS" target was set 30 to 50 percent too low. Breakeven also sets the floor you enforce in the platform. Google Ads target ROAS bidding should sit at least 20 percent above breakeven to absorb tracking variance and returns. On Meta, the equivalent is a minimum-ROAS rule on the campaign. Threshold for concern: campaign-level ROAS within 10 percent of breakeven on a 30-day window, or below breakeven for more than 14 consecutive days. The same math gives a target CPA: gross profit per order minus a planned contribution to fixed costs. On a Shopify home brand at 55 percent gross margin and a $160 average order value, that lands between $50 and $70. Reported CPA above target on a rolling 30-day window is the concern line. Two days is noise. Two weeks is structural, and the fix is redistribution toward the campaigns already converting under target, not a bid adjustment. ## Category benchmarks (with margin context) | Category | Typical contribution margin | Breakeven ROAS | Healthy blended target | |---|---|---|---| | Home and furniture | 35 to 50 percent | 2x to 2.9x | 3x to 5x | | Apparel | 45 to 60 percent | 1.7x to 2.2x | 4x to 6x | | Beauty and skincare | 65 to 80 percent | 1.25x to 1.5x | 3x to 4x | | Consumer electronics | 15 to 25 percent | 4x to 6.7x | 6x to 10x | | Premium DTC | 60 to 75 percent | 1.3x to 1.7x | 3x | Home and furniture: big baskets hide thin per-order economics, so under 3x blended usually means the brand is funding ads from working capital, as the [furniture playbook](/for-home-brands/furniture/) covers. Apparel: return rates of 15 to 30 percent compress effective margin, so platform ROAS has to clear higher than the math first implies. Consumer electronics: a 4x is usually a losing account dressed up by branded-search overlap. A furniture brand at 55 percent margins on a $1,800 AOV also operates differently than one at 30 percent margins on a $400 AOV. Run the brand's own breakeven first. Sugar Babies needs 3.5x to clear breakeven on contribution margin. I set the Performance Max target at 4x because Google's target ROAS undershoots more than it overshoots on its own reporting. The weekly read swings hard: 3x, then 4x, then 2x, then 6x in consecutive weeks. Over a quarter the blended number lands near the target. The ninety-day blended is the read that matches the P&L. ## Blended ROAS vs platform-reported ROAS Every platform claims credit for the same conversion when journeys overlap, so the sum of platform numbers usually exceeds actual revenue by 20 to 60 percent. Blended ROAS is total revenue divided by total ad spend across every platform for the period, and it is the only number that ties to the bank account. Threshold for concern: platform-reported revenue exceeding blended revenue by more than 30 percent. A 5x Meta and a 4x Google on top of a 2.5x blended is a flashing light, not a healthy account. Those platforms are inflating by a combined 2x, and the bank balance exposes it about 60 days later. Set blended as the north star and run a monthly blended-vs-platform reconciliation. The [tracking stack reference](/frameworks/tracking-stack/) covers the de-duplication contract that makes it trustworthy. ## Branded-search overlap inflation Most accounts running Google Ads have a branded-search campaign capturing buyers who would have arrived organically. Its ROAS is often 15x or 20x, and it is mostly fake incrementality. A 6x Google Ads account that includes branded often becomes a 2.5x account on non-branded traffic, which is the number that matters for growth. Meta retargeting works the same way. A 10x ROAS against existing site visitors recaptures demand the brand already paid to create. ## New-customer ROAS is the metric that scales Total ROAS includes returning buyers who would have purchased through email, organic, or direct. New-customer ROAS strips them out and predicts whether the account can grow. At 1.5x to 2x it is healthy for most ecommerce brands once LTV is factored in. Threshold for concern: below 1.5x, or below 1x for brands with strong LTV economics. A platform reporting 4x total ROAS against 0.8x new-customer ROAS is recapturing existing demand, and the growth ceiling is in sight. Chasing 4x new-customer ROAS on cold traffic shrinks that ceiling from the other direction, because targeting tightens until only existing-intent buyers convert. Loosen the target, accept first-purchase contribution near breakeven, and let LTV pay back acquisition cost across month two through month twelve. The report is GA4 with a `new_customer` parameter on the purchase event, segmented by paid channel. Setup takes an afternoon, and most accounts I audit skip it. On Sugar Babies, platform-reported ROAS looked healthy at the 4x target. Once the GA4 split was running, the new-customer cut sat closer to 2x. Total ROAS was the dashboard read. New-customer ROAS was the growth read. ## Contribution margin after ad spend The most honest number in the account. Revenue, minus cost of goods, minus ad spend, divided by revenue. Negative means the campaign is paying customers to take inventory. Threshold for concern: below 5 percent at campaign level on a rolling 30-day window. Five percent is a floor, not a target. Below zero is a stop-loss, and below zero on cold-traffic orders for more than 30 days with no LTV plan to recover the gap is the definition of bad ROI regardless of what Ads Manager says. Anything negative on first purchase needs a clear second-order or subscription pickup to be defensible. Pull the campaigns printing negative numbers, redistribute into the campaigns clearing 15 percent or more, then think about scaling. Most accounts I see have three to five campaigns silently losing money inside an account reporting a healthy blended ROAS. ## Reading social spend against the same targets Meta shows one number, Shopify another, TikTok a third that disagrees with both. Each measures a different slice of the same purchase, with different windows and different signal-loss adjustments stitched on after [iOS 14.5](https://www.facebook.com/business/help/331612538028890). Six reads make social spend legible against the math above. **CPM.** Above $50 on cold prospecting means the creative is losing the auction to fresher work in the same pool. Pull CPM by ad set on a rolling 14-day window. A rise of more than 30 percent without a matching lift in ROAS is a creative refresh, not a budget increase. **CPC and click-to-conversion.** TikTok runs cheaper on impressions and expensive on commercially qualified clicks. Click-to-conversion ratio should stay below 8 percent. If 100 people click and fewer than 8 purchase, the offer-to-page match is broken, the page is slow, or the audience is wrong. **CPA against contribution margin.** A $48 CPA on a $90 contribution margin is healthy. The same CPA on a $35 contribution margin is bleeding. **Attribution window.** Meta defaults to [7-day-click plus 1-day-view](https://www.facebook.com/business/help/458681590974355), written 7DC/1DV. Read 7DC/1DV for directional health, 7-day-click when comparing against Shopify, 1-day-click when stress-testing. If 7DC/1DV looks strong but 1-day-click ROAS collapses below 1, the campaign is harvesting credit for purchases it did not cause. **Frequency.** On cold prospecting, above 4 inside a 7-day window is where CPM rises, CTR falls, and CPA inflates in step. Warm and retargeting audiences tolerate 8 to 12 across 14 days. **CAPI deduplication.** The one most founders skip, and it decides whether everything above is signal or noise. The browser pixel loses a meaningful share of conversion events post-iOS 14.5. The [Conversions API](https://developers.facebook.com/docs/marketing-api/conversions-api) fills the gap server-side, but every browser event must match a server event by `event_id` or Meta double-counts the purchase. Dedup rate in Events Manager should sit above 95 percent. Below 90 percent, reported ROAS is mathematically wrong. The [tracking stack reference](/frameworks/tracking-stack/) walks the `event_id` handshake, the `fbp`/`fbc` passthrough, and the match keys that lift Event Match Quality above 7. | Metric | Meta benchmark (home/furniture ecom) | TikTok benchmark | Threshold for concern | |---|---|---|---| | CPM | $18 to $35 | $8 to $22 | Above $40 sustained | | CPC | $0.80 to $2.20 | $1.50 to $3.50 | Above $3 on cold | | Frequency on cold | Under 4 per week | Under 5 per week | Above 6 | | 7-day-click ROAS | 3x to 5x | 2x to 4x | Below breakeven | | CAPI dedup rate | Above 95 percent | Above 90 percent | Below 85 percent, ROAS unreadable | A Meta-reported 4.2x against a Shopify-reported 1.9x is normal in a poorly tracked account. Meta claims purchases inside a 1-day-view window and Shopify does not, so strip the view-through column to compare like-for-like. Shopify credits the last touch, often a session Meta legitimately introduced. And a dedup failure counts the same purchase twice. The fix lives in the tracking stack, not the bid strategy. ## The indicators that move before ROAS does **Conversion rate against a vertical benchmark.** Read against a benchmark, conversion rate tells you whether the leak sits upstream or downstream of the click. Home and decor ecommerce runs 1.5 to 3 percent on relevant traffic. Furniture sits at 1 to 2 percent because of higher consideration. Service businesses with a focused lead form clear 2 to 5 percent, and [law-firm accounts](/for-service-brands/law-firms/) run closer to 4 percent on focused practice areas. SaaS free-trial pages clear 3 to 7 percent. Paid-social landing pages should hold above 2 percent. Threshold for concern: below half the vertical benchmark on traffic that reads as relevant in the search-term report. Relevant traffic that will not convert is a page problem. Irrelevant traffic is a match-type problem. **Impression share lost to budget.** The share of auctions a campaign was eligible for but did not enter because the daily budget was spent. Above 30 percent on a campaign already hitting target CPA or target ROAS is a campaign asking for more money. Below 5 percent on a campaign missing CPA targets means the budget is not the constraint, the structure is. **CTR-to-CR ratio.** A high CTR with a low CR means the ad promised something the page did not deliver. Threshold for concern: CTR above 3 percent paired with CR below half the vertical benchmark. Align the ad headline to the H1 of the page, then align the H1 to the query that triggered the ad. On a regional B2B account I audited, this scan caught the read in twenty minutes. Three months of Meta spend ran $6,600 across nearly four million impressions. A 0.56 percent CTR against a $0.30 CPC reads inside the band for awareness campaigns, but the conversion column was blank because no purchase or lead actions had been configured to fire. The question could not be answered until the tracking was rebuilt. ## Trend and cohort: the reads that need time Single-month ROAS bounces. The signal is the rolling 90-day trend. Threshold for concern: blended ROAS down more than 15 percent across a rolling 90-day window with spend held roughly constant. That gradient means acquisition cost is rising faster than the brand can absorb. Plot a 13-week rolling chart of blended ROAS next to spend and pull it monthly. The second read is LTV-adjusted ROI. A 2x first-purchase ROAS that turns into 4x by month six is a great account. A 3x that stays at 3x for 12 months is an account with no second order, which means no business. Threshold for concern: 90-day or 180-day LTV-adjusted ROI flat or below first-purchase ROI. The report is a Klaviyo or Shopify cohort view of revenue per acquired customer at day 30, 60, 90, and 180, plotted against the channel they came in on. Paid channels producing flat cohorts get cut first, even when first-purchase ROAS beats channels with rising cohorts. A payback period longer than 90 days on a first-time buyer is the same failure read from the cash side. Any single threshold on this page in the red is a yellow flag. Two or more at once is an account funding itself on working capital. Founders who hit four should book a [diagnostic call](/contact/) instead of spending another week tuning alone. ## What to target by growth stage Under $100k in monthly revenue, target blended ROAS at roughly 1.5x breakeven and accept lower platform ROAS on cold traffic. Between $100k and $1M, hit 2x breakeven blended, with new-customer ROAS held at 1.5x to 2x and total ROAS allowed to climb as repeat purchase compounds. Above $1M, run 2.5x to 3x breakeven with strict guardrails on branded-search bundling and attribution inflation. At that size, every percentage point of inflated ROAS turns into six figures of overspend annually. A good ROAS is the one that funds the business after every variable cost. Benchmark ranges set the floor for a category. Margin and LTV set it for a specific business. If the gap between your healthy target and what the platforms report is wider than 30 percent, the [free 25-page audit](/audit/) shows where the inflation comes from on each campaign, and the [wasted ad spend library](/wasted-ad-spend/) covers the rest of the metrics that get misread in account reviews. ## What key metrics should I regularly monitor to detect poor ad performance? URL: https://connercrowe.com/wasted-ad-spend/key-metrics-monitor-detect-poor-ad-performance/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: Watch four metrics weekly: CPA trend, spend pacing, zero-conversion spend share, and impression share split by budget versus rank. Add the search reads on term irrelevance, Quality Score, and match type. Add the Display reads on placement share, viewability, and mobile-app spend. Check revenue against Shopify monthly. ## The Monday written summary Every account I run gets a Monday morning written summary. Four numbers, one paragraph, sent before anything else opens. The point is not the document. It is reading the same numbers the same way every seven days, so a drift registers as a drift instead of a month-end surprise. Each number below names its report. ## The four weekly numbers ### CPA trend Cost per acquisition at the account level, then for the top three campaigns by spend, on a rolling seven-day window against the prior seven days and the trailing twenty-eight. One week in isolation is noise; the trend across three windows is signal. Concern threshold: a top-three campaign twenty percent above its trailing twenty-eight-day baseline. First move: that campaign's search terms report, before bids. ### Spend pacing Month-to-date spend divided by days elapsed, multiplied by days in the month, against budget. Pacing to a hundred and forty percent of budget in the first ten days means a bid strategy off its leash. Pacing to fifty percent means starving the auction. Concern threshold: fifteen percent above or below target by the second Monday. First move: change history for the prior fourteen days. ### Zero-conversion spend share The report: campaigns or ad groups view, cost descending, conversions filtered to zero, last thirty days. Total every ad group that spent over a hundred dollars and produced nothing, divided by total account spend. Under ten percent is healthy on a mature offer; twenty-five to forty means drift. Concern threshold: twenty-five percent. The cause is usually three or four ad groups the bid strategy will not defund because its conversion signal arrives too rarely to retrain the model. ### Impression share, split by budget and rank The report: campaigns view with Search Lost IS (budget) and [Search Lost IS (rank)](https://support.google.com/google-ads/answer/2497703) added, week over week. Lost-to-budget means the campaign hits daily cap and Google would spend more. Lost-to-rank means it cannot win the auction at the bid and Quality Score it has. The two dictate completely different fixes: ten percent lost to budget on a healthy conversion rate leaves revenue on the table, thirty percent lost to rank bleeds click cost on the impressions you win. Concern threshold: impression share down ten points in seven days, or lost-to-rank up five points in a week. ## Search campaigns: seven numbers behind three reports The default view rewards more match types and more spend. These seven sit further in. ### Search-term irrelevance rate The report: search terms, last ninety days, cost descending. Tag the top two hundred queries relevant or irrelevant, divide irrelevant cost by total cost. Under ten percent is healthy on tight match types; a Performance Max or broad-match heavy account often sits between thirty and sixty. Concern threshold: fifteen percent of spend on queries you would not have bid on by hand, and above twenty-five percent treat it as structural. The fix is rarely a longer negative list. It is tighter match types, audience signals on Performance Max, and a decision about where broad match operates. ### Top-spend keyword performance The top ten keywords by spend carry sixty to eighty percent of Search cost. Read them weekly: spend, clicks, conversions, conversion rate, CPA. One going off the rails masks a healthy account average for two or three weeks, so reading the ten weekly catches it on day seven instead of day twenty-one. Concern threshold: a seven-day conversion rate below half the trailing ninety-day rate. First move: the search terms it triggered, and its match type. ### Quality Score on top-spend keywords The report: keywords view with [Quality Score](https://support.google.com/google-ads/answer/6167118), Landing Page Experience, Ad Relevance, and Expected CTR added, cost descending. A score below 5 on a keyword taking more than a few percent of campaign spend is a tax: Google charges fifteen to forty percent more per click than it charges competitors with strong scores. Three below 5 in the top ten by spend calls for a landing-page and ad-copy rebuild. Two is a warning. One is noise. Monthly, widen to the top fifty and bucket them seven-or-higher, four-to-six, three-or-lower. Twenty percent slipping into the bottom bucket means CPCs rise account-wide whatever the bid strategy says. Concern threshold: a five-point swing toward the lower buckets in one month. The [Wasted Spend Calculator](/calculator/) covers the uplift math. ### Click-through rate on exact-match keywords The report: keywords view filtered to match type equals exact, impressions descending. Median ecommerce CTR on exact match sits between 4 and 8 percent branded and 2 and 4 percent non-branded, and a service business with strong intent queries should clear 5 percent non-branded. Under 1 percent with real impression volume means the keyword is matching queries it no longer represents, or the ad misses the intent. ### Conversion rate by match type The report: dimensions or segment view, segmented by match type at ad group level. Exact should convert highest, phrase lower, broad meaningfully lower than phrase. When the order inverts the data is lying, almost always from a tracking de-duplication failure or a branded query slipping into broad. A broad-match rate that doubles the exact rate on the same keyword root means broad is intercepting branded traffic you already had. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the de-duplication contract. ### Impression share by audience segment The report: audiences view inside a campaign, impression share segmented by audience. [Customer Match](https://support.google.com/google-ads/answer/6379332) lists fed from email and SMS should clock the highest impression share and conversion rate, because logged-in past purchasers searching category terms are the cheapest conversions in the account. If they sit low while cold audiences absorb the spend, layer the audience as a bid modifier and raise the floor. Same budget, different result inside two weeks. ### Top impression rate against rising CPC The report: search campaigns view with Top Impression Rate, Absolute Top Impression Rate, and Average CPC added, last thirty days against the previous thirty. When top impression rate falls while CPC rises, you are paying more per click for worse placement. Concern threshold: a ten-percentage-point drop paired with a fifteen-percent rise in CPC inside thirty days. You are outbid on rank, not on budget, and more bid will not recover the position. ## Display and Performance Max: six numbers Google buries Search has the search-terms report, where a bad query carries a name and a cost. Display has no equivalent. Google files placements under Insights, and Performance Max scrubs most of it into a "Placements where your ads appeared" download with no spend column. These placements absorb thirty to seventy percent of the budget in most solo-founder accounts, and almost nobody audits them. ### Placement category share The report: Insights or Where ads showed, sorted by cost, mobile-app placements broken out. The top fifty placements should produce more than seventy percent of meaningful engagement. Concern threshold: the top fifty accounting for less than thirty percent of total spend. A thousand placements taking ten dollars each is the canonical Performance Max display leak. First move: export placements, sort by cost, exclude the long tail below a minimum click threshold. Thirty minutes in the account-level exclusion list at the MCC. ### Viewability rate The report: campaigns view with Active View Viewable Impressions divided by total impressions, or the Insights tab on Performance Max. Google's [Active View documentation](https://support.google.com/google-ads/answer/7029393) defines a viewable display impression as fifty percent of the ad on screen for one second, and a viewable video impression as fifty percent on screen while playing for two seconds. Under sixty percent means more than four in ten measurable impressions never crossed that line. Below-the-fold and "below 300x250 mobile sticky" exclusions alone often lift it ten points inside a week. ### Mobile-app placement spend The report: placement type filter set to mobile-app in the Where ads showed view. The highest-friction inventory in the system: children's games and lock-screen tap traps. Click-through rates look exceptional, conversion rates collapse, session duration sits under three seconds because most clicks were accidental. Concern threshold: mobile-app spend above five percent of display budget. Exclude mobileappcategory::69500 (Games), then the Display Network mobile-app exclusion at account level. [Performance Max](https://support.google.com/google-ads/answer/10724817) needs the same exclusion through the Account-Level Negative Placements list at the MCC, released quietly in 2023 and rarely opened. ### View-through to click ratio The report: conversions segmented by attribution type, view-through against click-through. A view-through conversion fires when someone saw the ad and converted later without clicking. Useful as a directional signal, dangerous as a KPI. Above 100 to 1 the platform is claiming almost every conversion off an impression that may have been one pixel tall on a content farm. Cap the window at thirty days and keep those conversions out of any ROAS used to set bids; the Google default of ninety days hides the leak. Four-times return on clicks and twelve-times on view-through is a campaign that needs the click number. ### Audience overlap The report: audience insights at campaign level with overlap percentage against Customer Match and remarketing lists. On Meta, the audience overlap tool. A prospecting campaign that overlaps the remarketing list is buying impressions on people who already converted, and retargeting would have reached them at a lower CPM. Performance Max does this constantly, firing at warm audiences because they convert faster and make the asset group look efficient. Meta fails differently: two prospecting ad sets on overlapping audiences bid against each other while both report as functional. Concern threshold: thirty percent overlap against remarketing on Display, twenty percent between two Meta prospecting ad sets. First move: consolidate or rebuild into distinct buckets. ### Engagement and session duration on paid traffic The report: GA4 traffic-acquisition view, source filtered to paid, [engaged sessions and average session duration](https://support.google.com/analytics/answer/12253918) against total sessions. GA4 counts a session as engaged if it lasts ten seconds or longer, fires a conversion event, or includes two or more pageviews. Healthy paid traffic runs forty to sixty percent non-engaged; seventy percent or more means broad-match queries on irrelevant pages, app placements, or a page taking over three seconds to render on mobile. Segment to display and read session duration: fifteen seconds is the floor, and below five seconds accidental clicks dominate. ## The monthly revenue check Four numbers on the first Monday, all asking whether the spend turned into money. ### Blended ROAS against Shopify Compare platform-reported ROAS against the revenue Shopify attributes to paid traffic: Shopify Analytics, Reports, Sales by traffic source, same range. The gap is the metric. Inside ten percent says the tracking stack is honest. Above twenty-five percent says the platform is claiming revenue Shopify cannot see, and no bid change fixes a tracking problem. Sales by referrer adds the second layer, showing referring URLs, and catches a click parameter stripped at checkout. Concern threshold: Shopify reporting thirty percent less paid revenue than Google Ads. First move: server-side conversions, a GA4 enhanced measurement audit, and a recheck of the consent banner blocking the pixel on a quarter of EU sessions. ### New-customer ROAS Total ROAS hides repeat purchases. A returning-customer order through a paid click is a margin loss most months, because that customer would have bought through email or direct. New-customer ROAS, isolated through Shopify customer reports or the platform's new-customer acquisition column, says whether paid pays for itself. A blended ROAS of three-point-five against a new-customer ROAS of one-point-two means paid is subsidising the existing-customer base rather than building one. Concern threshold: below contribution-margin breakeven for two months. ### Cost per conversion against target CPA The report: campaigns view with Cost per Conversion and Target CPA visible, segmented by week for the last ninety days. A week inside twenty percent of target is on plan. Fifty percent or more above target for three consecutive weeks is structural. Both platforms let actual CPA roam above target on the belief a future conversion is likely, and three weeks of being wrong calls for a manual reset, not more learning time. The fix is a tighter conversion definition, a lower target, or a pause on the worst ad group. ### Conversion volume against rising spend The report: campaigns view with Cost and Conversions plotted as a time series, last six months, weekly. In a healthy account the lines move together; in a decaying one spend climbs while conversions flatten. Concern threshold: cost per conversion climbing more than thirty percent over a rolling sixty-day window while spend is flat or rising. The cause is audience saturation, creative fatigue past recovery, or a tracking change that broke attribution. The [target-CPA calculator](/calculator/) says whether the new number still clears margin. ## The four reports that explain the numbers Metrics say something moved. These four say why, in this order. **Auction insights**, campaign and ad group level, top three spenders. Watch for impression share lost to budget above twenty percent on campaigns that used to clear inventory, and a new competitor in the top three with a high overlap rate. Concern threshold: outranking share dropping fifteen points month over month. Fix: bid cap review, ad rank diagnosis, and a check on a competitor's new price promotion. **Change history**, the most under-used report in Google Ads. Filter the break period by change type: budget, bid strategy, Performance Max assets, conversion goals. Half the accounts I audit have one change that explains the entire drop, usually a bid strategy switched to maximize conversions on thin conversion data. Concern threshold: any bid strategy change inside the underperformance window. Fix: revert it and run the original strategy for a full conversion cycle. **The Performance Max asset report**, next to the placement report. Performance Max accounts for most wasted-spend complaints I see in 2026, and the asset report often shows the algorithm fixated on one headline or image that produces clicks and no orders. Concern threshold: over thirty percent of Performance Max spend on Display placements with sub-one-percent conversion rates. Fix: placement exclusions and asset group splits by intent. **GA4 landing pages**: Pages and Screens, Session source / medium secondary, filtered to google / cpc, read against engagement rate. A page taking fifteen percent of paid traffic at forty-percent engagement and a two-percent conversion rate is the leak, not the keyword that sent the click. Concern threshold: a top-five paid landing page under fifty percent engagement, or under one percent of site-average conversion rate. Fix: rebuild it or reroute the traffic. ## The cadence is the product On a roofing client I monitor weekly, the dashboard showed twenty-one thousand clicks at a dime each across the trailing ninety days. Top-decile by every surface metric. The cadence caught what the dashboard did not: the campaigns were lead-form objectives where every form open registered as a click, and the form-completion rate against those opens was barely under five percent. The founder would have kept scaling spend against the leak. The metric that matters is rarely the metric the platform highlights. If I open one number first it is the zero-conversion spend share, the fastest read on whether the problem is tuning or structure. On Search that job belongs to search-term irrelevance, which distorts every metric downstream. On Display it is placement category share: the long tail explains the collapsed viewability, the mobile-app spend, and the three-second sessions. Two of the six search numbers out of band usually costs fifteen to thirty percent of budget; three of the six display numbers usually costs twenty to fifty percent of that line item. The numbers matter less than reading them on the same day, in the same order, every week. Run the [free 25-page setup audit](/audit/) for the diagnostic written out, use the [Wasted Spend Calculator](/calculator/) to size the leak in dollars, or read the [wasted-ad-spend library](/wasted-ad-spend/). The [services overview](/services/) walks the structural fix. Founders who want me running this cadence live can send the account read-only through the [contact form](/contact/). ## What warning signs show my ads are targeting the wrong audience? URL: https://connercrowe.com/wasted-ad-spend/warning-signs-ads-targeting-wrong-audience/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: Seven warning signs identify wrong-audience targeting: a demographic split that does not match the buyer profile, income-proxy skew below the median buyer, interest drift after Performance Max or Advantage+ expansion, geographic spend outside the service area, age skew against the offer, language targeting left on all languages, and informational queries triggering commercial campaigns. Six default settings cause most of it. ## Why audience misfit looks like a performance problem A campaign with wrong-audience targeting does not announce itself. The cost-per-click can sit inside the benchmark range. The click-through rate can look healthy. Impressions can grow month over month. What gives it away is the demographic shape of who is clicking, and that data lives in reports most founders never open. Audience misfit is different from generic irrelevant traffic. Irrelevant traffic is off-topic queries and broken match types. Audience misfit is the right query coming from the wrong human. Same search, wrong income band. Same interest signal, wrong life stage. The platform cannot tell the difference until you teach it. Both do two kinds of damage. The obvious damage is the spend on clicks that will never convert. The compounding damage is what the algorithm learns from those clicks. Every conversion-optimized bidding strategy treats every click as a signal. Feed it ten thousand clicks from the wrong audience and it builds a model of your customer anchored to people who will never buy. That is why a founder who fixes this in month one routinely sees ROAS improve in months three and four. The platform takes time to forget what you taught it. ## Seven signs the audience is wrong **1. A demographic split that does not match the buyer profile.** Open the demographics report in Google Ads or the audience breakdown in Meta Ads Manager. Pull gender, age, and household-income segments for ninety days and compare the spend distribution against the buyer profile from Shopify or the CRM. The threshold is twenty percentage points. If the buyer base is seventy percent women and half the spend lands on men, the campaign is teaching the algorithm that the wrong audience converts. The fix is exclusion at the campaign level, not a bid adjustment. Bid adjustments slow the leak. Exclusions stop it. **2. Income-proxy data skewed below the median buyer.** Google reports household income in deciles where the data exists. Meta uses zip-code and behavior proxies. For a brand selling considered purchases above four hundred dollars, watch the bottom three income brackets. Above thirty percent of spend in those brackets means the offer is reaching people for whom the price is a non-starter. This matters most for furniture, jewelry, luxury skincare, and B2B services on annual contracts. For a furniture brand selling four-thousand-dollar dining tables, the income-proxy cutoff matters more than the interest segment does. **3. Interest-segment drift after Performance Max or Advantage+ expansion.** Both start with a seed and expand outward. After ninety days, the audience the algorithm is buying impressions for can look nothing like the seed. Pull the audience-insights report inside Performance Max and read the top twenty interest segments by spend share. Two unrelated segments in the top ten is the threshold. The fix is tighter audience signals at the asset-group level, and sometimes splitting back to standard Shopping or standard Search where audience control is explicit. **4. Geographic spend outside the defined service area.** Pull the location report in Google Ads or the regions breakdown in Meta and sort by spend descending. For a service business with a defined radius, spend outside that radius is wrong-audience spend by definition. The threshold is any region taking more than five percent of campaign spend without representing a market the business can serve. [Law firms hit this differently](/for-service-brands/law-firms/): jurisdiction lines decide the geographic build more than radius settings do. **5. Age skew misaligned with the offer.** If the offer is a wedding-registry brand and the top spend bracket is fifty-five to sixty-four, the ad is reaching the buyer's parents. If the offer is retirement planning and the top bracket is eighteen to twenty-four, the algorithm is buying impressions from an audience that will not convert for decades. The threshold is the top two age brackets taking more than fifty percent of spend while producing less than forty percent of conversions. **6. Language targeting set to all languages.** This hides in campaign settings and defaults to all languages in many account templates. Impressions get served to users whose browser language does not match the ad copy. Click-through collapses while spend keeps flowing, because impressions still serve. For most US brands serving a US audience the answer is English only. In multilingual markets the rule is one ad set per language, with copy translated by a human rather than by the platform. **7. Informational-intent queries on commercial campaigns.** A commercial campaign should serve on queries with buying intent: "buy walnut dining table", "best mid-century desk", "Shopify SEO agency pricing". Queries like "what is mid-century modern" belong on content pages. Tag the top fifty queries as commercial, informational, or navigational. If informational queries account for more than twenty-five percent of paid impressions on a campaign built for purchases, the match types are too loose for the intent. [Furniture brands](/for-home-brands/furniture/) carry a sharper split between research and buy queries than most verticals. ## How wrong-audience traffic behaves after the click The signs above describe who is clicking. These patterns describe what they do next, and they are the fastest confirmation available. **Page depth of one.** In GA4, filtered to Google Ads source, read pages per session on the engagement report. A median of 1.0 or 1.1 across a campaign that has run thirty days means the traffic arrives and leaves without scrolling, clicking, or triggering a second pageview. Page depth under 1.2 on more than sixty percent of sessions is the line where traffic stops behaving like buyers and starts behaving like accidental clicks. The fix is usually the match type, not the page. Phrase and broad on a tight budget pull queries the bidder thinks are close enough, and close enough is a long way from ready to buy. **Bounce above seventy-five percent and dwell under fifteen seconds.** A paid session under fifteen seconds means the visitor did not engage at all. Before changing targeting, cross-reference Core Web Vitals. If Largest Contentful Paint is over four seconds, a share of what looks like irrelevant traffic is relevant traffic that gave up before the page rendered. That is a performance problem. Fix the page before touching the targeting. **Commercial-intent queries converting under 0.3 percent.** The search-term report is the most honest document in a Google Ads account. If a query like "[product name] price" or "[service] near me" pulls twenty or more clicks with a conversion rate under 0.3 percent, the query is not the problem. The landing experience is breaking the promise the ad made. Read the ad headline and the page H1 side by side. **Mobile share above eighty percent on a desktop-converting offer.** If the offer needs a long form, a configurator, or a high-consideration decision, and mobile takes more than eighty percent of clicks, the campaign is serving into the wrong context. Mobile clicks are cheaper, the bidder optimizes for click volume by default, and the platform never asks whether the offer can close on a phone. Set a device modifier of negative forty percent on mobile, or split desktop and mobile into separate campaigns with separate pages. **Search-term-to-landing-page mismatch above twenty percent.** This pattern catches the most spend in my audits. Sample fifty top-spending search terms, open the page each one landed on, and read the H1. If twenty percent or more of the pairings have a topical gap, the campaign is buying clicks the page cannot close. Final URL expansion on Performance Max and dynamic search ads make this worse by default, because the platform picks the page. Turn off final URL expansion and map every ad group to one page with one promise. If a query needs a different page, it needs a different ad group. **Bot and fraud signatures.** Three patterns flag non-human traffic. Placements with click-through rates above ten percent and zero conversions. Thousands of impressions from a single domain that does not resolve when you visit it. App-bundle IDs that appear in the IAB Tech Lab ads.txt and app-ads.txt validators. On the search side, a single competitor above sixty percent overlap rate in auction insights, paired with an invalid-click rate above fifteen percent in the billing report, points the same direction. Google refunds the invalid clicks it catches. The ones it misses stay in the conversion model and skew bidding. ## The six default settings that cause most of it A targeting setting is different from a targeting choice. A choice is who the campaign was designed to reach. A setting is the toggle the platform applied at creation, before anyone read the help article explaining what it does. Defaults exist to grow platform revenue. In most leak audits, half of wasted spend traces back to four or five settings the founder did not know were on. **Location set to presence or interest.** The Google default serves impressions to anyone who searched something about the target area from somewhere else. A user in Florida searching "best dentist Spokane" matches a Spokane dental campaign. Switch to Presence for every local service campaign and every ecommerce campaign that ships to specific countries. It lives under Settings, then Location options. **Optimized targeting on Display and Demand Gen.** On by default. The label sounds like an improvement. The behavior is audience expansion off the seed. On a clean account with strong conversion signal it can help. On an account with weak signal or a young conversion model, it spends budget learning from bad data. Turn it off until the conversion model has stabilized and volume per ad group clears one hundred a month. **Advantage+ audience on Meta.** The default on many new ad sets. It treats most audience signals as suggestions and expands when the model predicts better performance. The seed matters less every week the campaign runs, and spend drifts toward whichever audience is cheapest. Switch to original audience options for any campaign where the buyer profile is narrow, the AOV is high, or conversion volume sits below fifty a week per ad set. **Device bid modifiers left at zero.** The default treats every device as equal value, which is rarely how the data reads. For most ecommerce brands, desktop converts at one and a half to two times the mobile rate while mobile takes most of the impressions. For most service businesses, mobile carries the calls and desktop carries the form fills. Without modifiers, spend distributes by impression availability rather than by conversion economics. Start at plus or minus twenty percent and adjust monthly. **Content exclusions at default coverage.** Tragedy and conflict are excluded automatically. Mature themes, sensitive social issues, profanity, and embedded video on third-party apps are not. The result is placements no founder would approve if shown a screenshot: parked domains, UGC pre-roll with no editorial review, Performance Max inventory inside mobile game ad units. Settings, then Additional settings, then Content exclusions. Check every box that does not match the brand, on every Display, Video, Demand Gen, and Performance Max campaign. **Ad schedule left at 24/7.** Every new campaign runs all day, every day, ignoring the conversion-by-hour pattern the account already shows. B2B service campaigns usually convert nine to five on weekdays. [Furniture and home decor](/for-home-brands/furniture/) carries volume on evenings and weekends. A local service business with a phone-call goal collects voicemails after hours that never get returned. Pull the day and hour report, and any block converting below half the campaign's best block is a candidate for a pause or a negative modifier. ## Five reports, one sitting Run these five together and the leak stops feeling diffuse. 1. **Search terms filtered to zero conversions, sorted by cost.** Ninety days. Any single query that has spent more than three times target CPA with zero conversions is flagged for review. Ten queries at that level is structural. Read this one carefully before adding negatives: zero conversions is a spend fact, not a relevance verdict. A query returns nothing either because it should never have matched, or because it matched correctly and then failed on a product page, a price, a stock level, or a tag that stopped firing. Check the proper nouns against the live catalog or service list rather than from memory. A brand the business stocks or a practitioner it employs can sit in that list, and blocking it on spend alone removes the buyer instead of the waste. 2. **GA4 paid engagement rate.** Reports, Acquisition, Traffic acquisition, filtered to paid. Under fifty percent means more than half the clicks bought never produced an engaged session. Segment by campaign and landing page, because the leak concentrates in one or two combinations rather than spreading evenly. 3. **The Performance Max placement report.** Insights, then Where your ads showed, then asset-group placements. Any placement taking more than one percent of budget without a conversion is excludable. The report is buried on purpose. Find it anyway. 4. **The geographic report against the service area.** Covered above. The fix is two settings: presence-only location, and campaigns segmented by country or service region rather than negative location targeting, which the algorithm routinely overrides in favor of conversion volume. 5. **The placement report read a second time for bot patterns.** Same report, different question, using the three signatures above. In most accounts, between sixty and eighty percent of wasted spend concentrates in fewer than ten line items across those five reports combined. That concentration is what makes the fix tractable. ## Two accounts where the settings were the story On a B2B distribution account I diagnosed, ninety days of Meta spend ran two thousand dollars against seven hundred seventy-eight thousand impressions. Five hundred eleven clicks. A click-through rate of a sixteenth of a percent and a four-dollar CPC, because the platform was distributing budget across audiences with no purchase intent for the product. Meta has no keyword layer to negative against, so the fix was structural: an audience signal rebuilt from the brand's CRM segments, the objective moved from awareness to conversions, and a frequency cap to stop a broad audience absorbing impressions at zero engagement. On a regional healthcare-services account I work with, ninety days of Meta spend ran just over eleven thousand dollars against 1.2 million impressions and thirty-three thousand clicks. A 2.66 percent click-through rate at a 33-cent CPC reads as a healthy awareness build. The settings audit caught what the dashboard would not. Location targeting sat on presence or interest, the device modifier was untouched against an audience that converted on desktop, and content exclusions were at default coverage on a brand that should never have run on parked domains or embedded UGC video. ## Fixing the misfit structurally Audience misfit is rarely solved with one toggle. The structural fix is three decisions in sequence. Layered audience signals at the campaign or asset-group level, so the algorithm starts from a precise seed. Exclusions at the demographic, geographic, and placement level, so the seed does not drift. And a [tracking stack](/frameworks/tracking-stack/) clean enough to tell wrong-audience signal from mismeasured-conversion noise. Audit the six settings on the first of every month. Confirm location is presence only, that expansion features match the documented audience strategy, that device modifiers reflect the last ninety days of conversion data, that content exclusions are at full coverage, and that the schedule reflects the conversion-by-hour pattern. Run the [Setup Audit](/audit/) against the live account before changing targeting, because half the cases that look like audience misfit are tracking misfires the audience reports are reflecting. The [calculator](/calculator/) quantifies the leak in account dollars. Both are free and ungated. When two of the seven signs fire on the same account, the audit is the next read. The [contact form](/contact/) is open when the diagnosis points at something deeper than a settings change, and [/wasted-ad-spend/](/wasted-ad-spend/) indexes the adjacent diagnostics. ## When is it appropriate to pause underperforming keywords or ad groups? URL: https://connercrowe.com/wasted-ad-spend/when-to-pause-underperforming-keywords-ad-groups/ Published: 2026-05-25 | Updated: 2026-05-26 Answer: Pause a keyword or ad group when one of five conditions holds: spend reaches twice target CPA with zero conversions across 100 clicks, conversion rate sits below half the campaign average across 100 clicks, Quality Score holds under 4 for 30 days, search terms read 80 percent irrelevant after negatives, or contribution margin turns negative. ## Why pause decisions need rules, not instinct Most accounts I audit pause keywords by feeling. A keyword looks expensive in the morning, the operator pauses it, and Smart Bidding loses a learning signal on the ad group for the next two weeks. Pausing without a rule is more expensive than pausing too late, because every paused keyword shifts budget into the next worst keyword in the auction. Six rules below cover ninety percent of the pause decisions a search account needs across a year. Apply them in order. The seventh rule, the statistical-significance caveat, sits underneath all six. ## Rule 1: spend hits twice the target CPA with zero conversions across 100 clicks If a keyword has spent twice the target CPA and produced no conversions across at least 100 clicks, pause it. The 100-click floor matters. At 30 clicks a keyword that converts at the campaign average of 3 percent has a 40 percent chance of showing zero conversions through pure variance. At 100 clicks that probability drops below 5 percent. Two-times-CPA at 100 clicks is the point where the keyword has earned the right to be called a loser rather than unlucky. Exception: branded keywords and assist-heavy queries that show conversions in a path report but not a last-click report. Check the [free 25-page audit](/audit/) attribution section before pausing anything that looks like a branded or upper-funnel term. ## Rule 2: conversion rate below half of campaign average across 100 clicks If a keyword converts at less than half the campaign average over 100 clicks, pause it or move it to a lower-bid ad group. Half the campaign average is the threshold where Smart Bidding starts subsidizing the keyword by pulling budget from better performers. A campaign converting at 4 percent overall is paying twice as much per acquisition on a keyword converting at 1.8 percent. The platform will keep bidding on it as long as the target CPA looks like it might still be hit at the campaign level. The lower-bid ad group move is the softer option. Build a "watch list" ad group with manual CPC bids capped at half the campaign average CPC. Move marginal keywords there. If they recover over 60 days, promote them back. If they stay flat, pause. ## Rule 3: Quality Score under 4 for 30 consecutive days If a keyword sits at Quality Score 3 or below for 30 straight days, pause it or rebuild the ad group around it. Quality Score below 4 means Google is charging roughly double the cost-per-click of competitors bidding on the same query at a score of 8. Thirty days is the window where short-term ad copy variance gets averaged out and the score reflects the structural mismatch between keyword, ad, and landing page. Three diagnostic columns tell you which lever to pull before pausing: Landing Page Experience, Ad Relevance, Expected CTR. Two columns at "below average" usually means the ad group is the wrong home for the keyword. The rebuild is faster than the pause-and-replace cycle on a keyword with real intent. ## Rule 4: zero impressions for 14 days on a budgeted ad group If an ad group has shown zero impressions for 14 consecutive days while the campaign is hitting daily budget, pause the ad group. The 14-day window filters out seasonality and weekend lulls. A budgeted campaign with a frozen ad group means the bid is too low to enter the auction, the keywords have been outcompeted on relevance, or the targeting has collapsed. Pausing returns the budget to ad groups that can spend it. If the campaign is not hitting daily budget and an ad group has zero impressions, the diagnosis is different. The keywords are too narrow or the bids are below the first-page threshold. That is a rebuild, not a pause. ## Rule 5: search terms 80 percent irrelevant after a negative-keyword pass If a keyword's last 90 days of search terms show 80 percent or more irrelevance after a fresh negative-keyword pass, pause the keyword. Eighty percent is the threshold where the keyword is no longer matching the intent it was named for. A broad match keyword that triggers ten relevant queries and forty irrelevant ones is functioning as a different keyword. Adding negatives slows the bleed, but a keyword that needs a hundred negatives to behave is a keyword that should be paused and replaced with the exact-match versions of the queries that converted. The [ad-spend efficiency calculator](/calculator/) shows what percentage of spend on each keyword went to queries that ever converted across the trailing 90 days. Anything below 20 percent is a pause candidate. ## Rule 6: contribution margin turns negative on the keyword If a keyword's revenue minus cost of goods minus ad spend goes negative across a meaningful sample, pause it regardless of conversion volume. This is the rule that catches the keyword that converts well but on the wrong product. A keyword pushing low-margin SKUs at a target CPA that assumed average-margin SKUs is losing money on every click, even though the campaign dashboard shows it hitting target. Pull conversion value by SKU mix on the top thirty spenders every quarter. Pause the negative-margin keywords or route them to a campaign with a tighter ROAS target. ## Pause decision rules summary | Trigger condition | Threshold | Action | |---|---|---| | Spend without conversions | 2x target CPA on 100+ clicks | Pause keyword | | Conversion rate floor | Under half campaign average across 100 clicks | Pause or move to watch-list group | | Quality Score | Under 4 for 30 consecutive days | Restructure ad group | | Impression freeze | Zero impressions for 14 days on budgeted campaign | Check budget and eligibility | | Search-term irrelevance | Above 80 percent irrelevant after negatives | Pause ad group | | Contribution margin | Negative on 30-day rolling sample | Pause or reroute to tighter ROAS target | ## The statistical-significance caveat for small accounts Every rule above assumes the account generates enough clicks for the thresholds to mean anything. Most do not. An account spending three thousand dollars a month on a long-tail keyword set may have keywords that take four months to reach 100 clicks. Pausing at 30 clicks because spend hit two-times CPA throws away the signal before it could form. The fix is to apply the rules at the ad group level on small accounts, not the keyword level. Aggregate ten keywords into one themed group, run the rules against the group's totals, and pause the group if it fails the test across the same thresholds. A rough proxy: if a keyword has spent less than the cost of one conversion at target CPA, the data is too thin to act on. Wait or consolidate. ## Ad group level vs keyword level: which lever to pull The pause lever changes shape depending on what the data tells you. Pause at the keyword level when one or two keywords inside a healthy ad group are dragging the average down. The other keywords keep the ad group's learning signal alive and the budget routes to them. This is the default pause for Rules 1, 2, and 6. Pause at the ad group level when the failure is structural: most keywords in the group share the same Quality Score problem, the same intent mismatch, or the same zero-impression freeze. Pausing one keyword at a time inside a broken ad group buys two weeks before the next one fails the test. Pause the whole group, rebuild the keyword list around the queries that converted, and relaunch with three new responsive search ads. This is the default pause for Rules 3, 4, and 5. When two of the six pause rules fire on the same ad group, the attribution section of the [free 25-page audit](/audit/) is the next read; the [contact form](/contact/) is open when the diagnosis points at something deeper than a settings change. The full [wasted-ad-spend library](/wasted-ad-spend/) covers the rebuild patterns once the pause decisions are clean. ## Which tools can help analyze ad spend efficiency in paid search campaigns? URL: https://connercrowe.com/wasted-ad-spend/tools-to-analyze-ad-spend-efficiency/ Published: 2026-05-25 | Updated: 2026-08-11 Answer: Three tool categories tell you where paid spend went and whether it converted. Native platform reports (Google Ads, Microsoft Advertising, Meta, GA4, Shopify) cover most accounts free. Paid SaaS like Optmyzr, Adalysis, Triple Whale, and Northbeam earns its cost above fifty thousand a month. Diagnostic workbooks force the operator to read their own numbers. ## Free native tools inside Google Ads The platform ships with three reports that diagnose most wasted-spend problems if you read them honestly. The [search terms report](https://support.google.com/google-ads/answer/2472708) is the single most-used report in the account. Filter to ninety days, sort by impressions, and read the top hundred queries the way a stranger would. If a quarter of the list describes products you do not sell or jobs you do not staff, broad match is teaching the algorithm the wrong business. [Auction insights](https://support.google.com/google-ads/answer/2579754) tells you who else is bidding against you and at what overlap rate. A sudden jump in impression share lost to budget, paired with a new competitor in the top three, usually explains a CPC spike that the recommendations tab will not. The [recommendations tab](https://support.google.com/google-ads/answer/3448398) is where founders get burned. Google rates account "optimization score" by counting how many recommendations you accept, and most of those recommendations push toward broader match, higher budgets, and more campaigns. Accepting blind is a reliable way to find an extra fifteen percent of waste inside ninety days. Read each recommendation against the search terms report before clicking apply. If the recommendation expands match types on a campaign already leaking irrelevant queries, decline it. ## Shopify is the ledger, every ad platform is a claim Google Ads reports its own attribution. Meta reports its own. GA4 reports a third. They almost never match, and the gap is where the answer lives. Orders inside the Shopify admin are the source of truth no ad platform can overrule. Every other platform is reporting an attempted attribution of those orders. If Google Ads says one hundred conversions, Meta says eighty, and Shopify shows one hundred forty paid orders for the period, the gap is either organic, email, direct, or double-counting between paid channels. That gap is the question worth answering. Google Ads conversion tracking, set against a server-side tag and deduplicated against Shopify, reports how many orders the platform thinks it earned, by campaign, by keyword, by device. Meta's Events Manager does the same job for Facebook and Instagram with one caveat. Since iOS 14.5, Meta's reported conversions run optimistic against Shopify's order log by ten to forty percent depending on iOS share of your audience. The platform is not lying. It is modeling. Read Meta conversions as directional, not as ledger truth. ## GA4 cross-checked with Shopify or your CRM GA4 is the lens founders most often ignore, because the interface is rougher than Universal Analytics was. Its free funnel exploration and attribution reports do what paid SaaS charges three hundred dollars a month for: last-non-direct attribution across paid search, paid social, organic, email, and direct, rolled up against actual Shopify orders. Two thresholds matter. Google Ads conversions should land within ten percent of Shopify orders attributed to paid search through a last-non-direct model in GA4, and a gap larger than twenty-five percent is a tracking problem, not a performance problem. No bid adjustment fixes it. On a multi-channel account, GA4 paid-channel conversions should land within fifteen percent of the sum of Google Ads and Meta reported conversions, and the GA4 paid total within twenty percent of Shopify's paid-source orders. Wider than that is the same diagnosis. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the deduplication contract and the GA4-to-Shopify reconciliation that closes the gap. The cross-check takes fifteen minutes a week in a spreadsheet. Five numbers: Google Ads conversions, Meta conversions, GA4 paid sessions and conversions, Shopify paid orders, Shopify revenue. The pattern across weeks tells the story no single dashboard does. Funnel exploration also answers what paid-search tools cannot: whether clicks land on the right page and add to cart, or bounce inside fifteen seconds. That is a landing-page problem masquerading as a media problem, and the diagnosis is free. ## Microsoft Advertising, and the one report Google has no equivalent for [Microsoft Advertising](https://help.ads.microsoft.com/) ships the same three reports Google does, plus one Google has no version of. Run the search query report on the same ninety-day, top-hundred read. Broad-match leakage wastes Bing budget the same way, and the same negative-keyword fix recovers it. Bing auction insights skews older and more B2B, and an overlap spike usually means a competitor imported their Google campaigns without rebuilding match types, which inflates the auction until they notice the CPCs are not converting. The recommendations tab carries the Google risk plus a push toward Audience Network expansion. The report worth running monthly is the [syndication partner filter](https://help.ads.microsoft.com/#apex/3/en/56794). Bing serves ads across a partner network of Yahoo, AOL, DuckDuckGo, MSN, and a long tail of syndicated publishers, and the filter splits native traffic from partner traffic. Partner share on accounts I audit runs twenty to forty percent of spend and converts at half to one-third the rate of native Bing traffic. The opt-out is a five-minute campaign-level fix and recovers between a hundred and several thousand dollars a month depending on scale. The recommendations tab does not flag it. Optmyzr does not flag it. The native report flags it, and only if you filter by partner. The second Microsoft leak is the one-click import that pulls Google campaigns into Bing. It runs in under a minute and is the biggest source of waste on Bing accounts I audit, because it drops match-type discipline in three places. Phrase-match keywords land as broad, because the mapping defaults to whatever the campaign template prefers. Negative lists do not always travel, and the ones that do sometimes lose their list-level association. Daily budgets carry across at the Google dollar figure, and on a Bing account running near thirty percent of Google volume that budget burns out a week into the month or sits unused. Treat the import as a scaffold: audit match types against the source, rebuild the negative lists, reset budgets against Bing's volume curve. Skipping it is how an account double-pays for the same query on two platforms. [Microsoft Clarity](https://clarity.microsoft.com/) is free, has no row cap on heatmaps or session recordings, and most Bing advertisers skip it because they already have GA4. GA4 reports what happened in aggregate. Clarity shows where the visitor clicked, how far they scrolled, where they rage-clicked, and which sessions ended in confusion. Two campaigns at a one-percent conversion rate look identical inside GA4. Inside Clarity they often do not, because older demographics scroll slower and rage-click small buttons more often, and the page that works for Google traffic sometimes fails on Bing. Fifteen minutes a month, free, and most Bing advertisers run it zero times a year. Microsoft owns LinkedIn, and the [Audience Network](https://about.ads.microsoft.com/content/dam/sites/msa-about/global/common/content-lib/pdf/Audience-targeting-with-Microsoft-Advertising.pdf) ships company size, industry, and job-title signals from LinkedIn profile data, applied as a bid modifier or audience layer on search. Google offers nothing at that fidelity. For legal, financial services, B2B SaaS, and high-AOV consumer categories it is the strongest reason to run Bing at all. For DTC ecommerce it rarely covers the overhead. The rule: if job title or income bracket decides qualification, Bing earns the line item. If the intent signal sits cleanly inside a Google search query, Google-only is enough. The Bing stack is three free tools and fifteen to thirty minutes a month: search query report filtered by partner, Clarity against GA4, and an import audit on every campaign that came from Google. ## Paid third-party audit platforms [Optmyzr](https://www.optmyzr.com/help/) is a real tool. I use it above fifty thousand dollars a month in spend, where the audit cadence justifies the SaaS line item. Its rule engine catches issues a manual review misses, and its quality-score tracker is the cleanest in the category. Below that threshold, free platform reports plus a fifteen-minute weekly cadence does the same work for zero dollars a month. [Adalysis](https://docs.adalysis.com/manage/ads/rsas/overview) is the closest competitor and stronger on responsive search ads. If RSAs are the bottleneck (low ad strength, weak headline variance), it pays for itself faster than Optmyzr. Pricing starts around two hundred ninety-nine dollars a month. SEMrush's PPC toolkit is competitor research rather than account hygiene: the keyword gap report and the ad copy library show what competitors run and how their headlines test against yours. Treat it as a research tool. Most paid PPC audit tools price for agencies running fifty accounts, and a single-account founder paying three hundred a month for Optmyzr buys ninety percent capacity they never use. The [audit pricing breakdown at /google-ads-audit-cost](/google-ads-audit-cost/) walks the market tiers for a one-time senior human review of the same account. | Tool | Category | Cost | Best for | What it catches | |---|---|---|---|---| | Optmyzr | Paid SaaS auditor | $299/mo+ | Accounts above $50K/mo spend | Bid drift, quality score decay | | Adalysis | Paid SaaS auditor | $299/mo+ | RSA-heavy accounts | Ad strength, headline variance | | SEMrush PPC toolkit | Competitor research | $139/mo+ | Researching competitor ads | Keyword gaps, competitor copy | | Google Ads native reports | Free platform tool | Free | Single-account founders | Search terms, auction shifts | | Microsoft Advertising native | Free platform tool | Free | Any Bing-active account | Syndication partner split | | Microsoft Clarity | Free analytics | Free | Any site taking Bing traffic | Heatmaps, session recordings | | Wasted Spend Calculator | Free DIY workbook | Free | Founders under $50K/mo | Directional waste estimate | | Google Ads Setup Audit PDF | Free DIY workbook | Free | Founders auditing their own setup | Structure, match types, tracking | ## Multi-channel attribution platforms [Triple Whale](https://kb.triplewhale.com/) is the most-used attribution platform in the Shopify ecosystem. It connects Shopify, Meta, Google Ads, Klaviyo, and TikTok, then reconciles them into a single revenue view with post-purchase survey data on top. That survey, the one asking new customers where they first heard about the brand, is the strongest part of the product. Pricing starts around one hundred twenty-nine dollars a month and scales with order volume, and most active accounts land between three hundred and seven hundred. [Northbeam](https://docs.northbeam.io/docs/what-is-northbeam) targets the same buyer with a first-party tracking layer and an MTA model (multi-touch attribution) some operators prefer over Triple Whale's pixel reconciliation. It earns its line item where paid social assists and paid search closes, and the founder needs to credit both honestly. Polar Analytics sits below both at roughly one hundred to three hundred a month, trading attribution depth for a cleaner dashboard. All three earn the line item above fifty thousand a month with multiple active channels. Under that the math rarely works: a two-thousand-a-month account paying three hundred for Triple Whale spends fifteen percent of media on tooling for marginal gains. [Hyros](https://hyros.com/) serves a different buyer: info products, coaching, agencies, and long-sales-cycle lead-gen where the conversion is a call booked, a lead captured, or a trip-wire that earns the real revenue weeks later. It tracks a click from ad to lead to sale across email opens, CRM events, and call bookings, then credits the original ad source when the close lands forty-five days later. On a Shopify checkout one click from the ad, most of that machinery is overkill. Pricing is custom, from the low-to-mid hundreds per month into the thousands at scale. Law firms read attribution through [a different lens](/for-service-brands/law-firms/), because the close lands weeks after the click and the closed-case feedback loop is what makes Hyros worth the line item. | Platform | Function | Price tier | Right at spend tier | |---|---|---|---| | Google Ads + GA4 + Shopify | Native attribution stack | Free | Under $50K/mo | | Triple Whale | Pixel attribution + survey | $129 to $700/mo | $50K to $200K/mo | | Northbeam | First-party MTA model | $400 to $1,000/mo | $50K to $500K/mo | | Polar Analytics | Dashboard layer + light attribution | $100 to $300/mo | $30K to $150K/mo | | Hyros | Long sales cycle attribution | Low hundreds to thousands/mo | Lead-gen, info products, high-ticket | ## Custom diagnostic workbooks This is the category most founders skip. A workbook does what a SaaS tool cannot: it forces the operator to type the numbers in, which is the moment most leaks become obvious. The [Wasted Spend Calculator](/calculator/) is a free version of the workbook I run on every paid audit. Enter monthly spend, current ROAS, branded percentage, and conversion rate, and it returns a directional dollar estimate of monthly waste against vertical benchmarks. It does not scan the account live. It turns numbers a founder already has into a number worth acting on. The [free 25-page Google Ads setup audit](/audit/) is the companion document, walking account structure, match-type discipline, conversion setup, audience layering, and Performance Max guardrails one section at a time. A founder running it line by line surfaces most of what a one-thousand-dollar agency audit would, and owns the diagnosis at the end. Neither replaces Optmyzr at scale. Both replace it cleanly under fifty thousand a month. On a Pacific Northwest roofing account I audited, the native dashboard reported twenty-two thousand clicks at a dime each across the trailing ninety days against just over two thousand in spend. A thirty-two percent click-through rate read like a top-decile result. The disconnect was that the campaigns were lead-form objectives where every form open registered as a click, and the form-completion rate was under five percent. The workbook caught it inside one row. Two thousand dollars looked efficient by impression-to-click math and was leaking against completed leads. The tool that found it was a spreadsheet. ## Matching the stack to the spend, then reading it weekly Under fifty thousand a month with one or two channels, native reports plus the GA4 cross-check is enough, and paid SaaS is a distraction because the bottleneck is creative and offer. Above fifty thousand with three or more channels and a Klaviyo flow library, the post-purchase survey alone usually pays for Triple Whale or Northbeam inside the first quarter by reallocating budget away from the channel that takes more credit than it earns. Where the click and the revenue are separated by weeks, Hyros is right regardless of spend. The stack on [furniture and home accounts](/for-home-brands/furniture/) holds the same shape against a longer purchase window. No tool replaces the human read. Open the account once a week. Read the search terms report. Read the top five ad creatives against the landing pages they point at. Confirm the conversion counts in Google Ads, GA4, and Shopify sit within ten percent of each other. Twenty minutes a week, done with attention, beats any dashboard on autopilot. The pattern I see most often: a founder buys a three-hundred-dollar SaaS subscription, never logs in after the first month, and the account keeps leaking. The tool was not the problem. The cadence was. Send the account read-only through the [contact form](/contact/) if you want the platform-fit decision run against live data. The [services overview](/services/) covers how the Google and Microsoft audit passes land inside a paid build, [/pricing](/pricing/) covers the engagement levels, and [/process](/process/) covers the walk itself. [/wasted-ad-spend/](/wasted-ad-spend/) covers the other patterns in the same shape. --- # Blog ## Your blog posts will not get your product recommended URL: https://connercrowe.com/blog/agentic-storefronts-catalog-not-content/ Published: 2026-08-25 Agentic storefronts are on by default for eligible Shopify stores. What gets a product surfaced is the catalog data layer, not the content pages most brands are writing. ## Quick Take Shopify's agentic storefronts push your products into ChatGPT, Google AI Mode and Gemini, Microsoft Copilot, and Meta. Shopify's own documentation says the feature "is active by default for eligible stores," so for most merchants this is already running rather than pending a decision. The part worth internalizing is where the leverage sits. Products reach those surfaces through Shopify Catalog, which means the thing determining whether an agent can recommend you is your product data, not the answer pages and blog posts most brands are producing for AI search. I have spent a lot of the last year on content built to get cited by AI engines. It works for questions. It does not put a product in a shopping answer. ## It is already on Two facts from Shopify's help documentation are worth checking against your own store today rather than taking from me. The feature is on by default where you qualify. Shopify's wording is that agentic storefronts "is active by default for eligible stores," with merchants notified as availability expands. Google AI Mode and Gemini were still described as early access and not available to every store at the time I checked. Participation carries its own terms. Shopify requires you to read and agree to the Agentic Storefronts Supplemental Terms of Service, which is a separate document from the main terms. If nobody at your company has read it, that is the gap to close before you optimize anything. Go look at your sales channel settings and confirm what state you are in. This post is about what to do next, and that answer changes depending on whether you are live, eligible but not enrolled, or outside the eligibility window. ## What Shopify says makes a product legible to an agent This is the part I would not guess at, so here is what Shopify's own guidance names, in its words where I can quote it. **Structure that a machine can parse.** The goal is "structured, machine-parsable, real-time product information" an agent can "directly query, interpret, and act upon." Information that only exists inside a Liquid template or a JavaScript rendering path is not information as far as an agent is concerned. **Pricing and inventory that are true right now.** Shopify's framing is that these "need to be accurate at the moment of the shopper's query," not at the moment something last crawled your site. This is the requirement that quietly rules out a lot of catalog setups. **Variants grouped under one parent.** "Group genuine variants under a single parent so an agent understands that it's one product with options." Stores that split colorways or sizes into separate products read as separate products. **Taxonomy specific enough to match a real query.** Shopify's example is worth copying exactly: use "men's insulated winter boots," not "footwear." Most catalogs I open are sitting at the footwear end of that. **Literal language instead of marketing copy.** The instruction is to "use literal, descriptive language in product fields rather than marketing copy." The adjective stack you wrote to sell the product to a human is working against you here. Notice what is missing from that list. There is no mention of blog volume, no mention of an answer-page library, no content-marketing lever at all. ## Where the effort usually goes instead Almost every brand I talk to about AI search is thinking about it as a content problem. Write the guides, structure the answers, get cited. I run that play on my own site and I believe in it for a specific job, which is getting picked up when somebody asks a question. A product recommendation is a different transaction. When a shopper asks an agent for a 36 inch vanity under a thousand dollars, the agent is not reading your buying guide and forming an opinion. It is querying a catalog. If your product type says "bathroom" instead of "36 inch bathroom vanity," you are not in the result set, and no amount of long-form content moves you into it. The uncomfortable version: the work that gets you cited and the work that gets you bought are two different projects, and most brands are funding only the first one. ## The trap that costs the most time Here is one I hit on a real catalog and would not have predicted. Shopify collection rules match on tags, title, or product type. They do not read your description text. That matters because the instinct is to fix agentic readiness by writing better descriptions, which is the most visible and most satisfying thing to improve. On a catalog where the differentiating attributes lived only in prose, none of that work was reachable by a collection rule, so it could not be used to build the structured groupings that make a catalog navigable. The attributes had to be promoted into tags and product types first. Descriptions came after, and they mattered less than the taxonomy work. The order is taxonomy, then tags, then copy. Doing it in the other order feels productive and moves nothing. ## What to check this week Open your store and answer five questions. None of this needs a developer. Confirm whether agentic storefronts is active in your sales channel settings, and whether anyone has agreed to the supplemental terms. Then pull ten products at random and read their product type field. If the values are category words rather than the phrase a shopper would type, that is your first project. Check whether your variants are grouped under one parent or split into separate products. Check whether your pricing and inventory are accurate in the catalog right now, not merely accurate on the page a crawler saw last week. And read one product description aloud. If it is selling rather than describing, rewrite it as a spec and see whether you lost anything a buyer needed. ## What I am not claiming I am not claiming a ranking formula. Shopify publishes what makes product data agentic-ready, and it does not publish how the agents on those surfaces weight anything, so anyone selling you a ranking model for ChatGPT shopping is guessing. I am also not claiming that content for AI search is wasted. It is the right investment for question intent, and I keep making it. The claim is narrower: it does not substitute for the catalog work, and if you have to pick one, the catalog is the one attached to a transaction. The requirements above come from Shopify's own documentation as it stood in August 2026, and this area is moving quickly enough that it is worth re-reading the source before you plan a quarter around it. If your conversion tracking is not clean enough to tell you whether any of this worked, start with [the Tracking Stack](/frameworks/tracking-stack/) instead. ## The field your Google Ads audit is reading is the wrong one URL: https://connercrowe.com/blog/primary-for-goal-is-a-legacy-field/ Published: 2026-08-25 conversion_action.primary_for_goal is legacy and will make a clean account look broken. The conversion-goal layer is what actually decides what Smart Bidding buys. ## Quick Take If you are auditing what a Google Ads account bids toward, do not read `conversion_action.primary_for_goal`. It is a legacy field. An account can report `primary_for_goal: true` on actions that are not biddable at all, which makes a correctly configured account look broken. I know because I did exactly this on my own account in August and produced a wrong finding: I flagged two Google Business Profile local actions as poisoning the bidding signal when the goal layer had already excluded them. The setting that governs what Smart Bidding optimizes toward is the conversion-goal layer, and it has two levels that have to be read together. ## What the legacy field is doing `primary_for_goal` is a per-conversion-action boolean, and it reads like the answer to "does this count." It used to be closer to that. The account structure moved on and the field stayed, so what you are reading now is a flag that no longer expresses the thing you want to know. The specific failure is that it cannot express a campaign-level override. A conversion goal can be biddable at the account level and switched off for one campaign, and no per-action boolean can represent that, because the state does not live on the action. ## The two levels that do decide Read both of these. Neither one alone is the answer. ``` SELECT customer_conversion_goal.category, customer_conversion_goal.origin, customer_conversion_goal.biddable FROM customer_conversion_goal ``` ``` SELECT campaign.name, campaign_conversion_goal.category, campaign_conversion_goal.origin, campaign_conversion_goal.biddable FROM campaign_conversion_goal WHERE campaign.id = ``` The first gives you the account default. The second gives you what a specific campaign actually does, including where it departs from that default. Resource names come back as `CATEGORY~ORIGIN`, so you will see values like `GET_DIRECTIONS~GOOGLE_HOSTED` and `SUBMIT_LEAD_FORM~WEBSITE`. Origin matters as much as category, because the same category arriving from a Google-hosted surface and from your website are different rows with different settings. ## The gotcha that will invert your reading `biddable` is omitted from the response when it is false. The API drops false and zero values rather than returning them, so a row with no `biddable` key means not biddable. If you parse this assuming a missing key is an error or a null to skip, you will either crash or, worse, silently treat non-biddable goals as unknown and drop them from your analysis. Read it as `.get('biddable', False)` and move on. This is the same omission behavior that bites elsewhere in the Google Ads API, and it is the single most common reason a script's picture of an account disagrees with the interface. ## What still deserves a flag Getting the layer right does not mean the account is fine. It means you now have to check something harder, and `primary_for_goal` was never going to tell you this either. A goal can be correctly biddable while the conversion action underneath it fires on the wrong event. On my own account, `BOOK_APPOINTMENT~WEBSITE` is biddable, which is right. The action feeding it is "Call booked (Calendly)," which sounds right. It fires on a GTM trigger called `book_call_click`, which is the scheduling modal opening. Not a booking. Somebody who opened the modal and closed it counts the same as somebody who put a meeting on my calendar. Under Manual CPC that is a reporting annoyance. Under Smart Bidding it is a direction, and the system will go find more people who open modals. So the audit step is: for every biddable goal, open the GTM trigger behind the conversion action and confirm the event is the outcome, not the intent to start it. Names lie. `book_call_click` is honest about what it is if you read it, and the conversion action's display name is what hides it. ## What to do with this Three passes, in order. Pull `customer_conversion_goal` and write down which categories are biddable. Then pull `campaign_conversion_goal` for every enabled campaign and note where it diverges, because those overrides are usually deliberate and occasionally forgotten. Then, for each biddable goal, trace the action to its trigger and decide whether that trigger is a completed outcome. If the third pass turns up a soft trigger on a biddable goal, that is your finding, and it is a real one. It is also the finding I would have missed entirely if I had kept reading the legacy field, because the legacy field had me looking at two harmless local actions instead. ## What I am not claiming I am not claiming `primary_for_goal` is meaningless everywhere. It still exists, older tooling still reads it, and in accounts that never diverged from account-level defaults it will often agree with the goal layer. The claim is that it is not a reliable basis for an audit conclusion, and agreement in the simple case is not evidence in the complicated one. I am also not claiming this is the whole measurement picture. It tells you what bidding is aimed at. Whether the thing it is aimed at is being counted correctly is a separate question, and the architecture I work through for that is [the Tracking Stack](/frameworks/tracking-stack/). If you want the numbers behind how far apart platforms land on the same event, that is in [the Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/). ## The quarter you plan the year around is your weakest one URL: https://connercrowe.com/blog/q4-roas-trough-not-peak/ Published: 2026-08-25 Three years of purchase-only data from one account: the fourth quarter carried the most volume and the worst return on ad spend, both years I could measure. ## Quick Take On one ecommerce account I manage, I pulled three years of Google Ads performance computed on purchases only, with cart and checkout events stripped out of the value column. The fourth quarter came in below the full-year average both years I could measure it. Q4 2024 returned 4.80 against a 5.59 year. Q4 2025 returned 3.17 against a 3.54 year. That is 14% under the year in the first case and 10% under in the second, in the quarter that carries the most volume and gets planned around hardest. This is one account, N = 1, across two fourth quarters. It is enough that I now run the same check on every account before anyone writes a Q4 plan. ## Purchase-only is the whole trick Most accounts do not have a Conversions column made of purchases. When I measured this directly for the [Ecommerce Tracking Accuracy Benchmark](/benchmarks/ecommerce-tracking-accuracy/), two of the three accounts I could read carried add-to-cart inside the Conversions column at 16.6% to 17.2% of the total, and 19.8% to 25.8% of reported conversion value was cart value rather than revenue. The column still said Conv. value. Cart events do not spread evenly across a year. More people add to cart and walk away in December than in June, because more people are browsing, comparing and price-checking in December. So the contamination concentrates in exactly the quarter you are trying to evaluate. A Q4 ROAS built on a value column that includes cart value reads high, and it reads highest in the quarter where abandonment peaks. That is the mechanism behind the belief. The quarter looks like a peak because the measurement inflates most where the browsing is heaviest. ## The two fourth quarters Same account, same conversion action, purchases only. | Window | ROAS | Against the full year | Gap | |---|---|---|---| | Q4 2024 | 4.80 | 5.59 | 14.1% under | | Q4 2025 | 3.17 | 3.54 | 10.5% under | There is a second way to see it that does not depend on my quarterly cut being right. January through August, purchase-only, came in at 6.10 for 2024 and 3.70 for 2025. The full years landed at 5.59 and 3.54. The only thing that can pull a year below its own first eight months is what happened in the last four. ## The decline underneath the season The seasonal dip sits on top of a longer slide, and the two have different causes. January through August, like for like: | Year | ROAS | CPC vs prior year | Revenue per click vs prior year | |---|---|---|---| | 2024 | 6.10 | | | | 2025 | 3.70 | 1.77x | 1.07x | | 2026 | 3.63 | 1.94x | 1.90x | The 2024 to 2025 step is the entire collapse. Click costs went up 1.77x while revenue per click moved 1.07x, so efficiency had nowhere to go. From 2025 to 2026 both moved together and the ratio held, which is the healthier picture even though the absolute number is lower. One caveat on that last row: the 2025 to 2026 revenue-per-click jump is partly a tracking change on this account and reads closer to 1.55x once adjusted, so treat the direction as solid and the magnitude as soft. This separates two questions people usually merge. Seasonality is one. A structural change in what a click costs is another. If your year-over-year ROAS is down, run the CPC and revenue-per-click multiples before you conclude the algorithm forgot how to work. ## What I do differently because of this I stopped setting annual targets off a fourth quarter. The target comes off a full year, or off Q1 through Q3, and the fourth quarter gets planned as the period where I accept lower efficiency in exchange for volume. I still freeze structural changes before October. The reason changed. It is not about protecting a peak, it is that you cannot read the effect of a campaign restructure against a baseline that is moving underneath you for seasonal reasons. And on a thin-margin catalog, Q4 became the quarter where I check whether the volume is still profitable at that efficiency, rather than assuming the quarter carries the year. ## Check yours in about twenty minutes Open Google Ads, go to the conversion actions view, and confirm which actions are inside the Conversions column. If add-to-cart or begin-checkout are in there carrying value, every historical ROAS figure you have is inflated by an unknown amount and the rest of this exercise will not work until you isolate the purchase action. Then pull ROAS by quarter for three years on the purchase action alone, and put each quarter next to its own full-year figure. You are looking for one thing: whether your fourth quarters sit above or below their years. If they sit below, your planning assumption is upside down, and the number to fix first is the target you carried into the quarter. The full architecture I rebuild accounts on, including how to get a single trustworthy purchase signal, is [the Tracking Stack](/frameworks/tracking-stack/). ## What I am not claiming This is one account and two fourth quarters. It is not a category rate, and I would not put it on a slide as an industry benchmark. One catalog, one competitive set, one set of margins. I am also not claiming Q4 is the wrong quarter to spend into. Lower efficiency at much higher volume can be the right trade when the margin math works and the customers come back. The finding tells you what the number is likely to be. Whether to spend into it is a separate decision, and it is a margin question rather than a ROAS one. What I am claiming is narrow and testable: on the account I could measure across three years, the quarter everybody plans around returned less than the year it sat inside, both times, and the reported figures said otherwise until the cart events came out. ## The Foreign Hostname (Why I Check Where My Analytics Data Came From) URL: https://connercrowe.com/blog/foreign-hostname-analytics-check/ Published: 2026-08-17 Four page paths in my analytics project have never existed on my site. A pitch mockup carried the same public key. The provenance check that finds it. On 11 August I opened the analytics project behind connercrowe.com and found four page paths that have never existed on this site. They had logged about 136 pageviews over the trailing ninety days, filed in the same project as my blog posts and my case studies. They came from a pitch mockup I had deployed on a separate domain, which shipped carrying the same public analytics key as the site. ## Quick Take An analytics property is scoped to a key, not to a site, and that key is public by design. Any page that carries it writes into the property, and the hostname is recorded on every event without anything in the default view marking it as foreign. So the page list in your analytics is not an inventory of your site. It is an inventory of everywhere your key is installed, and I learned the difference because an audit had already built a recommendation on four pages that were not part of the site it was auditing. ## The key is public on purpose PostHog documents the project key, the one starting `phc_`, as a public client-side key that is safe to expose in web and mobile code. It cannot reach your stored data; it sends events and evaluates feature flags, and that is the whole of it. GA4's measurement ID is the same shape of thing, sitting in the page source of every site that uses it. Neither is a secret and neither can be, because the browser has to send the event and the browser holds nothing the reader cannot open and read. What follows from that is the part I had not thought through. If the key is the credential, the origin is not. The hostname rides along as a property on the event, recorded rather than enforced. A browser collection endpoint holding a valid key has no reason to check whether the page that sent it belongs to you, and does not. The vendors do gate the server-side path, which makes the contrast worth seeing. GA4's Measurement Protocol requires a private `api_secret` alongside the measurement ID, and Google's own documentation says to keep it out of client-side code because exposing it lets outside parties post spam into the property. The server door has a lock on it. The browser door is the one standing open, and it has to be, because that is where the measurement happens. ## How it reached my own reports I build navigable mockups to pitch website rebuilds. Each goes up as its own Cloudflare Pages project on its own domain, and one of them started life as a copy of a layout that already carried my analytics snippet. Five of its pages shipped with the key. Four show up in reporting. Then I ran a content audit on my own site, and the audit read the analytics project as the record of what exists on connercrowe.com. It found four thin pages with low engagement, correctly noted they were weak, and produced a consolidation recommendation for them. Every step of that reasoning was sound and the premise underneath it was false. Those pages were never part of the site the audit was about. The 136 pageviews are the trivial part. The audit conclusion is the expensive part, and I found it only because I went looking for the pages in my own repository and could not find them. ## Where this hides on a Shopify brand Pitch mockups are my version of the problem. They are not the common one. A brand accumulates the same foreign hostnames through ordinary work: a preview theme shared for review, a staging store, a `myshopify.com` domain still serving the live theme alongside the custom domain, a wholesale or trade portal on a subdomain, a regional storefront, a landing page a paid-media vendor built and deployed somewhere you never see. Each is a page carrying your key on a hostname that is not the one you think you are measuring, and each contributes sessions to the same property. The `myshopify.com` case is the one worth checking first, because it costs nothing to have and it is on by default. ## The check, and the fix that follows it The check is a hostname breakdown, not a code search. Open the property, break pageviews out by hostname, and read the list. That is what surfaced this, and it is the only step that works regardless of where the offending page is deployed or who deployed it. A local code search finds nothing if the project was a direct upload rather than a repository, if it has since been deleted from disk, or if the key sits in a file type outside whatever pattern you searched. Once the hostname tells you a foreign property exists, the code search tells you which one, and the fix is to strip the snippet from the source and from the built output, redeploy, then fetch each affected page and confirm the string is gone. A stale build directory will republish what you deleted from source. ```bash # Find which local project shipped the key. grep -rl "phc_" ~/Projects --include="*.html" --include="*.js" --include="*.astro" # Then confirm every page that carried it, the root included. for p in / /page-one/ /page-two/; do echo -n "$p " curl -s "https://your-mockup.pages.dev$p" | grep -c "phc_" || true # expect 0 done ``` The reporting side does not clean up after itself. Events already collected stay collected, so every report I run that crosses that ninety-day window carries a hostname filter, and any figure I publish from it says so. Making that permanent in GA4 is more awkward than it sounds. Google documents three data filter types: developer traffic, internal traffic, and web hostname traffic. The hostname filter excludes domains you name rather than admitting the ones you own, so the job of knowing which hostnames are yours stays with you. ## What it costs to skip The direct cost is an audit that reasons correctly from a false inventory. Consolidation plans and redirect maps both start from a list of pages, and if that list comes from analytics rather than from the repository, it can contain pages that were never on the site. The quieter cost lands on rates. A conversion rate is a fraction with sessions on the bottom, and so is every engagement benchmark built the same way. Foreign sessions inflate that denominator with visitors who arrived somewhere else with different intent, so the resulting figure is wrong in a direction the figure itself will not reveal. Hand it to a bidding strategy or print it in a report and the error travels. This belongs in front of [the STACK Audit](/blog/google-ads-tracking-audit-guide/), the five passes I run before letting Smart Bidding optimize against numbers I have not verified. Those passes check whether the signal is emitted, triggered, attributed and valued correctly. None of them ask whether the property is describing the site you think it is, and neither do the eight layers of [The Tracking Stack](/frameworks/tracking-stack/). This is a pre-flight on the data you audit with, ahead of the work of auditing what it says. It is the same family of check as [reading the ad destination before the campaign spends](/blog/preview-flag-ad-destination-launch-check/): a silent failure with no error state, sitting upstream of everything downstream that trusts it. ## The receipts I found and fixed this on 2026-08-11. The mockup was a direct upload to Cloudflare Pages rather than a git project, which is why a repository sweep alone would have missed it and why the hostname breakdown is the step that matters. I stripped the snippet from the project root and from the built output, redeployed, then fetched the live pages and confirmed them clean. I checked nineteen other mockup and landing-page projects on the same machine. All nineteen were clean, so the leak was confined to the one. The historical events remain in the property and I handle them with a hostname filter rather than deleting them. ## What I did not claim I have not measured what the mispremised audit would have cost, because I found the premise before acting on the recommendation. I am not claiming a ranking or revenue effect, and there is no before-and-after here to show. The pageview figure is approximate and I have deliberately not set it against this site's own traffic, since that comparison would imply a materiality I did not measure. I also did not have a stranger write into my property. Both properties were mine, deployed by me, from one machine. That a public key permits an unrelated site to write into a property is documented mechanism rather than something I observed here, and I am reporting it as the former. What this account demonstrates is narrower and more common: a property is scoped to a key, so its page list can include pages that are not on the site you are auditing. Finally, I have not tested every analytics vendor. What is documented is what is written above, for PostHog and GA4. Treat the rest as unknown until you have read their documentation. ## One thing to do next Break your analytics property out by hostname and read the list. If a domain you do not recognize appears, find the page carrying your key before you trust another report built on that property. That part is free and takes minutes. What it will not tell you is which of your reports, dashboards and bidding decisions have been standing on the polluted number, or for how long. If you want that traced, [that is what I do](/contact/). ## Keep going If this hit, the next two pieces in the same universe: - **[The Furniture Brand Whose Revenue Showed Up as Unassigned](/results/unassigned-revenue-dual-ga4-fix/)**. Two installs fighting over one property. Count your installs, then count the hostnames they report from. - **[The Click Text Trigger Trap](/blog/click-text-trigger-trap/)**. The same audit turned on my own site, seven leaks in one container. Free PDF: **[The 25-page Tracking Stack](/freebies/tracking-stack.pdf)**. No email gate. ## The Preview Flag (Why I Check the Ad Destination Before a Campaign Spends) URL: https://connercrowe.com/blog/preview-flag-ad-destination-launch-check/ Published: 2026-08-11 A landing page can be live, fast, and finished-looking while recording nothing. One meta tag decides it. Here is the six-step check I run before any campaign spends. Last week a landing page went live on a client's ad destination with one meta tag set to `preview` instead of `production`. The page loaded. It looked finished. The form accepted a submission and returned a success panel. Underneath, the form never called the API, the analytics tags never loaded, and every lead would have died with the browser tab. The campaign was enabled against that URL. I caught it before a single click was paid for. ## Quick Take Landing pages built for paid traffic usually carry a switch that separates a preview build from a live one. When that switch is wrong, the page still works in every way a person can see. It renders, it takes a form, it says thank you. What it stops doing is recording. So I verify the destination before the campaign spends rather than after the first report comes back empty. Five of the six checks run from a terminal in under two minutes. The sixth needs a person. ## What the flag does The page carries a single line in its head: ```html ``` The page reads that value at runtime and gates everything measurable on it. Set to `production`, the form posts to the lead API and the GA4 and Google Ads tags load and fire. Set to anything else, the form short-circuits to a "Preview complete" panel and never reaches the network call. The tags load nothing at all. The gate is one line of JavaScript, and its bluntness is the point: ```js if (mode !== 'production') { show(LAST + 1); return; } // never reaches fetch() ``` That design is correct. A preview build should be incapable of writing a real lead into a client's CRM, and it should be incapable of polluting a conversion action with test submissions. The flag exists so a staging copy can be circulated for review without any of it counting. The failure mode is that the same property which makes preview safe makes it silent. There is no error state. Nothing turns red. A page in preview mode and a page in production mode are visually identical right through the thank-you screen. The only way to tell them apart is to read the tag or watch the network. ## The morning I found it The build was a paid-only page for a custom furniture maker taking commission work. Static assets on Cloudflare Pages, two Pages Functions behind them, leads flowing to WhatConverts. I was doing a pre-launch pass on the live URL, not the preview URL, and I pulled the raw HTML rather than looking at the rendered page. That is the only reason I saw it. `deployment-mode` read `preview`. The Search campaign pointed at that exact URL and was already enabled. Two other things surfaced in the same pass, both from the same deploy. The first: the repo root had been deployed instead of the `public/` directory, so `README.md` and `.gitignore` were being served at the site origin and both returned HTTP 200 on a live client site. The second: `wrangler` resolves the `functions/` directory relative to the working directory rather than the asset directory you hand it, so a deploy run from the wrong folder ships the static assets without the Functions. The tell is that `/api/lead` starts answering `404` where it should answer `405`. Then a fourth problem, which is the one worth remembering. The apex domain runs on Google Cloud DNS, so it is not a Cloudflare zone. No caching panel, no zone id, no `purge_cache` call. Deleting the stray `README.md` did not evict it. The edge kept serving the deleted file with `CF-Cache-Status: HIT` under a seven-day TTL. The fix was to overwrite the path with new content so the ETag changed, which replaced the cached response immediately. ## The check that runs before the campaign This is now a script rather than a memory. It runs against the live URL, never the preview URL, and it fails loudly: 1. **Read `deployment-mode` from the served HTML.** Not the local file, not the preview origin. Fetch the URL the ad points at. 2. **Confirm both tag IDs and the conversion label are present** in the served markup, and that the bot-protection site key is there too. 3. **Confirm the lead endpoint shipped.** `GET /api/lead` should answer `405`. A `404` means the Functions did not deploy and the form has nowhere to post. 4. **Confirm the production secrets exist on that environment.** Preview and production are separate environments, and secrets set on one do not exist on the other. POST deliberately malformed JSON to the endpoint. `invalid_json` means the secrets are wired. `lead_system_not_configured` means they are missing and the handler is failing closed. 5. **Check every anchor the ads reference.** Sitelinks and price extensions point at fragments. A renamed section turns a sitelink into a scroll to nowhere. 6. **Submit one real lead by hand.** Confirm it lands in the lead system, that the notification email arrives, and that a conversion records against the right action. No script can do this part. Bot protection is enforced server-side, which is the whole point, so a human has to be the one who proves the path works end to end. Steps one through five are automated and take seconds. Step six is the only one that proves anything, and it is the one most launches skip. ## What skipping it costs The cost is not a bad campaign. It is an invisible one. Traffic arrives. Clicks bill. People fill out the form and see a confirmation, so nobody complains. The leads never reach the CRM and the conversions never reach the ad platform, which means Smart Bidding is optimizing against an empty signal and steering budget by nothing at all. Every day it runs, the bidding model learns from noise. The report at the end of the month shows spend and clicks and zero conversions, and the conversation that follows is about whether the offer is wrong or the keywords are wrong. That is a hard hole to climb out of, because the account now has a stretch of history that says the traffic does not convert, and none of it is true. I wrote about that exact symptom in [clicks with no conversions](/blog/max-clicks-zero-conversions/). A misconfigured destination produces the same chart as a genuinely bad campaign. ## The receipts The flag was found on 2026-08-05 on a live Cloudflare Pages deployment with the Search campaign already enabled. The stray `README.md` at the origin returned HTTP 200 and kept serving from cache under `s-maxage=604800` after deletion, which is what forced the overwrite-instead-of-delete fix. `/api/lead` returned `404` until the second deploy shipped the Functions bundle, then `405` as expected. The verification script now checks the deployment flag, both tag IDs, the conversion label, the bot-protection key, all seven sitelink and price anchors, and the endpoint status on every relaunch. Conversions on that page fire only after the API returns a lead id, so the conversion count can never exceed the leads delivered. The measurement architecture underneath is the same one in [the Tracking Stack](/frameworks/tracking-stack/). ## One thing to do next Pull the HTML of the page your ads point at right now and read it. Not the rendered page. The source. If you want the longer version of that pass, the [Google Ads Setup Audit](/audit/) is the twenty-five page checklist I run on accounts before I touch anything, and it is free with no email required. ## What a fractional marketing lead actually costs in 2026 URL: https://connercrowe.com/blog/what-a-fractional-marketing-lead-costs/ Published: 2026-08-11 The 2026 price bands for a fractional marketing lead and a fractional CMO, what moves the number, and how it compares to an agency, freelancer, or hire. ## Quick Take A fractional marketing lead costs $3,000 to $15,000 a month in 2026. Most engagements land between $4,000 and $8,500. A fractional CMO who advises rather than executes runs $5,000 to $15,000 a month, because title pricing anchors higher than work pricing. One-time audits and sprints run $1,000 to $5,000. My own published numbers sit inside those bands: sprints at $2,500 to $7,500, active management from $2,500 to $4,500 a month, and the full fractional program from $8,500 a month. Below I break down what moves a quote inside the band, and what the same scope costs as an agency retainer, a set of freelancers, or a full-time hire. ## The bands, in one place | What you are buying | 2026 monthly range | |---|---| | Single-channel freelancer (Google Ads) | $1,500 to $3,000 | | Single-channel freelancer (email) | $2,000 to $4,000 | | Fractional marketing lead, strategy plus execution | $4,000 to $8,500 | | Fractional CMO, strategy and oversight only | $5,000 to $15,000 | | Multi-channel agency retainer, same scope | $5,000 to $12,000 | | Full-time head of marketing | $120,000 to $180,000 a year, plus benefits | One-time work sits outside that table. Audits and scoped sprints run $1,000 to $5,000 depending on how much gets rebuilt rather than reported on. These ranges come from the proposals founders forward me and the published rate pages I track, and the deeper version with the worked examples is at [how much a fractional marketer costs](/hiring-a-marketer/how-much-does-a-fractional-marketer-cost/). Notice the line that surprises people. Advice-only often costs more than advice-plus-hands. A fractional CMO sells a slice of a calendar and prices against what a CMO would earn. An operator who also builds the campaigns, fixes the tracking, and writes the emails is selling labor and judgment together, and prices closer to what the work is worth. If you have no internal team to direct, the more expensive option is also the one that leaves you with the most to do. ## What moves the number **Whether execution is included.** This is the single biggest variable, and the one most quotes leave ambiguous. Ask directly: who opens the ad account, and how often. A quote that describes strategy, planning, and review without naming who builds the campaign is a quote for advice, and you still need to hire the hands. **How many channels are held.** One channel run properly is cheaper than four. That is why the market rate for a Google Ads freelancer starts at $1,500 while a full-stack engagement starts around $4,000. If a full-stack quote comes in under $5,000, it is either consolidating real work under one person or it is thin in a place you have not found yet. **Seniority of the actual hands.** A junior-team agency retainer and a ten-year operator quote the same number all the time. What differs is who touches the account on a Tuesday. Price per senior hour, not per invoice. **Media spend under management.** Below $10,000 a month in spend, a senior retainer does not pay for itself, and I say so on the call rather than after the contract. Between $10,000 and $30,000, the mid band applies. Between $30,000 and $100,000, the full program band applies. Above that, the floor moves with the scope, because the work does. **Contract length.** Three-month minimums are standard for execution work. Six months is normal for a full program, because channel rebuilds need that long to prove. Twelve-month locks, percentage-of-ad-spend pricing on small accounts, and any contract where the ad accounts do not live under your ownership are all reasons to walk. ## What I charge, and why it is on the page My pricing is published. Every number is on [the pricing page](/pricing/), and it is the number I quote on the call. Sprints are one-time and scope-bounded: $2,500 for a tracking rebuild or a catalog sprint, from $5,000 for a storefront build, from $7,500 for a full imagery library. Ongoing work starts at $2,500 a month for the Foundations on-ramp, which is Google Ads only and async, with a graduation review at month three. The mid retainers run from $3,950 and $4,500 a month on a three-month minimum. The full fractional program, every discipline in one seat with a weekly working session, starts at $8,500 a month on a six-month minimum. I publish it for a selfish reason and an honest one. The selfish reason: a price on a page ends the wrong conversations before they take an hour of my week. The honest one: agencies hide pricing because the discovery process is part of the sell, and a founder who sits through three calls to learn a number is being managed rather than informed. Worth naming where my top sits. The full program floor is $8,500 while strategy-only fractional CMOs quote up to $15,000. That gap is the clearest evidence available that title pricing and work pricing are different things. ## Against an agency A multi-channel agency retainer for the same scope commonly runs $5,000 to $12,000 a month. On paper that overlaps the fractional band, which is why the comparison gets made on price and lost on structure. The difference is where the money goes. An agency retainer funds an account manager, a strategist, a media buyer, and usually a junior executing the daily work, plus the overhead that holds them together. A fractional retainer funds fewer total hours from one senior person. If you need four channels run at real scale at once, the agency has headcount a single lead does not, and I say so. If you need one senior person who understands how the tracking, the feed, and the storefront affect each other, the agency model spreads that understanding across four people and a weekly status call. The seam is the actual cost. Three vendors produce three assumptions about what a conversion is, and the measurement between them belongs to nobody. On one Shopify store I took over, that gap had the account recording two add-to-carts in ten days while the store was selling fine. Nobody was doing a bad job. The work between the jobs had no owner. Fixing it brought ad-attributed add-to-carts to 509 a month, and [the case study has the numbers](/results/sugar-babies-server-side-funnel-events/). ## Against a set of freelancers Assembled at market rates, a typical Shopify stack is a Google Ads freelancer at $1,500 to $3,000, an email specialist at $2,000 to $4,000, and storefront or imagery work billed by project. Call it $5,000 to $9,000 a month for two managed channels before any build work. That is often more than one consolidated retainer, and it always costs more of your time. The unpriced line is you. Somebody has to hold the seams, decide whose number is right when the dashboards disagree, and notice that the email specialist and the ad buyer are describing the same customer differently. On a founder-led company that somebody is the founder, and those hours are the most expensive in the business. Freelancers win when the job is narrow and well defined. One channel, one deliverable, a clear brief. That is a real answer and often the right one. ## Against hiring in-house A competent head of marketing costs $120,000 to $180,000 a year plus benefits, and still needs contractors or tools for the channels outside their background. Nobody is senior in paid search, lifecycle email, feed engineering, and storefront conversion at once. Fractional at $50,000 to $100,000 a year is the bridge until revenue supports the full-time desk. Speed and reversibility differ too. A hire takes months to find and months to ramp, and stays a fixed cost through a slow quarter. A fractional lead is in the account the week the contract signs and ends on the notice period. In-house wins the moment the volume of work exceeds what a part-time senior person can carry, and a good fractional operator will tell you when you have reached that point rather than let the retainer run past its usefulness. ## Who each option fits **A specialist freelancer** fits one narrow, well-briefed job. Under $10,000 a month in media spend, this is usually the right answer, and a senior retainer is not. **A fractional marketing lead** fits a founder-led company spending $10,000 to $100,000 a month on media with no internal marketing team, where the channels, the tracking, and the storefront all affect each other and nobody currently owns the connections between them. **A fractional CMO** fits a company that already has a marketing team and needs direction more than execution. If there is no one underneath to hand the work to, this is the most expensive way to end up still doing it yourself. **An agency** fits multi-channel programs at scale that need headcount, or an internal marketing lead who needs execution capacity underneath them. **A full-time hire** fits when the work has outgrown part-time senior attention and the revenue carries the salary through a bad quarter. If you are still deciding which of those you are, start at [the hiring guide](/hiring-a-marketer/), which walks the comparison without the price framing. If you already know and want to check my numbers against the market, they are on [the pricing page](/pricing/). One last test worth running on any quote you receive. Ask what happens to your ad accounts, your tracking container, and your data if the engagement ends next month. If the answer is anything other than "you keep all of it," the price on the page is not the real price. ## The Shopify Event With No Subscriber (What I Found Auditing My Own Build) URL: https://connercrowe.com/blog/shopify-custom-event-no-subscriber-google-ads-conversion/ Published: 2026-08-03 A Shopify theme snippet published a lead event nothing subscribed to. The conversion was Primary, counted, and recording zero. The audit and rewire. I ran a tracking audit on a Shopify storefront I had built, against the live API and the rendered page rather than against my own build notes. The primary lead conversion was in the account, marked Primary, counting. Its conversion label appeared nowhere on the storefront. The form fired an event on every successful submission. Nothing was listening. No paid traffic had run through it yet, which is the only reason this is a post about a defect instead of a post about a wasted budget. ## Quick Take Shopify lets a theme file publish a custom event with `Shopify.analytics.publish()`. It does not require anything to subscribe to that event. If no pixel subscribes, the call succeeds, the browser reports no error, and the event evaporates. My snippet published on a successful form post and waited for a web pixel to forward it to Google Ads. Neither of the two app pixels installed on the store had any reason to listen for a string I had invented. Check that something is listening before you trust the thing that sends. A publisher with no subscriber is not tracking. ## How the Gap Opens Shopify's Web Pixels API has two halves that are documented separately and shipped separately. The publish half lives in the theme. From a Liquid file you can call `Shopify.analytics.publish('my_store:event_name', event_data)`, and the platform accepts it. That call is fire and forget. It does not return a count of listeners, and it does not warn you when the count is zero. The subscribe half lives somewhere else entirely, in the admin under Customer events, where a pixel calls `analytics.subscribe('my_app:my_custom_event', callback)` and receives your payload on the `customData` field. Nothing binds the two halves at build time. They get matched by string at runtime, inside a sandbox. From the theme's side a miss looks exactly like a hit. That is the whole failure. It is a quieter cousin of the mismatch I describe in [why Shopify conversion tracking stops working](/conversion-tracking/shopify-conversion-tracking-not-working/), where a pixel emits `add_to_cart` and a Tag Manager trigger listens for `addToCart`. In that version a consumer exists and the string is wrong. In mine no consumer had been written at all. The theme half of the work looks finished either way, and both fail without an error. I should say why I reached for the sandbox at all, because that is where the defect starts. The lead form is a theme page, not checkout. It never needed the Web Pixels sandbox. I wired it that way out of habit from checkout work, where the sandbox is the only option, which is the scope I set out in [what Checkout Extensibility breaks](/conversion-tracking/shopify-checkout-extensibility-tracking/). ## The Audit Path I stopped reading my own build notes and searched the rendered storefront for the conversion label string. Zero occurrences. The label existed in Google Ads and existed nowhere in the HTML the browser receives. Then I opened the snippet. It fired on a successful post, exactly as designed, and published a neutral custom event. Then Shopify admin → Settings → Customer events. Two app pixels listed. One does session recording and the other fires its own standard ecommerce events, so neither had any reason to subscribe to a custom event name I had made up, and neither carried the conversion label it would have needed to forward it correctly if it had. The same pass turned up two more conversion actions counting nothing, one duplicating a purchase that already had a working action and one pointed at a page no visitor could reach. Both went to Secondary, on the source-emission and tag-trigger layers of [the STACK Audit](/blog/google-ads-tracking-audit-guide/) that I run on every inherited account and had not yet run on my own. The pattern across all three is the same one I found in [my own Tag Manager container in May](/blog/click-text-trigger-trap/). Primary, in the Google Ads interface, describes a row in Google's database. It says nothing about whether the label exists in your HTML. My pre-launch sweep on this build covered copy and schema, and measurement was not in that pass, which is how a dead conversion cleared a checklist I wrote myself. ## The Rewire, and Why I Did Not Add a Tag The fix was to stop routing a theme-page conversion through the pixel sandbox and fire it on the page. Google documents this directly. Its [custom pixel limitations page](https://support.google.com/google-ads/answer/16000892) says that running Google tags inside Shopify's custom pixel feature is not a supported implementation, and names what may not work correctly from that sandbox, including enhanced conversions, phone call conversions, consent mode URL passthrough, cross-domain measurement, conversion verification and troubleshooting, and setting up conversions with a URL. Enhanced conversions matter most for a lead form, because the hashed email the form already collects is the whole reason to collect it. Google's recommendation for sitewide measurement is its own Google & YouTube app. Before writing anything I measured what the page already had. On this store the app had injected gtag into the main document and configured the Ads conversion ID with `send_page_view: false`, and the Google click identifier cookie was already being set first party. A second Google tag on top of that would have fought the app and risked double counting, which is the failure I would have created while fixing the first one. So the snippet stopped publishing into the sandbox and started firing through the queue that was already there: ```js // Before: published into the Web Pixels sandbox, where nothing subscribed. Shopify.analytics.publish('my_store:enquiry_submitted', { value: 1 }); // After: fire on the page, reusing the gtag the Google & YouTube app installed. window.dataLayer = window.dataLayer || []; window.gtag = window.gtag || function () { window.dataLayer.push(arguments); }; gtag('event', 'conversion', { send_to: 'AW-XXXXXXXXXXX/YourConversionLabel' }); ``` The `||` on that middle line is the part that matters. It reuses the app's gtag if one is present and only defines a shim when it is not, so the store still runs one Google tag rather than two fighting over the same conversion. I verified it the way I verify any of these. Fire a real submission, watch the network, confirm the request to `googleadservices.com/pagead/conversion/` leaves the browser carrying the conversion label. A 200 on that beacon is the first evidence that any of it works. Before that, all I have is my own build notes, which is what put me here in the first place. ## What This Shape of Defect Costs An account in this state does not look broken. The conversion action reads Primary and counted. The pixels are listed under Customer events. The storefront serves fine. Every surface a person checks in a hurry is green. Then a budget goes live on an account in this state, and Smart Bidding optimizes toward a conversion it will never observe. Maximize conversions with no observable conversions spends the budget on whatever proxy the auction offers, and the account's own reporting agrees with the bid strategy that nothing is happening. The damage compounds, because the first read of flat conversion volume is usually a media problem, so the next month goes to keywords and creative while the measurement layer stays dead underneath. [The contractor whose only website conversion had been dead since somebody renamed a form button](/results/dead-form-conversion-fix/) is the version of this that ran for months before anyone found it. If you are the founder paying for this rather than the person building it, the question to ask whoever owns your stack is not whether tracking is set up. It is what evidence they have that the conversion left the browser, and when they last looked. A screenshot of a green conversion row is not that evidence. A network capture of the beacon is. ## What I did not claim Any recovery. No paid traffic has run through this account, so there is no lost-conversion figure, no before-and-after, and no performance result to point at. I cannot tell you what the defect would have cost and I am not going to estimate it. I also did not claim the account is clean now. Enhanced conversions for leads is not live end to end. Two items on my own audit list are marked unverified rather than passed, for the access reason below. What is claimed is narrow and checkable: a Shopify theme file can publish a custom event that nothing subscribes to, the platform raises no error when that happens, and the conversion will read Primary and counted in Google Ads while recording zero. The defect was in my own build, it survived my own build notes, and it took reading the page instead of the notes to find it. ## The Receipts The audit ran through the Google Ads API and against the rendered storefront rather than through the Ads interface, because the browser profile signed in at the time was the wrong account. That is a real limitation and it is why two items on the list, the auto-apply recommendation settings and the GA4 key event mappings, are marked unverified rather than passed. Fixed and confirmed: the lead conversion beacon reaches `googleadservices.com/pagead/conversion/` carrying its label. Applied and re-read after writing: two conversion actions demoted from Primary to Secondary, leaving one Primary purchase and one Primary lead. Enhanced conversions for leads is not yet live end to end, and I am not claiming it. One correction to my own first pass, since it belongs here. I flagged an Add Payment Info action as miscategorized and withdrew it before applying anything. There is no add-payment-info value in the conversion category enum, which I confirmed by reading the enum live. The app had it right and I had it wrong. The client is unnamed by agreement. ## Keep going If this hit, the next two pieces in the same universe: - **[The Click Text Trigger Trap](/blog/click-text-trigger-trap/)**. The same class of silent failure in Tag Manager, found on my own container. A trigger that matches nothing raises no error either. - **[The Bing pixel that said YOUR_VALUE_HERE](/blog/bing-pixel-your-value-here/)**. Eleven findings inside an inherited Shopify tracking stack, including tags that were installed and firing into nothing. Open your storefront's rendered HTML and search it for your conversion label. If the string is not there, the conversion is not there, whatever the account says. The checkout-extensibility half of this, what it breaks and the order to fix it in, is at [Shopify Checkout Extensibility and tracking](/conversion-tracking/shopify-checkout-extensibility-tracking/). Free PDF: **[The 25-page Tracking Stack](/freebies/tracking-stack.pdf)**. Layer 1 is source emission, which is the layer this defect lived on, and it covers the post-2025 Shopify checkout extensibility audit that decides which events belong in the sandbox and which do not. The layer map is at [/frameworks/tracking-stack](/frameworks/tracking-stack/). No email gate. ## The Ad Manager Job Is Going Away. I Know Because It Was Mine. URL: https://connercrowe.com/blog/selling-the-system-not-the-hours/ Published: 2026-07-28 An honest account of the system I run, what it has produced, where it breaks, and why marketing gets bought as a subscription rather than as hours. ## Quick Take Two years ago my job was logging into ad accounts and doing things by hand. Pull the search terms, add the negatives, move the bids, write the report. That job is disappearing and I would rather say it out loud than pretend it isn't happening. What replaced it, for me, is a system that carries every client I have ever worked on and gets better each time I use it. Clients don't pay me for hours anymore. They pay for access to that. Below is what it is, what it has produced, where it breaks, and the part I have not built yet. ## The Call That Made the Point Last week a furniture maker in Illinois booked a call with me. He builds custom tables, five to fifteen thousand dollars each. He had just finished ten months with an agency: twelve leads, one sale. I asked how he found me. He said ChatGPT. He had typed in a description of his business and asked for someone who would fit a company his size instead of an agency. It gave him my name. No ad. No referral. No Google search in the way that phrase meant something three years ago. I have spent about a year building content specifically so machines would read it and recommend me. Forty-five answer pages sitting at [/wasted-ad-spend/](/wasted-ad-spend/), written to be quoted by an AI rather than skimmed by a person. That call was the first time a stranger arrived through it and told me so on the record. That is the whole thesis in one meeting. The front door moved. The people who noticed early are getting the traffic. ## What I Used to Sell I was an ads manager. Good one. The work was real: search term reports, negative keyword sweeps, bid adjustments, monthly reporting. Every one of those tasks is now something I can hand to a machine and check. I am not being dramatic about this. On a call this month I told a peer that ads managers are being replaced and that I had pivoted my whole business because of it. I meant it. If your entire value is executing a checklist inside an ad platform, the platform is coming for that job, and so is every operator who wired up a system to do it. The mistake is thinking the answer is to do the same job faster. It isn't. The job changes shape. ## What I Run I want to be specific here, because "I use AI" has become a meaningless sentence. **A memory bank.** An Obsidian vault, 232 notes as of this morning. Every client, every project, every landing page, every mistake I have made and the rule I wrote so I would not make it twice. Plain markdown files. Nothing proprietary. I wrote about why plain files beat buying a memory product in [Your AI Agent Doesn't Need a Brain](/blog/your-ai-agent-doesnt-need-a-brain/). The notes link to each other. A landing page note for one client connects to the skill that built it, which connects to three other clients where the same approach worked. When I start work on an account, the agent reads that web first. I am not briefing it from scratch every session. It knows how that business talks, what the owner has already rejected, and what went wrong in March. **112 skills.** Repeatable procedures written down: how to build a PMax campaign, how to audit a Shopify storefront, how to verify a Google Ads change before it goes live, how to write in a specific client's voice. Each one is a file the agent loads when the task comes up. **A headless Mac Mini.** Sits under my monitor with no screen attached. It runs the recurring jobs on a timer: call scoring for a law firm every weekday evening, a lead engine Monday morning, blog drafts for two stores midweek, negative keyword sweeps, monthly client reports on the first of the month, an operations brief to my inbox at 8:30 every morning. That is the honest inventory. Files, procedures, and a cheap computer running scheduled scripts. ## The Part Most People Get Wrong Here is where I want to correct something I have said too loosely on sales calls. When I describe this, it is easy to make it sound like an autonomous agent waking up each morning and thinking about your account. It isn't that. Most of what runs on a schedule is deterministic. Python scripts, cron jobs, a fixed pipeline. The language model gets used at specific points where judgment or writing is needed, and the output goes through a verification gate before anyone sees it. My monthly report system, for example, pulls the numbers deterministically, makes exactly one model call per client to write the narrative, and then runs a three-layer check: numbers against the cards, banned phrases, and anomaly smell tests. Anything that fails gets a REVIEW_ prefix and never reaches a client as finished work. The reason it works is not that the AI is smart. It is that the system is boring and the context is good. A model with no memory of your business writes generic garbage. The same model with two years of notes about your business writes something worth reading. Same idea I used when [an agent built my tracking stack](/blog/agent-built-my-tracking-stack/). The leverage is in the context, not the model. ## What It Has Produced Real things, with the caveats attached. I closed an engagement this month with a manufacturer who had interviewed seven agencies before picking me. Their last vendor ran ads through the vendor's own ad accounts, showed them charts of clicks, and produced one accidental purchase against a fifteen thousand dollar invoice. What closed it was not a clever deck. On the call I shared my screen and walked them through the vault: here is every note about your business, here is how it connects to other work, here is the rule I wrote after I got something wrong. Their technical guy's verdict was that it looked like I was using AI properly. That was the deal. One store I have run since last summer went from roughly $20,000 a month in orders to $49,000 within two months of the ads going live. This January through March, with Google and Meta running together on about $4,000 a month of combined ad spend, it did $87,131, then $92,365, then $116,129. I had been quoting those three months from memory on sales calls, so before writing them here I re-pulled them from the raw order records. The recall held to the dollar. And to keep this honest: the account in the next paragraph, the one whose Performance Max fell off a cliff, is the same store. The curve is real. So is the dip that followed it. Both live in the same order records. The system also catches things I would have missed. On one account this month it surfaced that Performance Max efficiency had fallen off a cliff, ROAS from roughly 14.9x down to 3.5x and cost per acquisition from about $100 to $408, while click volume went up. Traffic quality collapse, not a demand problem. Then it found the worse thing. That account's historical numbers had been inflated for months, because the Shopping campaigns were counting add-to-cart and begin-checkout events as conversions. One month showed $146,618 in "conversions" with zero purchase value behind it. Real purchases over five months were about ten. I had to go tell the client that the good numbers were not real. That is the least fun conversation in this business and it is exactly the conversation the system exists to force. ## Where It Breaks If I only told you the wins this would be another AI hype post, and I have [written about spotting that](/blog/spotting-ai-in-your-own-writing/). The agent on that Mac Mini crash-looped 262 times in a single day because one invalid line got written into its config. I found out because it went quiet. Before that it ran the API bill to about $56 a day by dragging a 207,000 token conversation into every single call. I fixed it by resetting the session nightly, not by anything clever. It has run out of API credits mid-week and silently stopped. I now have a watchdog that checks its health every five minutes, restores the last known good config, restarts it, and emails me what it did. I built that because the thing failed, not because I planned well. The other honest limit: the AI is worse than me at knowing what matters. It will happily produce a competent report about the wrong thing. Every client-facing output still goes through me. When I tell a client they are paying for access to me, the access is the part that keeps the machine pointed at the right problem. ## Where I Think This Goes My read, stated plainly so you can hold me to it. The single-channel specialist role goes first. Nobody is going to pay a person a monthly fee to log into Google Ads and add negative keywords, because that is now a scheduled job. Most mid-market agencies follow. Not the top tier working on enormous accounts, but the ones charging a startup two grand a month to have three junior people each touch one platform. That model is a stack of individual jobs, and the jobs are what is being automated. I think five years is the outside number. That is a claim about a pricing model, not about the people inside it. The good shops already know. Some of the sharpest operators I know work at agencies and are rebuilding the same way I did, and the ones who move will come out of this fine. The ones billing the same retainer for work that now runs on a timer are the ones with a problem. What replaces it is a subscription to a system that has context. Not a person selling hours, and not software you have to operate yourself. Someone who has built the accumulated record of what worked across many businesses, plugged you into it, and stays personally responsible for the outcome. The value compounds because every client makes the system better for the next one. Here is the part I have not built and will not claim I have: landing pages that update themselves against live campaign performance, season, and trend, with no human in the loop. Right now I can build a page fast, informed by data about which pages converted before, and change it quickly when the numbers move. That is assisted, not autonomous. The autonomous version is where I am pointing everything, and I will write about it when it is real rather than when it is a slide. The reason I am doubling down anyway is that the market has not caught up. Almost nobody selling marketing services right now has this built. That gap closes, and the people who started early will have years of context that the late arrivals cannot buy. ## What This Means If You're Buying You do not need to care about any of my tooling. Most of my clients don't, and I have stopped showing them the vault unless they ask. What you should care about is the shape of what you're buying. If you are paying an agency and your point of contact is a junior account manager reading you a dashboard, you are paying for a job that is being automated, at the price of a person doing it by hand. If you are being sold "AI-powered" anything with no explanation of where the context comes from, it is a model with no memory of your business writing generic output. You can tell because it reads generic. The question worth asking a vendor is simple. What do you know about my business that you would still know six months from now if the person on this call left? If the answer is a folder of PDFs and one account manager's memory, that is the risk. I am not selling you a quick fix, and I will never promise you a number. You are paying for the work and for the system the work runs through. That is the whole offer. If you are still working out which shape you are buying, the comparison is at [freelancer, agency, or fractional marketer](/hiring-a-marketer/freelancer-vs-agency-vs-fractional-marketer/), and the number at [what a fractional marketer costs](/hiring-a-marketer/how-much-does-a-fractional-marketer-cost/). If you want the diagnosis before the engagement, that is what [the paid audit](/audit-request/) is for. It is written-first, no call required, and if I think the fix is upstream of anything I would run, I will tell you that instead of selling you a retainer. ## 44 Agents Tried to Break My Case Studies. Three Succeeded. URL: https://connercrowe.com/blog/44-agents-fact-checked-my-case-studies/ Published: 2026-07-17 I reviewed my own five case studies and passed clean. Then 44 AI agents were told to refute the copy. They found 38 problems. Here is what that means. Last month I finished five case studies for this site. Real accounts, real numbers, each one traced back to the source report. Before publishing I ran my usual pass: the voice check, the fact check, the read-aloud. It came back clean. Then I pointed 44 AI agents at the same five case studies and told each one to assume the copy was wrong and prove it. Between them they raised 38 findings. Three would have embarrassed me. The lesson was not that AI makes a good editor, though it does. The lesson was about my own clean pass. I wrote the copy, I checked the copy, I signed off on the copy, and an adversarial reader still found a client-data leak, an overclaim, and a number I could not trace, all in work I had just called finished. Your own review of your own work is the least reliable review you run. ## How the 44 agents were set up The structure is the part that matters, because "ask ChatGPT to check it" does not do this. I split the review into six dimensions: factual accuracy, client confidentiality, voice, internal consistency, overclaiming, and links. For each dimension I ran a set of independent agents, and every one got the same instruction. Refute by default. Do not confirm the claim, try to break it. Assume a number is wrong until you cannot prove it is. Assume the client can be identified until you have checked every figure. Forty-four agents in total, each hunting for what was not right, none able to see the others' work or lean on my confidence that the copy was done. That last part is the point. I could not talk them out of a finding, because they never heard me call it finished. ## The three that landed Thirty-eight findings came back. Most were small: a link to tighten, a sentence that read templated, a stat that needed its source line. Three were not small. One case study about a consent-tracking fix said two platforms had been reporting zero conversions. The account's own history showed one of them had already been corrected before my window. I had overstated the break. Scoped it down to what was true. One case study printed a client's exact cost per click. Anonymized everywhere else, and I had still left a real dollar figure a competitor could use. Changed it to a relative multiple. One live figure on a results page, a shopping-campaign lift, I could not trace back to a report when the agent pushed me to. If I cannot source it, it does not ship. Pulled it and replaced it with a number I could stand behind. None of those were lies. Each was the kind of thing that happens when you are close to your own work and reading for confirmation instead of for holes. ## Why your own pass misses them When you review your own writing, you are not checking it. You are re-experiencing writing it. You remember what you meant, so you read what you meant, not what is on the page. You remember tracing the number, so the number looks sourced even where the citation is missing. Confidence is the problem, and you have the most confidence in the work you just finished. Catching an AI tell in your own prose is the easy version of this. Catching a false number you believe is the hard version. An adversary has none of that. It did not write the sentence, it does not know what you meant, and you told it to assume you got it wrong. It reads what is there. That is why refute-by-default matters more than the model behind it. A friendly reviewer confirms. An adversarial one breaks. Only the breaking finds the leak. ## I did it again this week The home-services cost-per-lead post on this site went through the same thing before it shipped. Three agents, refute by default, and they caught two problems my own pass had waved through. The draft was about to cannibalize an existing page of mine, competing with it for the same search, and I had a number backwards. Both fixed before anyone saw them. I do not publish account work here without running it now. ## What I did not claim Not that the agents wrote or fixed anything. They found, I decided and rewrote. And not that this makes the case studies perfect. It makes them checked by something other than the person most motivated to believe they were done. That is a lower bar than perfect, and a much higher one than a self-review. ## The receipts Five case studies, one 44-agent adversarial workflow across the six dimensions above, 38 findings raised and dispositioned, three rated high severity and fixed before publish. The five are live on the [results page](/results/), and each one carries a "what I did not claim" section. That habit is the same instinct, written into the copy itself: name the thing you are not saying, so the thing you are saying can be trusted. A claim that survived an adversary is worth more than one you only reviewed yourself. ## Keep going - **[Spotting AI in your own writing](/blog/spotting-ai-in-your-own-writing/)**. The manual version of one of those six dimensions, the tells you learn to catch by hand. - **[Your AI agent doesn't need a brain](/blog/your-ai-agent-doesnt-need-a-brain/)**. Why the structure around the agents matters more than the model inside them. The same reason refute-by-default works. Free PDF: **[The Voice Audit Checklist](/freebies/voice-audit-checklist.pdf)**. The by-hand version of the voice dimension, the one I still run first. No email gate. ## What's next The five case studies at the [results page](/results/) are the ones that came out the other side of all 44 agents. The leaked CPC is gone, the overclaim is scoped down, the number I could not trace is replaced. If you are deciding who to trust with your accounts, the section to read is not the win. It is the "what I did not claim." That line is the difference between someone showing you their work and someone showing you only the parts that flatter it. ## Cost Per Lead Is the Wrong Number for Home Services URL: https://connercrowe.com/blog/cost-per-booked-job-home-services/ Published: 2026-07-17 Cost per lead is the wrong number for home-services ads. How to compute cost per booked job, and why the cheap lead usually loses. The cheapest lead in my book of home-services accounts costs $80. The most expensive costs $309. And the cheap one often has the worse economics. That is the problem with judging Google Ads on cost per lead. The number that looks best is frequently the one you should trust least. Cost per lead tells you what it cost to make the phone ring. It says nothing about what it cost to book a job, and the job is the thing that pays you. The number that should run a home-services account is cost per booked job. Here is how to get it, and why the cheapest lead is often the worst deal on the board. ## What the dashboard shows you, and why it varies Across twelve home-services accounts I manage, cost per lead over ninety days ran from about $80 for a lawn-care lead to $309 for a roofing lead, with a median near $128. The order tracks job value. Septic and lawn leads are cheap because the jobs are smaller and the search is specific. Someone typing "septic pumping near me" is close to booking. Roofing and landscaping leads cost more because the jobs are larger and more of the clicks are early-stage shopping. The spread is about four times, which is the first reason a borrowed benchmark is useless. A number you read for HVAC tells you nothing about what a fencing lead should cost. The full trade-by-trade table, pulled from the same accounts, is on the [home-services benchmark page](/home-services-paid-search-benchmarks/). There is a second problem underneath the first. In a good share of the accounts I audit, the conversion the dashboard counts is not a real lead: every phone call scored as a win, or no call tracking at all. I broke down what that looked like across these same twelve accounts on that benchmark page. Assume for the rest of this that your tracking is clean. Cost per lead is still not the number to manage on. ## The number that gets you paid A lead is not a customer. A booked job is. To get from one to the other you need two figures Google does not have: your close rate and your average job value. The math is simple. Cost per booked job = cost per lead ÷ close rate. Take the roofing account. A $309 lead sounds expensive until you run it through. Close one in four of those leads and each booked job cost about $1,240 in ad spend. Against a $15,000 roof, that is a rounding error. Now the septic account at an $84 lead, near the bottom of the book. Close one in three and each booked job cost about $250. If that job is a $400 pump-out, more than half of it went to Google. If it is a $6,000 drainfield repair, it is one of the best numbers you own. Same lead price, opposite verdict, and the dashboard cannot see the difference. That is the whole point. The cheap cost per lead is not automatically the better account. Your close rate and your job value decide it, and those two inputs can flip which trade is winning. Run your own numbers here, not mine. The close rates and job values above are illustrations. Yours are the ones that matter. ## Why this comes back to your tracking Here is the catch that makes the booked-job number hard to chase. Google's Smart Bidding optimizes toward whatever you set as the conversion. Set it to "lead" and it buys you more leads, cheap ones, whether or not they book. It cannot see which leads became jobs, because that happens in your CRM days later, off the platform. So the only way to make the algorithm chase booked jobs instead of phone rings is to send the booked job back to it. That is the rebuild I run on every service account, in this order: 1. Make one qualified lead the single primary conversion. Not every call. Not every form. The one action that means a real person wants real work. 2. Track calls properly, with a minimum call duration, so a fourteen-second wrong number does not get counted as a lead. 3. Feed the booked job back to Google. When a lead becomes a scheduled job in the CRM, send it back as an offline conversion with its dollar value attached. Once the booked job and its value flow back, Smart Bidding stops chasing $84 leads that never book and starts chasing the ones that fill the calendar. The full architecture for that loop is the [Lead Quality Stack](/frameworks/lead-quality-stack/). ## What it costs to leave it Leave it and you keep managing on the cheap number. The account that counts every call as a win will show you a $40 lead and look like your best performer, right until someone asks how many of those calls turned into jobs. Budget flows to the lowest cost per lead, which is often the account learning the least. The truth is one query away, and it is the first thing I pull on any account. Trace a month of leads to the jobs that closed. The gap between what the dashboard reported and what the calendar shows is the whole story. ## Keep going If this hit, the next two pieces in the same universe: - **[The CLOSE Audit: the 5-pass lead-quality walkthrough](/blog/close-audit-service-business-lead-quality/)**. The diagnostic that finds why the conversion behind your cost per lead is wrong in the first place. - **[I switched a law firm off Max Clicks](/blog/why-conversions-win-over-clicks/)**. The same booked-job rebuild, run on a $14K/mo legal account, 38% to 72% qualified-lead share over ninety days. Free PDF: **[The 25-page Lead Quality Stack](/freebies/lead-quality-stack.pdf)**. The full architecture for feeding booked jobs back to Google. No email gate. ## What's next If you run a home-services account, run one number this week: your cost per booked job, not your cost per lead. If you want me to run it with you, that is the [free Lead Quality Audit](/for-service-brands/#audit). I look at your conversion setup, your call tracking, and whether your booked jobs make it back to Google, then I tell you which of your numbers are real. ## I Dismissed 1,476 of Google's Ad Recommendations Last Week URL: https://connercrowe.com/blog/google-optimization-score-recommendations/ Published: 2026-07-17 Dismissing a Google Ads recommendation raises your Optimization Score, the same as accepting it. I cleared twenty accounts by dismissing 1,476. Last week I dismissed 1,476 of Google's ad recommendations across twenty accounts. Every account's Optimization Score went up. That is the tell. Optimization Score rises whether you apply a recommendation or dismiss it. It measures whether you have cleared Google's to-do list, not whether the account makes money. I cleared the list on those twenty accounts by adding 97 keywords by hand and dismissing the other 1,476. The scores climbed toward 100, and nothing about the accounts had changed. ## What the score counts Optimization Score looks like a health grade. It is a percentage, it sits at the top of the account, and a Google rep or an agency will tell you to push it to 100%. It is not a health grade. It is the share of Google's open recommendations you have addressed, and you address one in two ways: apply it, or dismiss it. Ignore a recommendation and it drags your score down. Dismiss that same recommendation and your score goes up. Nothing about the account changed. No performance moved. You cleared the item. So a 100% Optimization Score tells you one thing for certain: someone went through the recommendations tab. It does not tell you the account makes money. ## Most of the recommendations point one way Read what Google generates and the pattern shows up fast. Broaden your match types. Turn on search partners. Add display expansion. Raise your budget. Switch to a broader bid strategy. Add these eighty keywords. Almost all of them widen the net toward more of Google's inventory and more of your spend. A few are useful, like a specific budget note or a weak responsive ad flagged for a rewrite. Most are the house suggesting you bet more. That is not a conspiracy. Google's recommendations optimize for Google's outcome, which is spend across more surfaces. Sometimes that lines up with yours. Often it does not. Optimization Score is the scoreboard for a game the house designed, and it is one move in a wider pattern I keep mapped in [the wasted-ad-spend library](/wasted-ad-spend/): the platform's own advice almost always points toward spending more. ## What I did on the twenty accounts The flag was real. A thin ad group gets starved, so "not enough relevant keywords" is worth clearing. But the fix Google wanted was a bulk-accept of its keyword list, which on these accounts meant broad, out-of-area, and off-service terms that would spend before they converted. So I cleared it the other way. On each account I added only the keywords that were locally viable and on-service, the ones a real customer in that market types. That came to 97 across the twenty. Then I dismissed the remaining 1,476, because a dismissed recommendation is a reviewed recommendation, and reviewing them is the real work. The warning cleared on all twenty, zero recommendations left open, and scores that had been sitting anywhere from the low seventies to the high nineties walked toward 100. Not because I improved anything that hour. Because I emptied the list. ## The rule I run now Treat the recommendations tab as a to-do list to review, not a score to chase. 1. Apply the few that fit your strategy. Budget notes and ad-strength fixes usually earn it. 2. Dismiss the rest deliberately. Broad match, search partners, display expansion, and "switch to a broader bid strategy" get dismissed on sight on a lead-gen account. 3. Turn off auto-apply. Leave it on and Google applies its own recommendations to your account overnight, bid-strategy changes included, with no human in the loop. I have opened accounts that quietly rebid themselves this way. Google regenerates these recommendations constantly, so the list refills within weeks and the score slips again. Clearing it is a monthly pass, not a one-time fix. Do that and your Optimization Score reads high, which is fine. Know it reads high because the list is empty, not because the account is winning. The number that says the account is winning is cost per booked sale, and it does not live in the recommendations tab. ## What I did not claim Not that every recommendation is wrong. Some are worth applying, and a thin ad group is a real problem. The point is narrower. Optimization Score measures whether you cleared the list, not whether the account performs, so it is not a number to manage by, and it is not a number to let auto-apply chase with your budget. ## Keep going - **[AI Max and your search terms](/blog/google-ads-search-term-matching-ai-max/)**. The same automation over-reach, this time in how Google decides what your keywords match. - **[Why conversions win over clicks](/blog/why-conversions-win-over-clicks/)**. The number to manage the account by instead of the score. Free PDF: **[The Google Ads Setup Audit](/freebies/google-ads-setup-audit.pdf)**. The checkpoint-by-checkpoint version of what I verify before I trust an account. No email gate. ## What's next If your agency or your Google rep keeps pointing at your Optimization Score, ask them what it would be if you dismissed every open recommendation. Then ask what your cost per booked sale did last quarter. If you want someone to go through the account and tell you which recommendations are worth applying and which are the house betting your money, [that is what an audit is for](/audit-request/). ## What a Home Brand's 21x ROAS Actually Hides URL: https://connercrowe.com/blog/what-a-home-brands-21x-roas-actually-hides/ Published: 2026-06-29 | Updated: 2026-07-14 Two home brands I run report 21x ROAS. A Shopping campaign that is 18% of the spend produces 52% of the revenue. Why the blended number lies. I pulled ninety days of Google Ads data on two home and furniture brands I run. Both report a blended return on ad spend north of 20x. One reads 21.7x, the other 20.4x. On the dashboard, both look like the ads are printing money. They are not. The blended number is hiding where the revenue comes from, and once you break it apart the story flips. ## The two accounts, broken apart Between them, the two brands spent about $13,500 on Google Ads in the last ninety days and tracked roughly $284,000 in revenue. That is the 21x. Here is what it is made of. Each account runs two campaign types: a Performance Max campaign that carries most of the budget, and a smaller Shopping campaign. When you split the ROAS by campaign type, the average comes apart. - **Shopping was 18% of the combined spend and produced 52% of the tracked revenue.** Its ROAS was 61x. - **Performance Max was 82% of the combined spend and produced 48% of the revenue.** Its ROAS was 12x. Per brand it is even sharper. One brand's Shopping campaign reported a 45x return. The other's reported 71x. Their Performance Max campaigns, the ones doing four-fifths of the spending, reported 17x and 8x. A single small campaign, less than a fifth of the budget, is carrying the headline number for both accounts. ## Why the Shopping campaign reads 60x A 60x or 70x ROAS is not skill. It is intent. Shopping campaigns are very good at catching people who are already most of the way to buying. Someone who searches the brand by name, or searches the exact product they already saw on Instagram, and clicks the Shopping listing. That click was going to convert with or without the ad. The campaign takes the credit anyway. That is the same pattern as branded search dressed up as performance. The traffic is real, the sale is real, but the ad did not create the demand. It harvested demand that already existed. Harvesting is cheap and it converts at rates prospecting never will, so its ROAS looks unreal. Because it sits inside the same account as the prospecting, it drags the blended average up and makes the whole thing look healthier than it is. ## Why the blended number is the wrong number If you judge a home brand's Google Ads on blended ROAS, you make two mistakes at once. You over-credit the ads. A 21x blended return tells the founder the account is a money machine, so the instinct is to leave it alone. But half of that revenue is demand the brand already had. Strip out the harvesting and the part of the account that is actually buying new customers is running at 12x, and on one of the two brands, 8x. And you starve the part that grows the business. Performance Max, the prospecting layer, is where new customers come from. It runs at a lower ROAS by design, because finding someone who has never heard of you costs more than closing someone who already wants you. Read the blended number and that layer looks like the weak one. Cut it, and you have just cut the only thing creating new demand, while keeping the campaign that was only ever collecting it. ## What to actually look at Separate the harvest from the prospecting before you judge anything. Pull the ROAS by campaign type, not the account average. Look at what Performance Max returns on its own, and decide whether that number pays back at your margin and your customer lifetime value. That is the real question. The Shopping or branded number is a foregone conclusion, useful for catching tracking breaks, useless for deciding where the next dollar goes. Then ask the harder question the dashboard will never answer: how much of the harvested revenue would have happened anyway. Incrementality, not attribution. A holdout test on branded and Shopping traffic tells you what the ads are actually adding, and it is almost always less than the platform claims. The 21x is not a lie exactly. Every dollar in it is real. It is just an average of two completely different jobs, and averaging them together tells you nothing about whether your spend is growing the brand or just taking credit for it. If you run a home or furniture brand on Shopify, this is the first thing I check, and it is the structure I rebuild every account to. The mechanics of why Performance Max and Shopping fight over the same conversions are in [why Performance Max gets credit for Shopping conversions](/blog/why-performance-max-gets-credit-for-shopping-conversions/). What a healthy ROAS actually looks like once margin is in the picture is in [the ROAS benchmark answer](/wasted-ad-spend/good-roas-benchmark-ecommerce-businesses/). And the way I structure the whole program for home brands is on the [home brands page](/for-home-brands/). ## The inbox is a catalog surface, and most home brands waste it with a stock template URL: https://connercrowe.com/blog/email-flows-room-scenes-shopify-home-brands/ Published: 2026-06-18 Five Klaviyo flows and 21 hero emails on seven custom room scenes for a $3,000-AOV furniture brand. Abandoned checkout is the cheapest revenue. ## Quick Take A furniture and lighting brand on Shopify with an average order over $3,000 was running one default Klaviyo welcome email and nothing else. Every other lifecycle moment was empty. So the most expensive event in the funnel, a buyer abandoning a $3,000 cart, got zero follow-up. I built the full lifecycle suite: Welcome, Abandoned Checkout, Browse Abandonment, Post-Purchase, Winback. Five flows, 21 hero emails. The part that mattered was the imagery. Each hero email is built on one of 7 custom room scenes that place the brand's actual SKUs, true-to-scale, in a styled room, rendered through the same in-house lifestyle pipeline I use for the catalog. The email looks like the storefront, not a newsletter. That is the whole point. A stock template sent to a buyer choosing a $3,000 sofa reads as spam. The inbox is a catalog surface, and most home brands waste it. ## The receipt A home furnishings brand on Shopify. Average order over $3,000. Real revenue, real catalog, real buyers. The email program was one welcome email on the default Klaviyo template. No abandoned checkout flow. No browse flow. No post-purchase. No winback. That is the common state for home brands. Acquisition gets all the budget. Email gets a checkbox. The problem is the math. At a $3,000 AOV, checkout abandonment is the single most expensive leak in the business. A buyer who reaches checkout has already chosen a $3,000 item. That is the most qualified person who will touch the funnel all month. With no abandoned-checkout flow, that buyer leaves and nothing follows them. I built five flows: - **Welcome.** First impression for a new subscriber who has not bought yet. - **Abandoned Checkout.** Recovers the buyer who chose a $3,000+ item and stalled. - **Browse Abandonment.** Catches the buyer who viewed a product and left before adding to cart. - **Post-Purchase.** Owns the gap between order and delivery, the highest-anxiety window for a high-ticket purchase. - **Winback.** Re-engages a past buyer before they go cold. Across those five flows: 21 branded hero emails, built on 7 custom room scenes. ## The inbox is a catalog surface A home brand spends months getting the storefront right. The PDP imagery, the room context, the styling that makes a $3,000 sofa feel like it belongs in a real home. Then the same brand sends an email built on a gray newsletter template with a logo at the top and a product thumbnail in a box. The buyer notices. The storefront looked like a designer's portfolio. The email looks like a coupon from a phone carrier. That gap is the leak. The email is a catalog surface. It is a placement where the buyer sees the product. Treating it like a utility instead of a storefront throws away the most-opened touchpoint you own. The fix is imagery. The hero email has to look like the catalog, because to the buyer it is the catalog. Same room context. Same styling. Same fidelity. The email should be indistinguishable from a collection page. When it is, the email stops reading as a broadcast and starts reading as the brand walking the buyer back to a specific piece. ## Why a stock template loses a premium buyer A $3,000 furniture buyer is not an impulse shopper. They are deliberating. They compared four brands. They measured the wall. That buyer's standard for what a brand looks like is set by the storefront they just left. A default template email falls below that standard the instant it loads. Worse: the default template signals automation. It tells the buyer this email went to 40,000 people. A buyer making a $3,000 decision wants to feel chosen, not batched. The room-scene hero does the opposite. It shows the exact piece they were considering, staged the way they imagined it at home. That is not a discount nudge. That is the brand finishing the sentence the buyer started at checkout. For a high-AOV brand, the abandoned-checkout flow is the highest-leverage email in the business. It catches the most qualified buyer at the most expensive moment. Sending that buyer a stock template is the most expensive template choice a home brand can make. ## How the room scenes are built The 7 room scenes are not stock photography and not generic AI renders. Each one places the brand's actual SKUs in a styled room, true-to-scale, at roughly 99% product fidelity. They run through the same in-house lifestyle pipeline I use for catalog imagery. Same controls: - **Real SKUs.** The piece in the scene is the piece that ships. Same silhouette, same finish, same hardware. - **True-to-scale.** A console reads as a console, not a toy. Proportion against the room is locked, because a buyer spending $3,000 will catch a scale error instantly. - **Brand-spec lock.** Material, color, and finish are checked against the product spec before the scene ships. If the render drifts, it gets rejected. Seven scenes covers the lifecycle. A hero scene for Welcome. A specific-product scene for Abandoned Checkout and Browse. A delivered-in-a-home scene for Post-Purchase. A fresh-room scene for Winback. The 21 emails draw from those 7 scenes so the whole program looks like one brand, not 21 separate sends. That consistency is the asset. The buyer who sees the Welcome email and later the Abandoned Checkout email sees the same world both times. The brand never breaks character. ## When this is not the right call This does not fix a broken product. If the piece arrives and disappoints, no email saves it. The flows recover qualified buyers; they do not manufacture quality. It does not fix pricing. If the offer is wrong, a beautiful email sends a wrong offer faster. It is not for a sub-$1M brand with a 20-SKU catalog. At low order values and low volume, a clean text email and one good product photo clears the bar. The room-scene investment pays back at high AOV and real list volume, where one recovered $3,000 cart covers a lot of build. And it breaks without a brand look. If the team cannot supply the styling language the scenes should match, the renders drift and the emails stop looking like the storefront. The brand reference is the first input, not an afterthought. ## Keep going If this landed, the two pieces next to it: - **[Your catalog photo budget is the CVR bottleneck](/blog/catalog-photo-bottleneck-shopify-home-brands/)**. The same imagery pipeline, applied to the PDP instead of the inbox. - **[Your ROAS is inflated by shipping and discounts](/blog/roas-inflated-by-shipping-and-discounts/)**. Why the cheapest revenue is the buyer who already knows you, and why email is where you capture it. The full production exhibit, including the lifestyle pipeline shape and the fidelity controls, lives at [/for-home-brands](/for-home-brands/). If your home brand is sending a stock template to a $3,000 buyer, that is the [audit call](/contact/). ## One hero shot loses the sale: the four product angles every furniture PDP needs URL: https://connercrowe.com/blog/four-product-angles-every-pdp-needs/ Published: 2026-06-18 A 3/4 hero shot leaves a furniture buyer guessing on depth, edge profile, and joinery. The four white-background angles a PDP needs, and why. ## Quick Take A furniture buyer on a PDP with one 3/4 hero shot is doing math in their head. How deep is the top. What does the edge look like. How do the legs join the frame. The hero shot answers none of it, so they bounce or they buy and return. A product page needs four white-background angles: a 3/4 hero, a straight front elevation, a top-down, and an end profile. I render all four in-house for whole Shopify catalogs, normalized so the set looks like one shoot. The lesson that took the longest to learn: the angle set is per-product, not a template. A feature only exists for the customer from the angle that points at it. ## The receipt A furniture brand on Shopify came to me with single-hero-shot PDPs. One 3/4 angle per product, white background, and nothing else. Returns were running high and the support inbox kept getting the same questions: how deep, how tall, what does the underside look like. Those are not buying questions. Those are questions a second photo answers. The catalog had 44 dining tables. The traditional fix is a studio day: book a space, freight the tables in, light each one, shoot four angles, retouch, deliver weeks later. I shipped four angles per table in-house. No studio day. Days per batch, not weeks. Same pure-white background across all 44, normalized so the whole set reads as one shoot instead of 44 separate ones. The point was never prettier photos. It was answering the question on the page so the customer stops guessing. ## The four angles and the question each one answers A hero shot is one viewpoint. A buyer needs to rotate the product in their head, and four angles do that work for them. **The 3/4 hero.** This is the shot most stores stop at. It shows the form and the proportions. It tells you what the piece is. It does not tell you much else. **The straight front elevation.** Shot dead-on, no perspective tilt. This is the shot a buyer uses to judge proportion against their room. It answers width and height honestly, without the foreshortening a 3/4 angle introduces. **The top-down.** A bird's-eye view of the surface. For a dining table this is the one that sells. It shows the grain, the surface pattern, the depth of the top. It answers what the buyer eats off. **The end profile.** Shot from the side. This is the depth answer and the edge answer. How thick is the top. What is the edge profile. How do the legs meet the frame. This is the angle that kills the "it looked different in person" return. Four angles. Four different questions. Each unanswered question is a reason to leave the page or, worse, to buy and send it back. ## A feature only exists from the angle that reveals it This is the part that took me the most reps to get right. A product feature only shows from the camera angle that points at it. A hidden drawer under a table top does not exist for the customer unless one of the four angles reveals it. A cable channel routed through a desk leg is invisible until a camera looks at the leg. A specific dovetail or a flush leg join is a selling point only if a shot is aimed at the join. So the four-angle set is not a blind template I stamp on every SKU. I check each product's selling features first, then decide which angle has to capture them. Sometimes the standard top-down is wrong for a piece and the shot needs to drop lower to catch a detail under the lip. Sometimes the end profile has to rotate a few degrees to put the joinery in frame. A template gives you four photos. A per-product pass gives you four photos that each do a job. The difference shows up in the return rate, not the gallery. ## Packshots are the spec proof, lifestyle is the desire These white-background shots are not the same job as lifestyle scenes, and a PDP needs both. A lifestyle scene answers desire. What does this feel like in my room. It sets the mood and it earns the click. A packshot answers spec. What exactly am I buying. It is the clean, no-distraction proof that lets a buyer commit. White background, no styling, nothing to hide behind. The product is the only thing in frame and it has to hold up. A buyer scrolls the lifestyle shot to fall for the piece, then scrolls the packshots to confirm it is real and it fits. Skip the packshots and you have desire with no proof. The cart stalls. I covered the lifestyle half of this in a separate post. This one is the spec layer. ## When one shot is enough This is not a rule for every product. A $40 commodity SKU does not need four angles. The margin does not support the effort and the buyer is not doing the same mental math on a $40 item that they do on a $1,400 table. One clean shot is fine. If your differentiation is a single iconic editorial shot that defines the brand, keep it. Do not bury a signature image under four utility angles. And this is the white-background spec layer. It does not replace hero photography that carries your brand, and it does not replace lifestyle scenes that build the want. It sits underneath both and does the unglamorous job of proving the thing is what you say it is. The test is simple: if a buyer on the page is guessing about depth, edge, or joinery, you are short an angle. If they are not, one shot might be enough. ## Keep going If you want the math on why catalog imagery gates conversion in the first place, read [Your catalog photo budget is the CVR bottleneck](/blog/catalog-photo-bottleneck-shopify-home-brands/). For the full build behind the in-house pipeline, see [150-SKU furniture catalog, no photographer](/results/150-sku-furniture-catalog-no-photographer/). How many images a page needs is answered at [how many product photos a product page should have](/product-photography/how-many-product-photos-per-pdp/), and the lifestyle-versus-white-background call at [which one a product page needs](/product-photography/lifestyle-vs-white-background-product-photos/). More of how I think about catalog and imagery work for home brands lives at [/for-home-brands](/for-home-brands/). If your PDPs stop at one hero shot and your return rate or support inbox is telling you so, book an audit call at [/contact](/contact/). I will look at your catalog and tell you which products are short an angle. ## The $30K Shopify rebuild you probably don't need URL: https://connercrowe.com/blog/shopify-storefront-facelift-without-a-rebuild/ Published: 2026-06-18 An agency quoted a home brand $30K and 12 weeks to rebuild its Shopify store. A facelift on the existing theme got most of the result. Here's the line. ## Quick Take A home brand on Shopify got a rebuild quote: $30,000 and 12 weeks. The store felt dated and "thin," and the agency proposed tearing it down and building a new theme. I ran the numbers and the diagnosis was off. The store did not need a new theme. It needed better product cards, a readable hero, a trust layer, faster pages, and a catalog cleanup. All of that is fixable on the theme the brand already owns. I call it a storefront facelift. It got most of the result the rebuild promised, in a fraction of the time, on the existing stock Shopify theme. The lesson: a rebuild quote sells you a new theme. The conversion problem is almost never the theme. ## The receipt A Shopify boutique came to me with an agency quote in hand. $30,000. 12 weeks. A full rebuild on a new theme. The owner was tired of the store. It looked stock. It felt slow. Customers said it felt "thin," like the catalog was small. I pulled up the store and made a list of what was wrong. The product cards were the default theme cards. No quick context, weak hover, prices buried. The hero image had white text on a light photo. You could not read the headline on a phone. There was no trust layer. No reviews on the page, no guarantee, no proof. The pages were slow. Heavy apps and uncompressed images. And the catalog had a hidden problem I will get to in a minute. None of that is a theme problem. Every item on that list lives on top of the theme, not inside it. I shipped the fixes on a draft theme. The live store never moved while I worked. Custom product cards, a readable hero, a reviews carousel, a fit finder, internal linking, and a re-tokened palette and type so the stock theme stopped looking stock. Page-speed work on top. ## Why the theme is rarely the problem When a store feels dated, the instinct is to replace it. That instinct is wrong most of the time. A Shopify theme is a frame. What converts or fails to convert is what sits inside the frame. Cards. Hero. Trust. Speed. Catalog hygiene. You can swap the whole frame for $30,000 and still ship the same weak cards, the same unreadable hero, the same missing reviews. Plenty of expensive rebuilds do exactly that. The brand pays for a new theme and the conversion rate does not move. The theme is the cheapest thing to keep and the most expensive thing to replace. So I keep it. ## The facelift menu A facelift is a set of upgrades injected through theme CSS and JS. Not a page-builder app. The code lives in the theme, so there is no monthly app tax and nothing to break on the next theme update I do not control. Here is what I inject and why. **Custom product cards.** The default card is generic. I rebuild it to carry price, a second image on hover, and quick context. This is the single highest-leverage change on most stores. **Hero legibility.** A readable headline beats a pretty one. I fix contrast, add a scrim where needed, and size the type for a phone first. **A reviews carousel.** Proof on the page, not buried on a separate reviews tab nobody opens. **A fit or finder quiz.** For a catalog with real variety, a short quiz routes a confused shopper to the right product instead of leaving them to bounce. **Internal linking.** Collections and products that point at each other keep people moving and help search. **Palette and type re-tokening.** I rewrite the theme's color and font tokens so it stops reading as a template. Same theme. Different brand. **Page-speed work.** Compress images, defer what can wait, cut dead apps. None of these touch the live store while I build. They go into a draft theme and get reviewed before anything ships. ## The draft-theme and go-live discipline The live store is the brand's revenue. I do not edit it directly. Ever. Every change goes into a draft theme. The brand can preview the full facelift on a private link before a single customer sees it. Before go-live, I run a design audit with a sub-agent. A second set of eyes on the whole thing: spacing, contrast, mobile, the cards, the hero, the trust layer. It catches what I stop seeing after staring at a build for days. Then go-live is one coordinated move. The draft theme gets published in a single step, with the catalog and tracking checked in the same pass. No half-published state. No broken window where the store is part old, part new. This is the part a rebuild quote rarely spells out. The risk is not the design. The risk is the switch. ## The catalog-hygiene finding Here is the part no rebuild quote mentions. On one facelift, the owner kept saying the store felt thin. I assumed it was a design problem. It was not. I checked the catalog against what was published to the Online Store. Roughly 61 percent of the active catalog, over 1,500 products, was never published. It existed in the admin. It was invisible on the storefront. It was absent from the brand filters. The store did not feel thin because of the design. It felt thin because more than half the catalog was hidden. A new theme would not have found that. A rebuild ships the same hidden catalog onto a prettier frame and the brand still wonders why the store feels empty. A facelift surfaces problems a rebuild quote never lists. Because a facelift starts with the store you have, not the store someone wants to sell you. ## When a rebuild IS the right call I am not against rebuilds. Some stores need one. If the theme genuinely cannot carry the brand, rebuild. Some old themes are so limited that every change fights the frame. At that point you are paying me to wrestle the theme instead of improving the store. A clean theme is cheaper. If you need performance at a scale a stock theme cannot hit, headless is a real answer. High traffic, complex merchandising, a content layer that has to be fast everywhere. That is a different engineering problem and a rebuild earns its cost. If you are changing platforms, that is a migration, not a facelift. Moving off a legacy platform onto Shopify is real work and worth doing well. The honest line: a rebuild is right when the foundation is the problem. It is wrong when the foundation is fine and the agency is selling you a new one anyway. For most $3M to $8M home brands with a tired store, the foundation is fine. ## Keep going If you are weighing an agency quote, two more reads in the same vein. [Why I'm still writing this blog in 2026](/blog/why-im-still-writing-this-blog-in-2026/) is the case for doing the work in the open instead of hiding it behind a pitch. [Free PDFs without an email gate](/blog/free-pdfs-without-an-email-gate/) is the same anti-friction logic applied to lead generation. If you want to see how I run an engagement end to end, that is on [/process](/process/). The two questions that decide it: [facelift or full rebuild](/shopify-storefront/shopify-facelift-vs-full-rebuild/), and [whether a redesign will hurt SEO](/shopify-storefront/will-a-shopify-redesign-hurt-seo/). And if you have a rebuild quote in your inbox and a store you are not sure needs one: the facelift work itself, with pricing and the case studies, is at [/storefronts](/storefronts/), and the full theme-versus-facelift-versus-rebuild decision library is at [/shopify-storefront/](/shopify-storefront/). Or send the quote to me first: [/contact](/contact/). ## Shopify Storefront Audit: My 6-Pass Method URL: https://connercrowe.com/blog/how-i-audit-a-shopify-storefront/ Published: 2026-05-26 | Updated: 2026-08-22 My six-pass Shopify storefront audit covers technical SEO, content, mobile UX, AI discovery, competitive positioning, and site architecture. ## Quick Take A storefront audit run fast is usually a storefront audit run shallow. Someone runs a crawler, exports 300 warnings, and calls it a diagnosis. That is not the same as a senior audit, and a home brand owner can feel the difference even when they cannot name it. Fast and senior are not in tension. They are in tension when the method is bad. Here is the method I use to audit a Shopify storefront in an afternoon and keep it at senior level: six domain audits in parallel, one operator judgment pass, and a verification pass because the fast tools miss things. ## The six storefront audit passes 1. **Technical SEO.** Schema, sitemaps, indexation, titles, descriptions, and internal links. 2. **On-page content and brand voice.** Whether the copy reads human, answers buying questions, and earns the price point. 3. **Conversion and mobile UX.** Where the funnel leaks, especially on phones. 4. **AI search and discoverability.** Whether the catalog is legible to ChatGPT and Google's AI surfaces. 5. **Competitive positioning.** Where the brand actually sits against its peer set. 6. **Site architecture.** Collections, navigation, filters, and internal discovery. I run those six passes in parallel. Then I apply two gates that do not belong to any single domain: one operator judgment pass to turn findings into a ranked diagnosis, and one rendered-site verification pass before anything reaches the owner. ## The tension worth naming There are two kinds of storefront audit a home brand usually gets. The fast one is a tool export. A crawler runs, flags 300 issues, sorts them red and yellow, and the brand gets a PDF that treats a missing alt tag and a broken canonical as the same size of problem. It is fast and it is shallow. The brand cannot act on it. The slow one is a consultant who spends three weeks and bills for the calendar. It is senior and it is slow, and most of the three weeks is scheduling, not thinking. Owners assume they have to pick. They do not. The speed in a fast audit comes from running things in parallel. The shallowness comes from skipping the judgment pass. Those are two separate choices. Keep the parallelism, add the judgment pass back, and the audit is both fast and senior. ## Six domains, run at once A storefront does not fail in one place. It fails in six, and they are different disciplines. I audit those six domains as separate passes at the same time rather than walking the store once. Technical SEO covers schema, sitemap, indexation, and the title layer. Content and voice cover the words that have to earn trust. Conversion and mobile UX cover the route from collection to checkout. AI discovery tests whether the catalog is legible beyond a conventional search result. Competitive positioning tests the claims against the peer set. Architecture covers collections, navigation, filters, and internal discovery. One reviewer walking the site once cannot hold all six lenses at the same depth. Attention narrows to whatever that reviewer is strongest at. Six parallel passes, one per domain, fixes that. Each pass goes deep on its own discipline and returns a structured report. This is the parallelism that makes the audit fast. It is also what makes each domain deep instead of skimmed. It is the same operator-as-supervisor pattern I use in [the content engine I built for the same brand](/blog/content-engine-shopify-furniture-brand/). ## Six reports is not an audit Here is where the fast-and-shallow version stops, and where the senior work starts. Six domain reports are not an audit. They are six domain reports. An owner handed all six is back where they started: a pile of findings with no order. The audit is the judgment pass. That is the part that cannot be parallelized. The judgment pass does two things. First, it collapses sixty symptoms into a handful of root causes. On that storefront, the content audit flagged no reviews, the UX audit flagged no financing shown, the voice audit flagged machine-written copy, the architecture audit flagged thin trust signals. Four findings, four domains, one root cause: the storefront could not earn trust at a four-figure order value. You fix the root cause, not the four symptoms separately. Second, it sequences. Not everything ships at once, and order matters. SEO metadata has the longest lag, two to ten days before Google even recrawls it, so it ships first. The work that changes what a shopper sees the day they land ships next. Structural work ships last, because it compounds quietly once the data underneath it is clean. A list of 300 warnings has no sequence. A senior audit is mostly sequence. ## The verification pass, because the tools lie by omission The fast tools have a blind spot, and a fast audit that does not account for it ships wrong findings with confidence. Most automated audit tools read the raw HTML a page sends. They do not run the page's JavaScript. So anything the storefront renders client-side after load is invisible to them. On that same storefront, the first-pass automated audit reported four things missing that were not missing. An email capture popup it called absent was installed and firing. A Shop Pay financing widget it called missing was live on every product page. An About page it called a 404 existed at a URL the tool did not guess. A collection it called broken was a transient error. Four false negatives, one root cause: the tool saw static HTML and the storefront rendered those elements with JavaScript. The mirror of that error is the false positive, where the audit reports a page that exists but was never part of the site. That is what happens when the page list is assembled from an analytics property rather than from the storefront, because [a property is scoped to its key rather than to a site](/blog/foreign-hostname-analytics-check/) and will happily list pages from anywhere else that key is installed. This is why a fast audit needs a verification pass before the findings go to the owner. The senior move is knowing the tools have that blind spot and checking the rendered page, not the raw source, before telling a brand something is broken. Skip the pass and you hand the owner a fix list with four items that are already done. That is the moment a fast audit stops being senior. ## What a fast, shallow audit actually costs The cost of the shallow version is not that it is useless. It is that it is confidently wrong. A 300-warning crawler export gets acted on. Someone on the brand's side spends a week working the red items. Some of those items are already fixed. Some are symptoms of a root cause that the list never named, so fixing them changes nothing. The brand spends real labor and ends the week roughly where it started, and concludes that audits do not work. Audits work. Warning exports are not audits. The difference is the judgment pass and the verification pass, and those are the two steps the fast-and-shallow version drops to stay fast. You do not have to drop them. You have to run the coverage in parallel so you can afford to spend the saved time on judgment. ## The receipts The method on this build: six domain audits run in parallel, each returning a structured report. One judgment pass that collapsed the findings into root causes and a sequenced action plan. One verification pass that caught four false negatives before they reached the owner. The diagnosis was done inside an afternoon. The findings were senior because the judgment and verification were not skipped, not because the tooling was clever. The honest part. An audit is a diagnosis, not a result. The fixes ship after it, and the ranking and conversion outcomes take a quarter to read. A fast audit gets you a correct, ordered, verified list of what to fix. It does not get you the outcome. Anyone selling you the outcome in an afternoon is selling you the shallow version. ## What to ask for When a storefront audit comes back, do not ask how many issues it found. A high number is a tooling artifact. Ask two things. What are the root causes, and in what order do I fix them. If the audit cannot answer both, it was the fast, shallow kind. That is the audit I run for Shopify home brands: six domains, ordered into one diagnosis, verified, [delivered in writing in 72 hours, no call required](/for-home-brands/audit/). For the storefront and catalog work that tends to come out of it, [the catalog imagery post](/blog/catalog-photo-bottleneck-shopify-home-brands/) covers one of the most common findings, and the build work itself lives at [/storefronts](/storefronts/). Two findings come up often enough to have their own answers: [why a Shopify store is slow](/shopify-storefront/why-is-my-shopify-store-slow/) and [whether the store needs a facelift or a full rebuild](/shopify-storefront/shopify-facelift-vs-full-rebuild/). ## Your AI Agent Doesn't Need a Brain URL: https://connercrowe.com/blog/your-ai-agent-doesnt-need-a-brain/ Published: 2026-05-20 An operator's read on the agent-memory hype, and the plain-files tool I built instead of buying one. ## Quick Take Every few months a new word shows up to tell you your AI setup is behind. Right now the word is memory. My feed is full of videos about building a "brain" for an AI agent: memory layers, knowledge graphs, context engineering. I build my own AI systems for client work, so I took the trend seriously and sent a team of research agents through all of it. The verdict came back about 60 percent noise and 40 percent real. The real part is something you can build out of plain text files. You do not need to buy a memory product. You need better notes. Here is the full read. ## The Jargon, Decoded Strip the jargon and agent memory means one thing. An AI tool that does not start from zero every time you open it. By default most AI agents are amnesiacs. You finish a session, close the window, and everything the tool learned about your brand and your last decision is gone. Next session you brief it from scratch. "Building a brain" is the catch-all for fixing that. The trend splits the idea into two kinds of memory. Semantic memory is facts and rules: your brand voice and your margin floor. Episodic memory is what happened: which campaign you ran last month and what it returned. Most marketing teams using AI have written down neither in a place the tool can read. Everything else is plumbing. Knowledge graphs and vector databases are storage formats for the two kinds of memory above. Useful to engineers. Mostly noise to an operator. ## Who Is Selling You This Once you see the layers, the hype sorts itself. The loudest layer is the vendors. A wave of startups now sells "memory layers" as a product. Mem0, Letta, a dozen others. They publish "State of AI Agent Memory" reports that read like research and function like brochures. Behind them are the investors who funded the round and need the category to feel inevitable. The next layer is the influencers. "Context engineer" got named the hottest job title of 2026 by people who make videos for a living. That tells you nothing about whether you need one. The thin layer underneath is the real signal. Anthropic, the lab behind the model I run every day, treats context engineering as a genuine engineering discipline with named failure modes. When the people building the technology write something careful, read it. When someone selling the technology writes something urgent, discount it. The mix lands around 60 / 40. The trend is real. The volume around it is not. ## The Part the Videos Skip Here is the detail almost no video mentions. Giving an AI a memory is easy. Deciding what it should forget is hard, and it is mostly unsolved. Add memory to an agent and at first it works. Then stale facts pile up. Old decisions contradict new ones. The tool starts confidently citing something that stopped being true six weeks ago. Vendor benchmarks measure how well a system retrieves a fact. They do not measure how well it drops one that went bad. By the vendors' own numbers, accuracy on a real workload can fall by half inside a month of use. So the demo looks perfect and the production system slowly rots. Anyone selling you a memory layer is selling the easy half of the problem. ## What I Built Instead I had the same itch, because I do have a real memory gap in my own work. I run AI pipelines that produce ad creative and content for clients. They generate the work, it ships, and nothing comes back. The pipeline never learns whether the ad it made performed. That is the missing memory. Not a philosophical one. A specific, fixable one. I did not buy a memory layer. I built a small tool that reads ad performance from Meta and Google and writes it into a plain text file. Winning angles. Creative that is fading. Concepts that are dead. One file per client. The production pipeline reads that file before it generates the next batch. The file is the brain. It is a Markdown document. I can read the whole thing in ten seconds, and so can the client. ## The Operating Rule Memory is a discipline, not a product. Your AI systems already have memory the moment you give them a file to read. A document with your brand rules is semantic memory. A running log of what each campaign returned is episodic memory. Plain files, kept current, under version control. That covers what almost every marketing operator needs. A vector database answers a problem of scale that most operators will not have for years. Reaching for one now is buying a forklift to move a single box. The rule I run on: build memory out of files a human can open and read. If you cannot read your agent's memory, you cannot tell when it is wrong. And it will be wrong. A memory you can audit beats a memory you have to trust. ## The Receipt The tool I built is real and it is boring. Three files. Markdown and JSON. No database, no vendor account, no monthly fee. It runs at zero marginal cost and the whole thing is legible to anyone who opens the folder. That is the point. The trend will resurface next quarter in a louder form with a new word attached. The file will still be a file. Boring infrastructure you understand beats exciting infrastructure you rent. If you are running AI in your marketing and want a straight read on what is worth adopting and what is a vendor pitch wearing a research report, that is the audit call at [/contact](/contact/). ## Keep going If this hit, the next two pieces in the same universe: - **[Nine GTM Tags in 90 Minutes](/blog/agent-built-my-tracking-stack/)**. The same build tooling pointed at tracking ops instead of ad creative. - **[The Workflow That Lets Me Ship a Site in 24 Hours](/blog/wispr-flow-claude-the-input-bandwidth-problem/)**. The input-layer workflow underneath all of this. Free PDF: **[The two-page Voice Audit Checklist](/freebies/voice-audit-checklist.pdf)**. No email gate. ## The content engine behind a Shopify home brand's blog (and the rule that blocks half its own ideas) URL: https://connercrowe.com/blog/content-engine-shopify-furniture-brand/ Published: 2026-05-19 The nine-agent content engine I built for a Shopify home brand, and the rule that matters most: no post publishes unless it links a real product. ## Quick Take A blog folder produces posts. An engine produces posts that are forced to earn their slot. I built a reclaimed-wood home brand on Shopify a nine-agent content pipeline that researches a topic, drafts it, runs it through two voice gates, and attaches schema, then hands a Shopify draft to a human. The rule that does the real work is the one that kills the post before it is written: if a topic cannot anchor to a specific product in the catalog, the engine refuses it. That single gate is the difference between content that ranks and content that just exists. ## Why the engine exists The brand had a blog. It had posts. The posts were generic. "What is reclaimed wood." "The history of farmhouse furniture." Category-level education that read fine and ranked for nothing, because every other home-goods site on the internet had published the same article, and a generative tool can now write it in eight seconds. The first batch I ran through an early version of the pipeline made the same mistake. The drafts opened with contrarian category takes and never named a product the brand sold. They were articles. They were not storefront assets. I deleted them. That failure is what defined the engine. A content engine for an e-commerce brand has one job that a media blog does not: every post has to move a reader toward something with a price and an add-to-cart button. If a post does not do that, it is not underperforming. It is off-task. So the engine got a rule. Then it got the agents to enforce the rule. ## The pipeline Nine agents run in sequence and in parallel, each one narrow. A **keyword researcher** enriches the topic with real search terms. An **outliner** turns the topic and the keywords into a structured outline, and is required to propose an anchor-product query. Then a parallel research wave fires: a **catalog scout** searches the brand's live Shopify catalog for the products and collections the post should link, a **competitor researcher** maps how peer brands cover the topic so the post can be positioned against the gap, a **provenance researcher** pulls the material and era facts that make the writing credible, and a **hero image** agent generates the cover. Then the **writer** drafts from all of it. The draft goes to a **voice editor**, then a **schema builder** attaches JSON-LD so the post is legible to Google and to AI search. Nine narrow agents beat one general prompt for a simple reason. A single prompt asked to research, position, write, and format will do all four at a B-minus. Nine agents each do one thing, and each one is testable on its own. The pipeline ships with around thirty test files for exactly that reason. When a post comes out wrong, I can see which agent to fix. ## The two gates that make it an engine A generator writes whatever you ask. An engine refuses work that fails its rules. This one has two gates. The first is the anchor-product gate. The catalog scout has to return at least one real product from the live catalog. If it returns zero, the orchestrator stops and returns `blocked_no_product_anchor`. The post does not get written. This is the rule that blocks half the topic ideas that sound good in a brainstorm. "A guide to French country style" sounds like a post. If it cannot anchor to a French country dining table the brand actually stocks, it is not one. The second is the voice gate, and it has two layers. A rule-based linter checks every draft against a list of banned patterns: em dashes, decorative triplets, the corporate verbs, the AI-tell phrasings. Then an LLM voice editor rewrites whatever the linter flags. The draft goes back through the linter. If it still fails, the writer runs again with the failures as a hint. Three attempts, then the post is blocked as `blocked_voice` rather than shipped sounding like a machine. The voice gate is the automated version of a checklist I wrote by hand a while back, in [the post on spotting AI in your own writing](/blog/spotting-ai-in-your-own-writing/). The difference is that a checklist depends on the writer remembering to run it. A gate does not depend on anyone. ## What stays human The engine does not publish. It produces a Shopify article draft, unpublished, and stops at a review gate. A human approves, rejects, or reads the full HTML first. Approve, and it becomes a draft in Shopify. Nothing reaches the storefront without a person saying so. That is deliberate. The engine is built to remove the labor that does not need judgment: keyword pulls, catalog lookups, schema markup, voice cleanup, the first draft. It is not built to remove the judgment. A home brand's blog is a brand surface. The last call stays with a person who knows the brand. This is the same shape as [the tracking stack I had an agent build under supervision](/blog/agent-built-my-tracking-stack/). The agent does the work. The operator owns the gate. The engine is faster than a writer and more consistent than a writer, and it is still not allowed to publish on its own. ## A generator without gates is worse than no blog Here is the case for the rules. A brand that buys a generic AI content subscription gets volume. Forty posts a quarter, each one a category explainer, none of them linking a product. That brand now has forty pages telling Google the site is a low-effort content farm. The blog does not just fail to help. It actively pulls down how Google reads the whole domain. The engine cannot produce that outcome. A post with no product anchor does not get written. A post that sounds like a machine does not get shipped. The volume is lower than a generator's and every post points a reader at something the brand sells. That is the trade, and for an e-commerce brand it is not close. ## The receipts The engine is built and tested, around thirty test files covering each agent. It runs from a backlog: one command pulls the next queued topic, drafts it end to end, and lands a reviewable Shopify draft. It has produced its first real batch, anchored to the brand's reclaimed pine case goods and Buffalo leather seating. A `--preflight` command verifies every API credential before the engine spends a token. The honest part. This engine drafts. It does not decide. Every post still passes a human review gate, and the storefront SEO foundation those posts point at shipped only days ago, so the ranking results are not in yet. The build is real and dated. The outcome will take a quarter to read. ## What this is really about A blog folder asks what to write about next. An engine asks whether the topic earns a slot at all, and whether the brand survives the draft reaching the storefront. Those are different questions, and only the second one builds an asset. If you run a Shopify home brand and your blog is a folder, the place to start is the storefront under it: [a written audit, delivered in 72 hours, no call required](/for-home-brands/audit/). ## I paused all paid media in one state for 21 days. The incremental lift was 38%, not the 92% the attribution report claimed. URL: https://connercrowe.com/blog/21-day-geo-holdout-incrementality-test/ Published: 2026-05-17 | Updated: 2026-05-18 Attribution reports measure correlation, not incrementality. The 21-day geo holdout I run to separate paid revenue from revenue you had anyway. ## Quick Take Attribution reports do not measure incrementality. They measure correlation between the click and the order. The board reads "Meta drove 38% of revenue" and assumes that without Meta, 38% of revenue goes away. That assumption is wrong by a wide margin in almost every home-brand account I have audited. The cheapest way to find the actual number is a 21-day geo holdout: pick a small market with a stable trend, pause all paid media in that geography for 21 days, measure organic revenue against the same market in the prior comparable period. The delta is the true incremental lift. Across the last four holdouts I have run on home brands the lift has landed between 30% and 60% of the reported attribution number. The gap funds the next 18 months of budget decisions. ## The receipt Most recent holdout: a home-furnishings brand on Shopify spending $48K/month across Google Ads and Meta. Reported blended ROAS was 4.1x. Reported attribution said 92% of revenue was paid-influenced. I picked Oregon as the holdout market. 4.3% of revenue, stable 90-day trend, no concentration of physical retail to skew the result. Paused every Meta and Google campaign that targeted or expanded into Oregon for 21 days. Left all email, organic social, and SEO running as normal. Held the rest of the country at the existing spend. The Oregon result over the 21 days: - Total revenue from Oregon: down 38% vs the same 21-day window in Q1 - The other 49 states: down 2% vs Q1 (within seasonal noise) - Organic search traffic from Oregon: down 6% (small halo from paid social driving branded search) - Direct traffic from Oregon: down 11%. The bigger halo. Paid had been building brand recall. True incremental lift on Oregon paid spend: 38%. The reported attribution number had been 92%. Smart Bidding had been claiming credit for the other 54% that would have happened anyway through email, organic, retention loops, and a customer base that was already going to buy. That is the gap the board needs to see. The budget conversation that comes out of "92% incremental" is a different conversation than "38% incremental." Different number, different decision. ## The geo holdout, defined The cleanest definition: a controlled experiment where you remove paid-media spend from one geographic market for a fixed period, hold the rest of the account constant, and measure what happens to revenue in the test market vs the control markets. Geo splits matter because most other holdout types (audience splits, dayparting splits, channel splits) cannot fully prevent cross-contamination. Audiences see ads in both arms. Dayparting still gets brand recall from yesterday. Channel splits still see the same buyer through other channels. Geography is the only dimension where you can confidently say "this person was not exposed to the paid media we removed." Pick a market that is: - **Small enough to absorb the revenue loss.** 3-7% of total revenue is the sweet spot. Bigger and the holdout costs real money. Smaller and the result has too much noise to trust. - **Stable.** A market that was 5% of revenue in Q4, 8% in Q1, and 4% in Q2 has too much variance for a 21-day signal to land cleanly. Pick a market with a 90-day flat trend. - **Not concentrated in a physical channel.** If you have a flagship store in Brooklyn, do not pick New York. The store traffic confounds the result. - **Not on the receiving end of a recent press hit or seasonal event.** Same logic. A confound you cannot subtract out. Most home brands have one or two states that fit these criteria. Often Oregon, Colorado, Tennessee, Minnesota, or Arizona work well. Cycle the holdout state between quarterly tests so the same market does not get repeatedly starved. ## The 21-day protocol The full setup runs over 5-6 weeks calendar time. 1-2 weeks of baseline, 3 weeks of holdout, 1-2 weeks of analysis. **Days 1-7: Baseline.** Pull the prior 90 days of daily revenue and order count for the candidate holdout market and at least 3 control markets of similar size. Confirm the holdout market's 90-day trend is flat or matches the rest of the account. If a confound shows up (seasonal spike, store opening, PR mention), pick a different market. Document the existing paid-media spend pattern in the holdout market: daily spend across Google Ads + Meta + any other paid channel, broken down by campaign type. This becomes the "what we removed" reference for the result write-up. **Days 8-28: The holdout.** Day 8, exclude the holdout state from every paid campaign across every channel. The cleanest way: - Google Ads: location exclusion on every campaign (campaign settings → locations → exclude → add the state). Performance Max requires the exclusion to be set on the campaign before it propagates to all asset groups. - Meta: location exclusion on every ad set targeting expansion that includes the state. Also exclude from any lookalike audience that defaults to broad geography. - Microsoft Ads (if running): location exclusion on every campaign. - Programmatic / display: exclude via the DSP's geo controls. - Affiliate / influencer: typically excluded by default (they target audience, not geography), but confirm with the partner. What stays running: organic social posts that may surface in the state (do not pull these, they are part of the control), email to in-state subscribers (also part of the control), SEO content the state may rank into. Watch for spillover. If a campaign somewhere else is targeting "Pacific Northwest," that includes Oregon and needs to be tightened. The audit pass on day 8 should verify zero paid impressions are firing in the holdout market. **Days 29-35: Restart + analysis.** Day 29, restore every exclusion. Paid media resumes in the holdout market at the prior spend level. Most accounts see paid revenue in the holdout market return to baseline within 7-10 days as the bid models relearn the geography. Pull the 21-day revenue numbers from the holdout market and compare to the 21-day window from the prior comparable period (Q1 if you ran the test in Q2, etc.). Adjust for any baseline differences across the control markets. If the rest of the country was up 5% YoY, the holdout market's "expected" revenue should also be up 5% YoY before you measure the delta. The delta after that adjustment is the incremental lift the paid spend was producing. ## How to read the number Three common result patterns I see: **Result A: incremental lift is 20-40% of reported attribution.** Most accounts I have run this on. The paid is working, but a lot of the credit is going to a buyer who would have converted through retention, email, or organic. The action: keep the paid running, but stop using reported ROAS as the budget input. Plan against the incremental number. **Result B: incremental lift is 50-70% of reported attribution.** Less common. The account is acquiring efficiently and the attribution is closer to reality. The action: lean in. The reported number is closer to the truth than I'd usually assume. **Result C: incremental lift is under 20% of reported attribution.** Rare but it does happen, almost always on accounts with a mature email list or a strong organic presence. The action: budget conversation gets uncomfortable. The paid is mostly harvesting demand that would convert anyway. Reduce spend, redirect to upper-funnel demand creation, retest. Result A is the typical one for a $10M+ home brand. The reported ROAS makes the account look like a 4x machine. The incremental ROAS shows the account is closer to a 1.5x machine. Same revenue, very different decision-making frame. ## What this changes about the budget conversation The [board-deck memo](/blog/board-deck-paid-acquisition-numbers/) flagged incrementality lift as one of the four numbers a board should see in a quarterly paid-media update. A geo holdout is how you generate that number. Without one, the board is making capital-allocation decisions on the platform's most-generous attribution model. With one, the board has a real read on what fraction of the next budget increment is buying new revenue vs harvesting revenue that was already coming. For a $10M+ home brand, the gap between "92% incremental" and "38% incremental" on a $500K annual paid budget is the difference between budgeting for growth and budgeting against an inflated number. One holdout per quarter is enough to keep the budget honest. ## Common failure modes **Skipping the baseline week.** If you start the holdout without 90 days of clean baseline data, you have no comparison set. The result will be noisy and unconvincing to a skeptical board member. Spend the first week on the baseline. **Picking a market with a confound.** A holdout in the same month as a regional PR hit, a store opening, a state-specific holiday, or a major weather event is unreadable. Pick a different state or a different quarter. **Not adjusting for control-market trend.** If revenue across the rest of the country dropped 8% during the holdout period (because the whole vertical softened), the holdout market's expected revenue would have dropped 8% too. The incremental-lift calculation has to subtract that baseline before measuring the delta. **Cutting paid mid-test.** Three weeks feels long when the dashboard shows revenue dropping in the test market. The board may push to end the test early. The test ending early invalidates the result. Hold the line. **Running once and stopping.** A single holdout in a single market in a single quarter gives you one data point. The pattern only becomes trustworthy after 3-4 holdouts across different quarters and different markets. Cycle the holdout state quarterly. Build a 12-month picture. ## Keep going If this hit, the next two pieces in the same universe: - **[The 4 numbers I put in a $20M home brand's next board deck on paid](/blog/board-deck-paid-acquisition-numbers/)**. The board-prep memo that named incrementality lift as one of the four numbers. This post is the methodology behind the slide. - **[Why Performance Max Gets Credit for Shopping Conversions](/blog/why-performance-max-gets-credit-for-shopping-conversions/)**. The other attribution misread that leads boards to cut the wrong budget. Free PDF: **[The 25-page Google Ads Setup Audit](/freebies/google-ads-setup-audit.pdf)**. The audit walkthrough behind the tracking-side of the budget conversation. If your quarterly board deck still uses reported ROAS as the headline number and you have not run a holdout to verify it, the setup call is the [audit conversation](/contact/). One holdout in the next 90 days resets the entire budget frame. ## The 4 numbers I put in a $20M home brand's next board deck on paid (and the 3 numbers I cut) URL: https://connercrowe.com/blog/board-deck-paid-acquisition-numbers/ Published: 2026-05-17 | Updated: 2026-05-18 Your board needs four paid-media numbers that map to decisions, not eleven that map to nothing. The memo I send CMOs the week before the meeting. ## Quick Take Your board does not want eleven paid-media KPIs in the Q3 update. They want the four that map to a decision they have the authority to make. I write this memo for CMOs at $10-25M home brands prepping the next board meeting. The four to put in: **contribution-margin ROAS** (not blended), **new-customer CAC** (not blended CAC), **incrementality lift** (from one geo holdout), and **media-spend payback weeks** (not "ROAS"). The three to cut: reported platform ROAS, last-click attribution by channel, and any metric beginning with "engagement." Replace those with sentences the board can quote in the hallway after. Numbers a non-marketer can understand and act on. ## The frame Your board sees the same paid-media slide every quarter and asks the same two questions: "Is it working?" and "Should we spend more?" The deck most agencies prepare answers neither question. It shows reported ROAS by channel, blended ROAS year-over-year, total spend, and a "we are testing the following" list. The board nods, the meeting moves on, and the agency renews because nobody could prove the budget was wrong. You are the internal champion. You read this site because the agency report is not the report you would write yourself. Here is what I would put in the deck instead. ## The four numbers that earn the slot ### 1. Contribution-margin ROAS (not reported ROAS) Reported ROAS is platform-level revenue divided by platform-level spend. It is the number agencies put on the slide because it looks the most generous. It overcounts because of the seven things I have written about elsewhere ([attribution drift](/blog/why-performance-max-gets-credit-for-shopping-conversions/), [shipping and discounts baked in](/blog/roas-inflated-by-shipping-and-discounts/), [customer-lifecycle inflation](/blog/google-ads-revenue-doesnt-match-ga4-shopify/), [Meta CAPI deduplication misses](/frameworks/tracking-stack/)). The number the board needs is contribution-margin ROAS: gross revenue minus discounts, shipping, COGS, payment processing, and returns, divided by media spend. Same formula, real numerator. On most home brands I audit, contribution-margin ROAS is 50-70% of reported ROAS. The board needs to see that gap and know which number the cash decision rests on. **Slide text:** "Reported ROAS 4.1x. Contribution-margin ROAS 2.4x. The gap is shipping, returns, COGS, and attribution overcounting. We make budget decisions off the second number." ### 2. New-customer CAC (not blended CAC) Blended CAC mixes new and returning. It looks healthy because the returning-customer cohort is cheap to reactivate and pulls the blended number down. The board cannot act on it because they cannot tell whether the brand is acquiring profitably or just harvesting an existing list at a discount. New-customer CAC is the only number that tells you whether the growth engine is real. Calculate it as paid-media spend divided by net new customers acquired (Shopify's "first-time orders" report, not "all orders"). Compare against gross margin per new customer minus the first-order cost. If new-customer CAC is higher than 30-day contribution margin, the growth engine is losing money and the budget conversation should be about retention spending, not paid. **Slide text:** "Blended CAC $44. New-customer CAC $127. First-order contribution margin $95. We are losing $32 per new customer on the front end and making it back in months 2-6. Payback weeks below." I walk through the full methodology in [The CAC payback curve post](/blog/cac-payback-curve-shopify-home-brands/). How to pull clean inputs, what changes the curve, the three patterns I see across home brands. ### 3. Incrementality lift (from one quarterly geo holdout) Attribution reports do not measure incrementality. They measure correlation. The board has been trained to assume that "ROAS 4x" means "every dollar of spend produced four dollars of revenue we would not have had otherwise." That assumption is wrong by a wide margin in almost every channel. Run one geo holdout per quarter. Pick a small market with stable trend, pull all paid media for 14-28 days, measure organic revenue against the same market in the previous comparable period. The delta is the incremental lift the paid spend was producing. The result will surprise the board. In most accounts I have seen, true incremental lift is 30-60% of the reported attribution number for branded search and remarketing campaigns. Sometimes it is even lower. **Slide text:** "Q2 geo holdout in [market]. Paused all paid media for 21 days. Organic revenue dropped 38% vs the same market in Q1. Incremental lift was 38%, not the 100% the attribution report implied. We are recalibrating Q3 spend against the true number." The full protocol for running the holdout (which market to pick, the 5-week timeline, how to read the result, what changes about the budget conversation) walks through in [The 21-day geo holdout post](/blog/21-day-geo-holdout-incrementality-test/). ### 4. Media-spend payback in weeks (not generic ROAS) ROAS is a snapshot. Payback weeks is a velocity metric the board can stress-test against the cash position. Calculate it as: cumulative gross margin from a customer cohort divided by the paid-media spend that acquired them, projected out until margin equals spend. The point at which they cross is the payback week. For home brands, that number should be under 12 weeks at a 30% contribution-margin target. Anything beyond 20 weeks is a cash-management risk regardless of how the ROAS looks. **Slide text:** "Customers acquired in Q2 are paying back media spend in 11 weeks at current contribution margin. Q1 cohort paid back in 9 weeks. Trending the wrong direction and we know why (CAC up because of [reason]). The fix lands in Q3 and we will see it in the Q4 payback number." ## The three numbers to cut ### Reported platform ROAS Already covered. It is the number that makes you look smart and the board feel comfortable. Replace it with contribution-margin ROAS so the board is making decisions on cash math, not on the platform's most-generous attribution model. ### Last-click attribution by channel The slide that says "Meta drove 38% of revenue, Google 41%, Email 21%" is meaningless if the channels are running incrementality at 30-60% each. The channels are double-counting the same buyer at different touchpoints. The board sees the percentages, asks "should we shift budget from Meta to Email," and the answer the slide implies is wrong. If you want to show channel mix, show it as "spend allocation" against your stated mix target. That is a decision the board can make. "Last-click revenue share" is a number that looks like a budget input and isn't one. The board cannot allocate against double-counted revenue. ### Anything labeled "engagement" Likes, shares, post saves, video views, "audience growth." None of these map to a board-actionable decision. The board does not allocate budget against post saves. Cut the slide. If you need to show that the brand is alive on social, send the CMO update separately. The board meeting is for capital allocation, not for proving the social manager is working. ## The shape of the slide deck Three slides on paid media in a quarterly board deck. That is the right ratio. - **Slide 1:** The four numbers above, last quarter vs this quarter, with one sentence each on what changed and why. - **Slide 2:** The one strategic decision the board needs to make this quarter (budget shift, channel exit, retention vs acquisition rebalance, an audit fix that requires capex, a [campaign-architecture rebuild](/blog/why-i-run-six-performance-max-campaigns-instead-of-one/)). One slide, one decision, one recommendation. - **Slide 3:** The forward-look. What the CMO is testing next quarter, what the team expects to learn, what gets reported at the next meeting. Anything else belongs in the appendix or the CMO's monthly update, not in the board pack. ## The pre-meeting prep call If you are the CMO and the agency has not given you the four numbers above for the next board meeting, that is a 30-minute call I do for $0 the week before. I read the dashboards, I tell you which numbers in your current deck are inflated and by how much, and I write the slide language above with your actual quarterly numbers in place of the brackets. The senior consultant on the call and on the keyboard. No account manager in the middle. Email [hi@connercrowe.com](mailto:hi@connercrowe.com) with the board-meeting date and I will book the prep. ## Keep going If this hit, the next two pieces in the same universe: - **[I paused all paid media in one state for 21 days](/blog/21-day-geo-holdout-incrementality-test/)**. The geo holdout protocol that produces Number 3 on the slide. The cheapest way to find out what fraction of your reported ROAS is actually incremental. - **[Your ROAS is inflated by shipping and discounts](/blog/roas-inflated-by-shipping-and-discounts/)**. The $6M home brand audit that built the contribution-margin ROAS frame on this site. Free PDF: **[The 25-page Google Ads Setup Audit](/freebies/google-ads-setup-audit.pdf)**. The audit walkthrough the four numbers above are derived from. If the agency report and the P&L are not telling you the same story, that is the board-prep [audit call](/contact/). ## New-customer CAC $127. First-order margin $95. The cohort payback curve that tells me whether to scale. URL: https://connercrowe.com/blog/cac-payback-curve-shopify-home-brands/ Published: 2026-05-17 | Updated: 2026-05-18 Blended CAC hides the cash math. The weekly new-customer payback curve that tells a Shopify home brand whether the next budget increase funds growth. ## Quick Take A Shopify home brand asks me whether to push paid-media budget from $45K/month to $70K. I do not look at ROAS. I look at the CAC payback curve. Specifically: how many weeks does it take for the cumulative contribution margin from a cohort of new customers to equal the paid-media spend that acquired them. If the curve crosses inside 12 weeks, the brand can afford to scale. If it crosses at 20+ weeks, the next budget increase is buying a cash-management problem, not growth. Blended CAC and reported ROAS both hide this. The cohort payback curve is the only number that surfaces it cleanly. Here is the math, the three patterns I see, and what each one means for the next budget decision. ## The receipt A $7M home furnishings brand on Shopify, last quarter. The dashboard said: - Blended ROAS: 4.2x - Blended CAC: $44 - Reported attribution: paid drove 64% of revenue The board wanted to know if the brand could double paid spend in Q3. The agency said yes. I pulled the cohort and said no. The cohort numbers told a different story: - New-customer CAC (paid spend ÷ first-time orders): $127 - First-order AOV: $189 - First-order contribution margin (revenue minus COGS, shipping, payment processing, returns): $95 - The brand was losing $32 per new customer on the first transaction - Month-2 repeat rate: 8% - Month-6 repeat rate: 23% - Month-12 cumulative contribution per customer: $148 - Payback week (cumulative margin = $127 CAC): week 14 Week 14 payback at the existing $45K/month spend was workable. Working capital was sitting at three months of operating cash. Doubling spend to $70K would have stretched the payback week toward 18-22 (because the marginal new customer at higher spend is always more expensive than the average) and dropped working capital to about six weeks. That is the difference between "growth" and "the founder loses a board seat in November." The board got a different recommendation: hold paid at $45K, push the marginal $25K into retention (Klaviyo flow rebuild + post-purchase upsell ladder), and revisit the doubling question in 90 days with a tighter payback curve. That is the kind of read blended CAC cannot produce. The curve does. ## How to calculate cohort payback properly The math is mechanical. The discipline is in pulling clean inputs. **Input 1: paid-media spend for a defined acquisition cohort.** Pick a month. Pull total paid-media spend (Google Ads + Meta + Microsoft + any other) for that month. Subtract any spend that targeted retention or returning audiences (Meta retargeting on past purchasers, Google customer-match excluding new). What's left is the new-customer acquisition spend for that cohort. **Input 2: net new customers acquired in the cohort month.** Pull Shopify's "first-time orders" report for the same month. Each first-time order = one new customer. Do not use "all orders". That mixes returning and skews CAC low. **Input 3: new-customer CAC.** Acquisition spend ÷ first-time orders. For the example above: $45K ÷ 354 = $127. **Input 4: weekly cumulative contribution margin per customer.** This is the work. For the new-customer cohort, track every order they place over the following 26 weeks. Calculate contribution margin per order (gross revenue minus discounts, shipping, COGS, payment processing, returns). Sum cumulatively at each weekly tick. Divide by the cohort size. For the example brand: week 1 cumulative was $95 (the first-order margin). Week 4 was $98 (3% repeat in first month). Week 8 was $108. Week 12 was $119. Week 14 hit $127. Payback. Week 26 reached $148. **Output: the CAC payback curve.** Plot the weekly cumulative margin against the CAC. The week the line crosses is the payback week. Most home brands I work with should be solving for under 12 weeks. Over 20 is a cash-management risk regardless of how the ROAS looks. ## The three curves I see **Curve A: payback inside 12 weeks.** The brand can afford to scale. The cohort pays back the acquisition cost fast enough that the marginal new customer doesn't strain working capital before contributing. The growth budget decision becomes "how fast can we scale before CAC starts climbing past the breakeven point." Typically what produces Curve A: a post-purchase flow that holds a 25%+ Month-2 repeat rate (Klaviyo or Postscript), a category with natural cross-sell (lighting, decor accessories), a 50-65% gross margin product line. **Curve B: payback between 12 and 20 weeks.** The brand can hold the current budget but cannot afford to scale aggressively. The cohort pays back eventually but the slope is shallow enough that doubling spend stretches payback toward the 20+ week danger zone. The right move is to fix the slope (improve repeat rate or first-order margin) before adding more acquisition. Curve B is the most common one I see on $3-10M home brands. The fix is usually retention infrastructure (email + SMS + post-purchase flow) and a margin pass on the catalog (kill the lowest-margin SKUs that are dragging blended CM down). **Curve C: payback at 20+ weeks or never.** The brand is acquiring at a loss the rest of the lifecycle cannot recover. Scaling makes the problem worse. The cohort never pays back the CAC. Every new customer is a cash drag, not a contribution. Curve C usually has one of three causes: the CAC is structurally too high (paid channels are wrong for the AOV band), first-order margin is too thin (discounts and shipping eating the contribution), or repeat rate is broken (no email infrastructure, single-purchase category, or product-market fit problem masked by ad spend). The recommendation is always the same: stop scaling, fix the curve, come back when payback weeks crosses under 16. ## What changes the curve Three levers move CAC payback weeks. In rank order of impact for most home brands: **1. First-order contribution margin.** The biggest single lever. A $95 first-order margin going to $130 (through better margin SKUs, smarter discount discipline, or shipping that no longer eats $18 per order) is the difference between Curve B and Curve A. Most home brands have 10-15 points of margin on the table inside the first 90 days of working on the discount stack and the shipping math. **2. Month-2 repeat rate.** The second-biggest lever. Going from 8% to 18% Month-2 repeat (through a real Klaviyo flow, post-purchase upsell, abandoned-cart sequence) compounds across the curve. Each subsequent customer in the cohort contributes more, faster. A 10-point repeat-rate lift typically pulls payback in by 3-5 weeks on a Curve B brand. **3. New-customer CAC.** The lever everyone focuses on first and that moves the curve the least. Going from $127 CAC to $115 CAC (through better creative, tighter targeting, or a [tracking-audit fix](/blog/google-ads-tracking-audit-guide/)) is real money, but it does not change the shape of the curve. It shifts the starting point. The slope of cumulative contribution stays the same. This is the order of operations for most growth conversations: fix the margin, fix retention, then re-look at CAC. ## Why blended CAC fools the board Blended CAC = total paid spend ÷ all orders. It mixes new and returning customers. Returning customers are cheap to reactivate (often an email cost), which pulls the blended number down hard. The example brand's blended CAC was $44. Its new-customer CAC was $127. The blended number told the board the brand was acquiring efficiently. The new-customer number told the board the front of the funnel was barely paying for itself. A board reading blended CAC concludes the growth engine is healthy and approves doubling the budget. A board reading new-customer CAC and the payback curve sees the cash trap and approves holding budget while fixing retention. The four-number deck I [recommend for the quarterly board update](/blog/board-deck-paid-acquisition-numbers/) puts new-customer CAC at Number 2 and payback weeks at Number 4 specifically to prevent the blended-CAC misread. The two numbers together tell the cash story. Blended CAC by itself tells nothing. ## When the payback curve says "do not scale" Three signals that the next budget increase should wait: **Payback already over 18 weeks at the current spend.** Adding spend stretches it further. Fix the slope first. **Working capital under 90 days of operating expense.** Even a Curve A brand can't afford to double down if the cash cushion is thin. The marginal new customer at higher spend gets more expensive, payback stretches by 2-4 weeks, and the cash buffer goes from 90 days to 60. Get a cash buffer first. **Month-2 repeat rate under 10%.** The shape of the cohort margin curve relies on repeat purchases. Sub-10% Month-2 repeat means the curve is going to be shallow no matter what the first-order margin is. Fix repeat before adding acquisition. If any of these three is true, the right answer to "should we scale paid?" is "not yet." The payback curve gives the founder language for that conversation. ## Common errors in the calculation **Using gross revenue instead of contribution margin.** Gross revenue makes payback look fast. The CAC is real cash out the door. The matching number has to be real cash in (after discounts, shipping, COGS, payment processing, and returns). Most agencies skip this and the curve looks 3-4 weeks shorter than reality. **Including returning-customer spend in the CAC numerator.** Retargeting past purchasers is not new-customer acquisition. Strip it out. Otherwise CAC is inflated and the curve looks worse than it is. **Counting all orders instead of first-time orders in the denominator.** Same direction, opposite reason. Mixing returning into the count makes CAC look low. Shopify's first-time-orders report is the right input. **Pulling a single cohort and stopping.** One month's cohort is one data point. The curve has to be tracked across at least 3-4 cohorts before the pattern stabilizes. Quarterly is the minimum cadence. **Ignoring seasonal cohort variance.** A November cohort acquired around Black Friday has a different shape than a March cohort. Compare like to like, not Q4 cohorts to Q1 cohorts. ## Keep going If this hit, the next two pieces in the same universe: - **[The 4 numbers I put in a $20M home brand's next board deck on paid](/blog/board-deck-paid-acquisition-numbers/)**. The board-prep memo where new-customer CAC and payback weeks are Numbers 2 and 4. This post is the methodology behind both. - **[I paused all paid media in one state for 21 days](/blog/21-day-geo-holdout-incrementality-test/)**. The companion post for Number 3 (incrementality lift). The geo holdout protocol that produces the true incremental ROAS the payback math should be calibrated against. The [Wasted Spend Calculator](/calculator/) is the front-end version of the same math. A 60-second cash read on whether your existing spend is paying back. If your blended CAC looks healthy and your finance team is still nervous about working capital, the disconnect is almost certainly in the new-customer payback curve. The setup call is the [audit conversation](/contact/). ## Your catalog photo budget is the CVR bottleneck (the 2026 math on lifestyle photography for Shopify home brands) URL: https://connercrowe.com/blog/catalog-photo-bottleneck-shopify-home-brands/ Published: 2026-05-17 | Updated: 2026-05-18 A $40K photoshoot used to be the only way to refresh a 150-SKU furniture catalog. The 2026 math on lifestyle render pipelines, and where it breaks. ## Quick Take A Shopify home brand with 150 SKUs walks into a catalog refresh and the photographer quote comes back at $40K-$60K and a 10-week timeline. That budget then sits on the founder's desk for a quarter while traffic to the PDPs of unstyled product photos converts at 1.2%. I built and shipped a 150-SKU lifestyle photo pipeline for a furniture brand on Shopify in 14 days. Lifestyle scenes at roughly 99% product fidelity, produced through a generative pipeline with brand-spec lock. The marginal cost per finished scene was under $4. The CVR delta on the same product pages went from 1.2% to 2.6% inside the first month. The bottleneck on most home-brand Shopify accounts is not the ad spend. It is the photo budget that gates the catalog refresh that gates the CVR lift that would have made the ad spend work. ## The receipt A premium home furnishings brand on Shopify, 150 SKUs, roughly $4M annual revenue, the existing catalog was four years old and skewed toward studio cutouts on white backgrounds. PDP conversion rate sat at 1.2% across the catalog. The board wanted to spend $30K/month more on paid in Q2 to hit the next revenue band. I read the account and pushed back. The ad spend would not survive contact with the existing PDPs. The traditional path: - Hire a furniture-specialist photographer - Quoted $40K-$60K for a 150-SKU shoot - 8-10 weeks of styling, shooting, retouching, delivery - Two-quarter delay before the new imagery hits the site - The Q2 ad spend ships against the existing 1.2% CVR PDPs I shipped a different path. Fourteen days, a generative lifestyle pipeline with brand-spec lock, 99% product fidelity preserved, four hero scenes per SKU plus a small set of room-context scenes for the collection pages. The new imagery hit the PDPs eleven weeks ahead of when a traditional shoot would have delivered. Same Q2 ad budget, new PDPs, new conversion rate. The CVR moved from 1.2% to 2.6% inside the first month. On the planned $30K/month additional spend, that delta is the difference between revenue contribution per click of $14 and $30. Two months of compounding paid for the entire pipeline build. Full case study at [/results/150-sku-furniture-catalog-no-photographer](/results/150-sku-furniture-catalog-no-photographer/). ## The 99% product fidelity threshold The generative-imagery argument has been wrong for years because the imagery has been wrong. Early generative tools rendered "a sofa in a living room" and the sofa was a plausible-looking thing that did not match what shipped to the customer. Wrong fabric weave, wrong cushion depth, wrong wood tone. The customer received the actual product and felt cheated. Returns spiked. 99% fidelity is the threshold where the rendered product matches the actual ship-to-customer product on: - Silhouette and proportions - Material texture and color (including pattern repeat and grain) - Hardware and finish details - Stitching, seam placement, button or upholstery details - Brand-specific design language (the "this looks like ours" signal) Below 99% you get returns and complaints. At 99% you get scenes the customer recognizes as the actual product staged in a home. The pipeline gets there through three controls: **1. Pre-render product spec lock.** Each SKU gets a structured product spec. Material, color hex, dimension, finish, hardware count. That spec becomes part of the generation prompt and a checksum on the output. If the rendered material does not match the locked spec, the scene is rejected before it leaves the pipeline. **2. Provenance metadata on every output.** Every rendered scene saves a JSON sidecar with the source product photo, the prompt, the seed, and the spec checksums. Reproducible and rejectable if the founder spots drift later. **3. A brand constitution document.** Voice, allowed scenes, banned scenes (no jarring color palettes, no unsupported design eras, no children in furniture brand contexts unless explicit), and the rendered aesthetic that maps to the brand's existing photography language. The constitution is the guardrail; the spec lock is the verification. This is what differentiates a working pipeline from a "we tried generative imagery once and it produced nonsense" attempt. ## Why this matters for the Shopify funnel specifically For most home brands on Shopify, the funnel breaks at the same place: meta ads or Google Ads drive traffic to a product page with a single cutout image and a $1,200 sofa, the visitor cannot picture the sofa in their home, the visitor bounces. Adding lifestyle context to the PDP is the highest-leverage CVR move in the entire funnel for any product over $500 AOV. The math on the $4M brand above generalizes: - A 1.2% to 2.6% CVR lift on existing traffic is roughly +120% revenue per visitor at the same ad spend. - For a brand spending $30K-$80K/month on paid, that delta is the largest single growth lever available short of doubling the ad budget. - The cost of generating the lifestyle library through a working in-house pipeline is one to two months of the resulting revenue lift. - Once the library exists, it regenerates on demand for new collections, seasonal updates, or campaign-specific scenes. The marginal cost per scene approaches $4 once the pipeline is built. The traditional photoshoot path produces the same imagery for $40K-$60K and an 8-10 week delay. For a founder running on quarterly cycles, the delay alone is the disqualifier even if the dollar cost was equal. ## What the pipeline is not It is not a replacement for hero product photography. The two or three definitive product photos per SKU, the ones that go on the PDP gallery and the wholesale deck, still get shot traditionally. The lifestyle pipeline supplements those with the contextual scenes that previously did not exist because they would have cost too much. It is not generic generative imagery. Off-the-shelf prompts produce inconsistent results that fail fidelity checks. The pipeline uses a current frontier image model paired with structured prompts, brand-constitution rules, spec-locked product references, and explicit reproducibility infrastructure. The model is one input. The pipeline is what makes the output usable on a real Shopify storefront. It is not infinite. The pipeline does not solve PDP copy, product detail page layout, trust signals, shipping clarity, or the post-purchase experience. Those still need their own attention. The pipeline solves the imagery layer specifically. Solving the imagery layer in 14 days frees the budget and the calendar to solve the rest. ## When this is not the right call Three cases where the in-house lifestyle pipeline is the wrong path: **1. Sub-$1M brand with a 30-SKU catalog.** The pipeline build cost dominates at small scale. Hire a freelance photographer for a focused two-day shoot and ship. **2. Brand whose differentiation is the photography itself.** If your brand is built on a specific photographer's aesthetic that is part of the editorial voice, do not replace it with generated imagery. The trade is not worth the breakage. **3. Founders who cannot supply a brand constitution.** If the team cannot articulate what scenes are on-brand and what scenes are off-brand, the pipeline outputs will drift. The first deliverable in any engagement is the constitution document. If we can't write it together, we don't run the pipeline. For everyone else, the pipeline pays back inside two months and the timeline alone changes the planning horizon. $3M-$25M Shopify home brand, 100+ SKUs, four-quarter cycle that needs catalog imagery to compound. That is the buyer. ## Keep going If this hit, the next two pieces in the same universe: - **[Your ROAS is inflated by shipping and discounts](/blog/roas-inflated-by-shipping-and-discounts/)**. The other Shopify home-brand audit pattern that gates the next budget conversation. - **[From one Performance Max to six: scaling Sugar Babies after the rebuild](/results/scaling-sugar-babies-six-pmax-matrix/)**. What the campaign architecture looks like after the catalog work and the tracking work both ship clean. The cost question underneath all of this is answered directly at [what ecommerce product photography costs in 2026](/product-photography/ecommerce-product-photography-cost-2026/), and the method at [lifestyle product photos without a studio shoot](/product-photography/lifestyle-product-photos-without-a-studio-shoot/). The full production exhibit (12-pair source/render gallery, brand constitution snapshot, the pipeline shape) lives at [/for-home-brands](/for-home-brands/). If your Shopify home brand has a photo bottleneck gating the next ad-spend lift, that is the [audit call](/contact/). ## Nine GTM Tags in 90 Minutes (the build I used to bill $2K for) URL: https://connercrowe.com/blog/agent-built-my-tracking-stack/ Published: 2026-05-17 | Updated: 2026-05-18 Ninety minutes, nine GTM entities, one orphan cleaned up. The tracking-stack build I used to bill $2K for, run with API tooling on my own container. ## Quick Take Tag Manager work has been one of the moats agencies could charge $2-3K/month for. The configuration was finicky enough that founders couldn't handle it themselves and senior operators were a scarce resource. That moat is shrinking. Last week I closed the tracking gaps on my own site in 90 minutes: three Data Layer Variables, three custom event triggers, three GA4 event tags wired to them, one orphaned trigger deleted, a new container version published. About ninety percent of the work ran with build tooling that has direct API access to GTM. The final publish click had to be done in the UI because of how Google handles OAuth scope verification. The senior operator who built the framework and the tooling that runs it are starting to do the same hour of work. That last detail is the actual story. ## The Setup Question I've been writing about [The Tracking Stack](/frameworks/tracking-stack/) for about a year. Eight layers, opinionated, documented as a reference architecture for Shopify and lead-gen sites. It's the framework I use on every client engagement. It's also what convinced me to start running the configuration with API tooling directly instead of just generating advice about it. The question I wanted to answer: can this tooling administer Google Tag Manager well enough that I'd run it on a paying client's container? Not "can it generate the right tag config." That's old news. The actual question is operational. Can it read what's already there, propose the right changes, build them, ship them, and recover when something breaks. The setup took maybe twenty minutes. The tooling runs a local server that wraps the Tag Manager API. I picked a community-maintained one rather than the hosted alternative because I'd rather not route an admin-level OAuth token through somebody else's infrastructure. That choice ended up mattering twice during the build. Once the server was installed and Google OAuth granted, the tooling had access to about a hundred Tag Manager operations: list accounts, read tags, create triggers, update variables, publish versions. From there it was a real ops session, not a demo. ## What the Agent Found Before It Built Anything First pass was the audit. List the accounts I have access to. Find the right one. Pull every tag, trigger, and variable in the container. Compare what was actually firing against what my site's `dataLayer` was emitting. Seven tags, five triggers, three Data Layer Variables. The audit took under a minute. The diagnosis was harder than I expected. My site fires six custom dataLayer events: `cta_click`, `calendly_open`, `lead_magnet_submit`, `contact_form_submit`, `case_study_view`, and `blog_post_view`. Three of those had GTM tags catching them. The other three were emitting into the void. `lead_magnet_submit`, in particular, fires every time someone downloads one of my free PDFs. That's the highest-intent event on the site. It was hitting the floor. The audit wrote up the gap, ranked the missing pieces, and asked which tier to ship. That conversation took two minutes. I picked the highest-priority tier: close the dataLayer gaps. New DLVs, new triggers, new GA4 tags wired to them. ## What It Built Three Data Layer Variables: `DLV - lead_magnet_name`, `DLV - form_type`, `DLV - page_path`. Each one reads the corresponding key off the dataLayer. Three custom event triggers: `CE - lead_magnet_submit`, `CE - case_study_view`, `CE - blog_post_view`. Each one fires when its named dataLayer event arrives. Three GA4 event tags: `GA4 - Lead Magnet Submit`, `GA4 - Case Study View`, `GA4 - Blog Post View`. Each one is wired to its corresponding trigger and forwards the event to the GA4 property already running on the site. One orphaned trigger deleted. There was a Scroll Depth 50% trigger sitting in the container connected to no tag. The audit flagged it and asked permission to clean it up. Everything went into the Default Workspace in a single review pass. I checked the diff, approved, and the publish step ran. That's where it got interesting. ## The Three Things That Broke The first was a Windows filesystem quirk. The edit-and-restart loop hit a virtualized `AppData` folder that the writer process could touch but the running server subprocess couldn't read from. Half an hour of restart cycles before I noticed four stale Node processes, each loading the unpatched server. Killed them all. The fifth spawn loaded the patched file. The second was the server itself. Its `createVariable` function had a bug. It hardcoded the parameter shape to `{ key: 'value' }` regardless of the variable type. That works fine for Constants but breaks for Data Layer Variables, which require `{ key: 'name' }` and a `dataLayerVersion` parameter. Every DLV creation came back with `vendorTemplate.parameter.name: The value must not be empty`. Source read, bug identified, thirteen-line patch with three-branch logic for the parameter shape, permission to apply. I authorized. The patch went in, the next variable created cleanly, the build continued. I'll send the same patch back to the maintainer as a pull request when this post ships. The third was Google's own OAuth scope handling. The local server requested two scopes during the consent flow: `tagmanager.edit.containers` and `tagmanager.publish`. Both showed up in the auth URL. But when the publish step ran, Google returned `Insufficient Permission`. The edit scope was honored. The publish scope wasn't. My read is that publishing a Tag Manager version is one of the sensitive scopes Google flags for unverified OAuth apps, and an unverified app in testing mode can't actually use it even if the consent flow appeared to grant it. The build was complete. Nine new entities, all correctly wired. The only thing left was the publish button. I clicked it manually in the GTM UI. That took fifteen seconds. ## What This Means For Tracking Ops If you're a founder or operator waiting to see what fast in-house tracking ops actually looks like, this is the shape of it. Not the demo version. The build did the hour of work I'd otherwise be in the keyboard for. Audit, plan, build, surface the diff, approve. Three independent failure modes surfaced and got worked through. Source read, bug patched, the rest of the build continued. A permissions wall I had to step through manually, the rest of the work intact. What did not happen automatically: crossing an OAuth verification boundary, deleting things I hadn't explicitly authorized, publishing a production version without my approval. Each refusal was correct. The safety net is doing what it should. What the next version of this looks like is fairly obvious. The bug gets patched upstream, OAuth verification gets sorted, and the same playbook runs on a real client engagement. The pieces that need a human shrink to "approve the diff" and "click publish." That's a meaningful shift for the tracking layer specifically. Tag Manager work has always been one of the moats agencies could charge for, because the configuration is finicky enough that founders couldn't handle it themselves. That moat shrinks every quarter now. The senior operator who built the framework and the tooling that runs it are starting to do the same hour of work. ## The Receipt Container `GTM-K5F244FD` is now on version 18 as of today. The build added three Data Layer Variables, three triggers, three GA4 event tags, and removed one orphan. Version 17 was the pre-build baseline. The diff is the work. The full audit, plan, and build session is documented in this post. The Tracking Stack framework itself is at [/frameworks/tracking-stack](/frameworks/tracking-stack/) and unchanged. This post is the case study of operating it. If you want the same audit run on your own container, that's the [audit call](/contact/). ## One Footnote For Engineers The MCP server I used is `gtm-mcp` on npm, maintained by [pouyanafisi](https://github.com/pouyanafisi/gtm-mcp). The bug I patched is in `dist/gtm-client.js`, function `createVariable`. The fix is to branch the `parameter` array construction on `variableType` so `v` returns `[{ key: 'name' }, { key: 'dataLayerVersion' }]` instead of always returning `[{ key: 'value' }]`. I'll send the upstream PR. ## Keep going If this hit, the next two pieces in the same universe: - **[The Bing pixel that said YOUR_VALUE_HERE](/blog/bing-pixel-your-value-here/)**. The audit shape this build was modeling, eleven findings deep on an inherited Shopify stack. - **[The Workflow That Lets Me Ship a Site in 24 Hours](/blog/wispr-flow-claude-the-input-bandwidth-problem/)**. The input-layer workflow that makes fast in-house ops feasible inside a working session. Free PDF: **[The 25-page Tracking Stack](/freebies/tracking-stack.pdf)**. No email gate. ## The CLOSE Audit: the 5-pass lead-quality walkthrough I run before I touch a service-business account (2026 edition) URL: https://connercrowe.com/blog/close-audit-service-business-lead-quality/ Published: 2026-05-17 | Updated: 2026-05-18 Smart Bidding finds more of whatever signal you feed it. The named audit I run on a service-business account before changing a single campaign. ## Quick Take Smart Bidding finds you more of whatever conversion signal you mark as primary. Most service-business accounts mark "form submission" as primary. The algorithm goes and finds you the cheapest form submitters, which are also the worst leads. The partners conclude paid acquisition does not work. I have heard that conclusion across roughly twenty service-business audits in the last 18 months. The cause is upstream of the campaigns every single time. **The CLOSE Audit** is the named five-pass walkthrough I run before any campaign change. C for CRM wiring, L for Lead source capture, O for Offline conversion imports, S for Signal swap (the primary-conversion change), E for Enhanced Conversions for Leads. Each pass takes 20-45 minutes. Together they catch 80%+ of the leak on a typical service-business account. ## The receipt Across the last six service-business audits I have run, the same five-pass diagnostic caught the leak in every case. A real estate law firm, two HVAC contractors, a med spa, a dental practice, a boutique B2B agency. The accounts ranged from $8K/mo to $35K/mo in paid media. The vertical was different. The mistake was the same. Five of the six had Smart Bidding optimizing against raw form-fill conversions. Four of the six were missing gclid capture on the contact form, which meant the closed-won feedback loop could not have worked even if it had been wired. Three of the six had no call tracking, despite getting more leads from phone calls than from forms. All six had a CRM full of closed-won deal data that had never been imported back into Google Ads as an offline conversion. The dashboards looked fine. The reporting decks said "cost per lead $48, healthy." The intake teams were quietly burning out filtering junk. The partners had been told paid was working. The fix in every case started with the same audit. Three of the six rebuilt over 60-90 days and saw qualified-lead share jump from 30-45% to 65-80% on the same spend. The other three are mid-rebuild. The audit has a name and a shape so I do not skip steps when an account looks fine on the surface. Here is the shape. ## The CLOSE Audit Five passes. Each one maps to a class of leak that compounds invisibly until the leads stop closing. Each one takes me 20-45 minutes on a typical service-business account. Pair them with [The Lead Quality Stack](/frameworks/lead-quality-stack/) framework and the architecture comes together. ### C. CRM wiring What it checks: the CRM is the source of truth, closed-won events are exposed via webhook or API, and stage transitions are timestamped. Everything else in the audit depends on this layer. If your CRM is not emitting closed-won events to a webhook (or queryable via the API), the offline conversion loop cannot fire and Smart Bidding will never see what good looks like. The CRM is layer 01 in the framework, the source of truth that the rest of the stack inherits from. Specifically: - The CRM has an API or webhook surface (Salesforce, HubSpot, Pipedrive, GoHighLevel, Zoho all do) - Closed-won events expose the original lead's source identifiers (gclid, fbclid, UTM parameters) - Stage transitions are timestamped (lead → MQL → SQL → closed-won), with each transition recorded - A workflow fires when a deal moves to closed-won, ready to push the win back to the ad platforms If the CRM is HubSpot Sales Hub on a paid tier, this work is one workflow. If it is a homegrown Airtable + Zapier stack, it is a half-day. If the CRM does not exist (which I have seen at firms under $1M), the audit stops here and the recommendation is "wire a CRM before touching paid acquisition." ### L. Lead source capture What it checks: every form submission and every tracked phone call carries the original ad-click identifier all the way through to the CRM record. This is the layer almost every audit catches a break in. The Google click ID (`gclid`) gets generated when somebody clicks a Google ad. Meta generates an `fbclid`. UTM parameters carry source/medium/campaign for everything else. All three need to land in hidden form fields on every conversion surface and flow into the CRM with the lead. If they do not, you can wire the closed-won webhook perfectly and the offline conversion imports will fail at the join step because there is no click ID to match against. The capture pass: - gclid, fbclid, and UTM parameters captured by a small script on page load - Stored in cookies or sessionStorage with a 90-day expiry - Hidden fields on every form (contact form, intake form, newsletter signup, calculator submission) populated from the cookie at submit time - Call tracking platform (WhatConverts, CallRail) configured to carry the same identifiers through dynamic number insertion - CRM record stores the click ID on the contact, not only the deal. A return visitor who converts months later still attaches [The why-conversions law firm rebuild](/blog/why-conversions-win-over-clicks/) failed this pass at step zero. The firm had two years of pipeline data and zero ability to attribute it back to Google Ads. The first fix on day three was wiring gclid capture. ### O. Offline conversion imports What it checks: when a lead becomes a closed-won deal in the CRM, that win is imported back into Google Ads (and Meta Ads) as an offline conversion event with the original click ID and deal value attached. This is the loop that makes Smart Bidding work for lead-gen. Without it, the algorithm has no idea which form-fills turned into actual paying customers. With it, the algorithm starts finding you more of the buyers who close, not more of the people who fill forms. The import pass: - A CRM workflow or webhook fires when a deal moves to closed-won status - The webhook pushes to Google Ads' offline conversion endpoint (`gads_offline_conversion`) with the gclid, deal value, and timestamp - The same workflow fires to Meta Ads via the Conversions API for offline events using fbclid - Conversion adjustments fire too, so refunds and cancellations subtract from the cohort - A reconciliation report runs weekly: closed-won deals in CRM vs. offline conversions received in Google Ads, with a drift target under 5% This is layer 08 in the framework. The lead-gen version of the "Klaviyo identity loop" pass in the STACK Audit. First-party data feeding the algorithm on every deal, not a one-time export. ### S. Signal swap What it checks: the primary conversion in Google Ads (and Meta Ads) is "qualified lead" or "closed-won," not "form submission." Secondary conversions are demoted so the algorithm has clean signal. This is the single highest-leverage change in any lead-gen account that has run for 60+ days on the wrong primary conversion. Most service-business accounts have "Contact Form Submit" set as primary, often with seven other conversion types also set as primary. The algorithm averages across all of them and chases the cheapest, which is always raw form-fills. The swap pass: - Define "qualified lead" through a written intake rubric (matches service line, in-territory, named decision-maker, budget signal) - The intake team scores every lead within 24 hours of receipt - Qualified-lead events fire through the same webhook pattern (gclid → Google Ads offline conversion) - New primary conversion in Google Ads: "Qualified Lead." All other conversions (form-fills, page-views, scrolls) demoted to secondary - Smart Bidding strategy: target CPA on qualified-lead cost (not Maximize Conversions, not Maximize Conversion Value yet) - Expect 4-6 weeks of rebalancing as the algorithm relearns the new cohort If Smart Bidding has been running for more than 60 days on raw form-fill as primary, this pass produces the largest single jump in qualified-lead share. The why-conversions law firm rebuild was a textbook example: 38% to 72% qualified-lead share on the same spend after this swap landed. ### E. Enhanced Conversions for Leads What it checks: hashed email and phone numbers from every form submission and phone call are being uploaded to Google Ads (and Meta CAPI) so the algorithm can match offline conversions back to the original ad click. This is the layer that closes the iOS / Safari / ad-blocker gap. Without it, you lose roughly 15-25% of conversion attribution to client-side restrictions in 2026. With it, the offline conversion match rate jumps from ~60% to ~85% on a typical service-business account. The Enhanced Conversions pass: - Enhanced Conversions for Leads enabled on the qualified-lead conversion in Google Ads - Hashed email and phone fields populated on the lead record (server-side SHA-256, not client-side) - The same hashed identity flows through the server-side container to Meta CAPI for matched offline events - A test: submit your own contact form, follow the lead through to closed-won, verify the closed-won offline conversion shows up in Google Ads within 48 hours and matches back to the original click If Enhanced Conversions are "enabled" in the UI but the `user_data` payload is empty (the most common case, covered in [the no-recent-enhanced-conversions post](/blog/no-recent-enhanced-conversions-alert/)), this pass catches it. The audit ends with a working test conversion that proves the loop is closed end-to-end. ## What this audit is not It is not a media-buying audit. It does not look at campaign structure, ad copy, bid strategy, or budget allocation. Those audits are downstream of this one and pointless without it. If the lead-quality signal is broken, every conclusion the media-buying audit reaches is built on the wrong number. It is not the [STACK Audit](/blog/google-ads-tracking-audit-guide/). The STACK Audit is the e-commerce / Shopify variant. Five passes on the 8-layer Tracking Stack where the conversion event is a purchase. The CLOSE Audit is the parallel for service businesses where the conversion event is a closed-won deal. Different layers, same shape, same 20-45 minute pass length. It is not a one-pass-and-done audit. CRMs drift. Sales teams change qualification criteria. Call-tracking platforms rotate numbers. New ad channels get added without telling the operator. I re-run the CLOSE Audit at the start of every quarter and any time a meaningful change lands (new CRM, new ad channel, new intake team). ## The receipts Across the six service-business audits referenced above: - **Five of six** had primary conversion set to raw form-fills (pass S fail) - **Four of six** had no gclid capture on the contact form (pass L fail) - **All six** had a CRM full of closed-won data never imported back to Google Ads (pass O fail) - **Three of six** had no call tracking despite calls being the dominant lead source (pass C+L compound fail) - **All six** had Enhanced Conversions either off or wired with an empty payload (pass E fail) The accounts that completed the rebuild over 60-90 days saw qualified-lead share rise from 30-45% to 65-80% on the same media spend. Closed-won deal count rose 25-50%. Cost per closed-won deal dropped accordingly. The CLOSE Audit walks the same shape as the 25-page [Lead Quality Stack PDF](/freebies/lead-quality-stack.pdf), which expands every pass with the screenshots, webhook code samples, and CRM workflow specs. No email gate. Page 23 has the only ask. ## Keep going If this hit, the next two pieces in the same universe: - **[Closed-won to Google Ads in 48 hours: the offline-conversion pipeline](/blog/closed-won-webhook-hubspot-google-ads-offline-conversions/)**. The implementation companion. The exact webhook pipeline that runs the O and E passes of the audit end-to-end. - **[I switched a law firm off Max Clicks last quarter](/blog/why-conversions-win-over-clicks/)**. The case study that ran on this exact audit. $14K/mo, 38% to 72% qualified-lead share over 90 days. The two symptoms that send people here have direct answers: [why Google Ads leads are low quality](/lead-quality/why-are-my-google-ads-leads-low-quality/) and [how to stop spam form submissions inflating conversions](/lead-quality/stop-spam-form-submissions-inflating-google-ads-conversions/). Free PDF: **[The 25-page Lead Quality Stack](/freebies/lead-quality-stack.pdf)**. The CLOSE Audit walkthrough, expanded with webhook code samples and the intake rubric template. No email gate. If your service-business account looks fine on the dashboard and the intake team is doing free QA on garbage leads, the CLOSE Audit is the diagnostic. The full program shape (audit, rebuild, ongoing) lives at [/for-service-brands](/for-service-brands/). Or [talk to me](/contact/). ## Closed-won to Google Ads in 48 hours: the offline-conversion pipeline I run on every service-business account (2026 edition) URL: https://connercrowe.com/blog/closed-won-webhook-hubspot-google-ads-offline-conversions/ Published: 2026-05-17 | Updated: 2026-05-18 The webhook pipeline from HubSpot to Google Ads and Meta CAPI so bidding optimizes against paying customers. Trigger, payload, code, failure modes. ## Quick Take The [CLOSE Audit](/blog/close-audit-service-business-lead-quality/) names the diagnostic. This is the implementation. When a deal moves to closed-won in HubSpot, a webhook fires within 60 seconds. The webhook hands the original Google click ID, the deal value, and the timestamp to Google Ads' offline conversion endpoint. A parallel call lands a matching event in Meta's offline Conversions API using the captured `fbclid`. Inside 48 hours Smart Bidding has rebid against the new signal. The pipeline is roughly 50 lines of code, costs $0 to host on Cloudflare Workers, and is the difference between an account optimizing for cheap form-fills and an account optimizing for paying customers. ## What the pipeline does The shape is straightforward. A prospect clicks a Google Ads ad. The browser receives a `gclid` URL parameter. A small script captures the `gclid` (and `fbclid`, and UTMs) into a cookie. When the prospect submits the contact form, hidden fields read the cookie and post the click IDs to HubSpot alongside their email and phone. HubSpot stores the click IDs on the contact record and inherits them to any associated deal. Days, weeks, or months later, the deal moves through stages. Qualified, proposal, negotiation. When it lands on closed-won, a HubSpot workflow fires. The workflow makes two outbound HTTP calls. One lands at Google Ads' offline conversion endpoint and posts the win against the original `gclid`. One lands at Meta's offline Conversions API and posts the same against the `fbclid`. Both calls include the deal value and a timestamp. Smart Bidding sees the new conversion within an hour. By 48 hours, it has shifted its model: this kind of buyer (the one who clicked, filled the form, qualified, and eventually paid) is now the signal it optimizes for. The cheap-form-fill cohort gets demoted automatically because it never produces closed-won events. The pipeline runs continuously. Every closed-won deal becomes a feedback signal. Every refund or cancellation can fire a conversion adjustment that subtracts the signal back out. ## Layer 1: gclid + fbclid capture on the contact form Without this layer the rest of the pipeline cannot work. There has to be a click ID stored against the contact at form-submit time. Most service-business sites never wire this and lose the connection at step one. The pattern: a small script on every page reads URL parameters on first load, stores them in a 90-day cookie, and exposes them to any form on the site through hidden fields. ```html ``` Drop this in GTM as a Custom HTML tag firing on All Pages. Then create a HubSpot contact property for each of the seven keys (`gclid`, `fbclid`, plus the five UTM fields). Map those properties to the corresponding hidden fields in every form. After the form submits, the click ID lives on the contact forever. When a contact converts to a deal, set up a HubSpot workflow that copies the click-ID properties from the contact to the deal. This is the join key that everything downstream depends on. ## Layer 2: the HubSpot workflow on closed-won HubSpot Operations Hub Professional or higher gets you a Custom Code action that can fire JavaScript inline. Lower tiers do not have this, but the Webhook action is available on every paid Marketing Hub tier and a small Cloudflare Worker (free for the volume any service business will produce) takes the place of the inline code. The workflow itself: - **Trigger:** Deal property `Deal stage` is any of `Closed Won`. - **Filter:** `gclid` is known OR `fbclid` is known. Skip the action for deals with no captured click ID. (Add an internal Slack notification on the skipped path so you can see how much closed-won revenue is going untracked. The number should trend toward zero as more channels capture click IDs.) - **Action 1:** Custom code (Ops Hub Pro+) or Webhook (lower tiers) that fires the Google Ads upload. - **Action 2:** Same pattern for the Meta offline event. The custom-code payload reads deal properties and the associated contact's properties, builds two API payloads, and fires them. On lower tiers, the webhook posts a JSON body to a Cloudflare Worker that does the same work. ## Layer 3: the Google Ads offline conversion call Google Ads exposes the offline conversion upload at: ``` POST https://googleads.googleapis.com/v18/customers/{customer_id}/conversionUploads:uploadClickConversions ``` The minimal payload: ```json { "conversions": [ { "gclid": "EAIaIQobChMI...", "conversionAction": "customers/{customer_id}/conversionActions/{conversion_action_id}", "conversionDateTime": "2026-05-17 14:32:11+00:00", "conversionValue": 8500.00, "currencyCode": "USD" } ], "partialFailure": true } ``` Five required fields. `gclid` from the HubSpot deal. `conversionAction` is the resource name of the "Qualified Lead" or "Closed Won" conversion you created in Google Ads (find it in the conversion action URL). `conversionDateTime` is the deal close date in `YYYY-MM-DD HH:MM:SS+ZZ:ZZ` format with a timezone offset that matches your Google Ads account. `conversionValue` is the deal amount. `currencyCode` is the obvious one. The endpoint requires an OAuth2 access token (refresh-token flow against a Google Cloud project with the Ads API enabled) plus a developer token (from your Google Ads MCC). Both live as encrypted env vars in the Worker. The Worker exchanges the refresh token for a short-lived access token on every call. Set `partialFailure: true` so a single bad payload (typo'd gclid, missing field) doesn't kill the batch. ## Layer 4: the Meta CAPI parallel Meta's offline event endpoint is similar in shape but lives at a per-dataset URL: ``` POST https://graph.facebook.com/v18.0/{dataset_id}/events ``` The minimal payload: ```json { "data": [ { "event_name": "Purchase", "event_time": 1747500731, "action_source": "system_generated", "user_data": { "fbc": "fb.1.1747500000.IwAR3...", "em": ["sha256_hashed_email_here"], "ph": ["sha256_hashed_phone_here"] }, "custom_data": { "value": 8500.00, "currency": "USD" }, "event_id": "deal_47821" } ] } ``` Use `action_source: "system_generated"` for offline events sourced from a CRM. The `fbc` field is the formatted `fbclid` (the SDK does this for you; if you're rolling raw, prepend `fb.1.{event_time}.` to the captured `fbclid`). Hashed email and phone are SHA-256 lowercased. Include both when you have them. Meta's match rate on a deal jumps from ~40% with `fbc` alone to ~75% with `fbc` + email + phone. `event_id` should be a stable unique identifier so Meta dedupes if the workflow fires twice. The HubSpot deal ID is the obvious choice. Authentication: a long-lived access token tied to the System User on your Meta Business Manager. Treat it like a database password. Encrypted env var only, never in the workflow body or in code commits. ## Layer 5: conversion adjustments for refunds and cancellations A deal that closes won and then refunds three weeks later is still in Smart Bidding's signal as a closed-won. The fix is to fire a conversion adjustment that subtracts the original conversion when the deal status changes. Google Ads adjustment endpoint: ``` POST https://googleads.googleapis.com/v18/customers/{customer_id}/conversionAdjustmentUploads:uploadConversionAdjustments ``` The payload uses `adjustmentType: "RETRACTION"` (for full cancellation) or `RESTATEMENT` (for partial refund). Both reference the original `gclid` + `conversionAction` so Google can identify which click conversion is being adjusted. Set up a second HubSpot workflow triggered on `Deal stage = Closed Lost (after Closed Won)` or `Deal property "Refunded" = true`. Same Worker, different endpoint, different adjustment type. Meta handles this with a `delete` event of the same `event_id`. Cleaner than Google's adjustment API, less verbose. ## Layer 6: the weekly reconciliation report The pipeline breaks for predictable reasons without alerting you: a workflow gets disabled, an API token expires, a Google Ads conversion action gets archived. Without a reconciliation report, you find out three months later when Smart Bidding's signal has drifted. The report runs every Monday morning. Two queries: - Closed-won deals in HubSpot for the prior 7 days, by source - Offline conversions received in Google Ads + Meta for the same 7 days, by conversion action Drift target: under 5% mismatch. If the gap opens wider than 5%, something is broken in the pipeline. Anything under 5% is normal floor noise (clicks beyond Google's 90-day lookback, deals from organic that have no click ID, manually-entered deals with no source). The report goes to my Monday written summary every week. ## What this pipeline is not It is not a substitute for clean form-tracking. If the gclid is not being captured at form-submit, this pipeline has nothing to send. Run the [CLOSE Audit](/blog/close-audit-service-business-lead-quality/) before building the pipeline. It is not a substitute for the qualified-lead signal swap. If "form submission" is still marked as primary in Google Ads, the closed-won feedback just adds another signal alongside the noisy one. The CLOSE Audit's S pass (Signal swap) has to land first. It is not a HubSpot-only pattern. Salesforce, Pipedrive, Zoho, GoHighLevel all have webhook surfaces and the same workflow logic applies. The endpoints and payload shapes for Google Ads and Meta are identical regardless of CRM. ## The receipts Wired this pipeline on the law-firm rebuild [documented here](/blog/why-conversions-win-over-clicks/). HubSpot Marketing Hub Starter (no Ops Hub) plus a Cloudflare Worker. ~150 lines of TypeScript including auth, error handling, and the reconciliation query. Cloudflare cost: $0/mo at the volume the firm produced (under 100K requests). Hosted under the firm's own Cloudflare account so the auth tokens stay with them. Deal-to-Google-Ads latency: 45-90 seconds (HubSpot workflow trigger lag + Worker execution time + Google Ads API processing). Deal-to-Smart-Bidding-signal: 24-48 hours (Google Ads aggregates offline conversions into Smart Bidding's model on a daily cadence). Match rate, Google Ads (offline conversion accepted / offline conversion sent): 87% after 60 days of reconciliation cleanup, mostly capped by stale gclids beyond the 90-day lookback. Match rate, Meta (`fbc` + hashed email + phone): 71%, lower because not every closed-won deal had clicked from Meta to begin with. ## Keep going If this hit, the next two pieces in the same universe: - **[The CLOSE Audit: the 5-pass lead-quality walkthrough](/blog/close-audit-service-business-lead-quality/)**. The named diagnostic this pipeline lives at the bottom of. Run the audit before building the implementation. - **[I switched a law firm off Max Clicks last quarter](/blog/why-conversions-win-over-clicks/)**. The case study that ran this exact pipeline end-to-end. $14K/mo, 38% to 72% qualified-lead share over 90 days. The short version of this pipeline, without the code, is at [importing closed-won deals into Google Ads as offline conversions](/lead-quality/import-closed-won-deals-google-ads-offline-conversions/). Free PDF: **[The 25-page Lead Quality Stack](/freebies/lead-quality-stack.pdf)**. The architecture this implementation slots into. If your CRM has closed-won data sitting unused by your ad platforms, the implementation is one [audit call](/contact/) away. Same person on the call as on the keyboard. ## Your ROAS is inflated by shipping and discounts (Smart Bidding is optimizing for the wrong number) URL: https://connercrowe.com/blog/roas-inflated-by-shipping-and-discounts/ Published: 2026-05-17 Most Shopify Purchase events send gross revenue to Google Ads, so Smart Bidding chases high-shipping orders. The four-step fix takes ten minutes. A $6M Shopify home brand audit, last quarter. Blended ROAS reading 2.4 in their Looker Studio dashboard. Contribution margin per order: negative on 28% of revenue once shipping, returns, and platform fees were deducted. Twelve months of media optimization, and the algorithm had been quietly steering them toward the orders that lose them money. Nobody at the brand had touched the conversion value variable since the GA4 migration in 2023. The bid layer was doing exactly what they told it to do. The thing they told it to do was wrong. ## Quick Take Smart Bidding optimizes against the conversion value you send it. The default Shopify + GA4 + Google Ads stack sends gross transaction value, which includes shipping, tax, and discounts. A $200 order with $50 shipping reports as $250. Smart Bidding then thinks that order is more valuable than a $250 free-shipping order and bids harder on the high-shipping segment. Margin contribution drifts down quietly for 6 to 12 months. The fix is a 10-minute change in your purchase event variable. The result is a 6-week algorithm rebalance toward profitable orders. ## How transaction value gets to Google Ads In a stock Shopify + GA4 + Google Ads setup, the Purchase event fires when checkout completes. GA4 receives a `transaction_value` parameter that defaults to the cart total. The cart total includes the merchandise, the shipping line, the tax, and any discount that has been applied as a negative line item. Then GA4 forwards that value to Google Ads via the linked-property connection. Google Ads treats every dollar of that value identically. It does not know that $50 of the $290 was shipping. It does not know that the brand makes negative margin on that shipping line. It does not know whether the $40 discount was a strategic loyalty incentive or a 30% sitewide fire sale that burned margin. From the bidding algorithm's perspective, $290 is $290. So Smart Bidding, doing its job, looks at the historical Purchase data and asks: which audience segments produce the highest conversion value per click? The answer comes back skewed. People who buy heavy products that ship from a single warehouse generate higher recorded "values" (because the shipping line is larger). People who only buy when there's a discount generate slightly lower recorded values, but they convert at a higher rate. The algorithm bids harder on both. The brand pays more for high-shipping cart shoppers and discount-hunters than it should. Twelve months of this and the contribution margin curve crosses zero on a meaningful chunk of revenue. The dashboard never tells anyone because the dashboard is reporting the inflated number. ## The moment in the account where this becomes obvious Day two of the audit. I opened GTM and searched for the Purchase tag. Variable mapping: `Transaction Total` pulled from the dataLayer. Pulled the Shopify checkout source, scrolled to the dataLayer push. The push contained `total_price`, which Shopify defines as merchandise + shipping + tax minus discounts. Not net to the brand. Then I opened the GA4 property, Events > Purchase > Modify event. Default value parameter. Same number. Then Google Ads, Goals > Conversions > Purchase > Edit. Conversion value: "Use the value from the event." Inherited again. The whole stack was reporting gross-with-shipping-with-tax. Smart Bidding had been optimizing on that signal since the GA4 migration. The agency the brand was working with had not touched it. Probably because the dashboard looked fine. I pulled Shopify's last 90 days of transactions and rebuilt the value column manually. Net revenue (gross minus shipping minus tax minus discounts) ran about 18% lower than the value Google Ads was seeing. The orders that drove the largest gap, predictably, were the high-shipping segment. ## The 4-step fix These are in order. Each one is a 1-3 minute change in the relevant console. 1. **Define a net revenue variable in Shopify (or via GTM).** Either compute it server-side with a Shopify Function on the checkout, or pull `subtotal_price` and `total_discounts` from the dataLayer and subtract. Net = subtotal minus discounts. Tax and shipping never enter the equation. This is the number that maps to contribution margin. 2. **Replace the value parameter in GA4.** In GTM, edit the GA4 Purchase event tag. Swap the value field from the existing `transaction_total` variable to the new `net_revenue` variable. Publish a new container version. Verify in GA4 DebugView that the next purchase event sends the lower number. 3. **Re-import the purchase conversion in Google Ads.** Google Ads will pick up the change automatically through the linked GA4 property within a day or two. Confirm in Goals > Conversions > Purchase that the recent conversion values match the new lower numbers. If they don't, the conversion is being inherited from a non-GA4 source (usually the Google Ads tag itself); replace that source too. 4. **Wait 6 weeks.** Smart Bidding needs around 50 conversions of the new signal to rebalance. During the 6 weeks, hold your tROAS target and your bid strategy constant. Do not also change creative, also change audiences, also change campaign structure. One variable per change window or the algorithm has nothing clean to learn from. Step 4 is where most teams fail. The dashboard ROAS will look worse for those six weeks because the same orders are now reporting lower values. The temptation is to "fix it." Don't. The algorithm is recalibrating against the right signal for the first time. ## What happens if you don't do this The dashboard keeps showing healthy ROAS because the dashboard is reporting the wrong number. Smart Bidding keeps bidding hardest on the high-shipping segment and the discount segment because those are the ones it thinks are most valuable. Contribution margin per order drifts down ~2-4% per quarter as the audience composition shifts. After three quarters, the CFO notices it in the gross-margin line. After four quarters, the founder cuts media budget by 25%. The remaining 75% of the budget is now bidding against the same broken signal, on the same skewed audience model, which makes the cheap-margin problem worse, not better. Eighteen months later the brand concludes that Google Ads doesn't work for furniture. They are not wrong about the symptom. They are wrong about the root cause. I have audited 14 mid-market Shopify brands in the last two years. Eleven of them had this exact configuration. Of those eleven, three had also been told by their previous agency that the issue was "creative fatigue." ## Receipts Audit ran across the $6M furniture brand's Shopify account, GTM container, GA4 property, and Google Ads account. The conversion value swap took effect on day 8. Smart Bidding completed the rebalance over weeks 5 through 8. Reported ROAS dropped from 2.4 to 2.0 over that window. Contribution-margin ROAS (the number that maps to the P&L) rose from 1.4 to 1.7. Margin-per-click rose 22% on the same media spend. The shipping-heavy segment dropped from 41% of orders to 28% as Smart Bidding rebalanced. The wasted-spend calculator on this site is built around the same model. The same brand's CAC payback curve, calibrated against the corrected contribution-margin ROAS, walks through in [the CAC payback post](/blog/cac-payback-curve-shopify-home-brands/). The two reads compound: a corrected ROAS proves the spend is honest; the payback curve tells the founder whether the next budget increment is buying growth or buying a cash crunch. ## Keep going If this hit, the next two pieces in the same universe: - **[Why Performance Max gets credit for Shopping conversions](/blog/why-performance-max-gets-credit-for-shopping-conversions/)**. The other side of the attribution problem in mid-market accounts. - **[I switched a law firm off Max Clicks last quarter](/blog/why-conversions-win-over-clicks/)**. Same root pattern (wrong signal, right algorithm), service-business version. Free PDF: **[The 25-page Tracking Stack](/freebies/tracking-stack.pdf)**. No email gate. The exact GTM + GA4 + Google Ads architecture I rebuild every Shopify account around. ## What's next If you run a $1-10M home, furniture, or decor brand on Shopify and the dashboard ROAS does not match what the P&L says, this is the diagnostic I run first. The full audit, the conversion-value rebuild, and the Smart Bidding rebalance live inside the program here: **[connercrowe.com/for-home-brands](https://connercrowe.com/for-home-brands/)**. ## Why I Run Six Performance Max Campaigns Instead of One URL: https://connercrowe.com/blog/why-i-run-six-performance-max-campaigns-instead-of-one/ Published: 2026-05-17 | Updated: 2026-05-18 One Performance Max campaign is the default. The geo and value-band matrix I run instead on a mixed-catalog account with a hyperlocal pocket. ## Quick Take The default Performance Max setup is one campaign that absorbs the whole catalog. Google's interface defaults to it. Most agencies build it that way. For an account under $20K a month with one geography and one price band, the default is fine. For an account doing $50K a month or more across a mixed catalog with a hyperlocal pocket and a high-AOV tier, it isn't. The fix is a geo × value-band matrix. Two geography splits crossed with three product tiers. Six campaigns, each with its own budget, creative, audience seeds, and search themes. The signal stays clean. Smart Bidding optimizes against the right buyer in each tier instead of averaging across all of them. Here's how the matrix is structured and why each split exists. ## Why one Performance Max campaign quietly underperforms at scale Performance Max is a budget allocator wearing the trench coat of a campaign. It takes whatever budget you give it and decides which placements, audiences, products, and creative combinations get served. The optimization is opaque on purpose. That works when the inputs are homogeneous. One geography, one price band, one buyer archetype. The Smart Bidding model picks a CPA target, learns what converts, and gets better over six to ten weeks. It breaks when the inputs are heterogeneous. A $89 baby blanket and a $1,200 stroller travel through different research cycles, different competitive sets, different buying contexts. If both sit in the same campaign with the same tCPA, the model averages the signal. The blanket steals impressions from the stroller (cheaper clicks, faster conversions) while the stroller's true buyer journey gets undertrained. The dashboard still looks fine. The blended ROAS averages out. The next-90-days conversion model has no idea what to do with the high-AOV tier anymore. ## The two splits that matter The matrix I run has two dimensions. Both came from watching the same failure modes across accounts. **Split 1: Geography.** Most brands have one geography that punches above its weight. A flagship store, a regional concentration of word-of-mouth, a press hit in a specific market. If 30% of revenue comes from one state and the rest comes from the other 49, the buyer in that state has different intent (often store-visit-adjacent) and different competitive context (often less crowded). The bidding economy in that state is also distinct: less impression-share pressure, smaller pool, more responsive to creative variation. If you let national Performance Max bid on that state, you pay national CPCs to acquire local-intent buyers. You also fail to push the hyperlocal angle (local stock, ready to ship from the local warehouse, store pickup) that wins those impressions cheaply. The fix: isolate the high-density geography into its own campaign set. National Performance Max targets everywhere else. Local Performance Max targets that state. Different creative. Different budgets. Different bidding behavior. **Split 2: Value band.** A mixed catalog has at least three signal classes: | Tier | What it is | Why it gets its own campaign | |---|---|---| | Mid ($75-$500) | Accessories, smaller goods, gift-tier | Highest velocity, fastest learning loops, biggest pool of branded long-tail to capture | | Premium ($500+) | Furniture pieces, gear, big-ticket | Longer consideration window, different competitive set, needs distinct creative tone | | Bundles (multi-item, often $1K+) | Nursery sets, room-complete packages | The highest-AOV buyer cohort. Slower to convert, much higher LTV. Smart Bidding can only learn this if the signal isn't drowned out | If you put all three in one campaign with a unified tCPA, the model starves the bundle tier. The bundle tier needs a higher tCPA (because the AOV justifies it) and a slower learning expectation (because the conversion cadence is weeks, not days). One campaign with one target cannot serve all three. ## The 2 × 3 matrix in production Cross the two splits and you get six campaigns: | Campaign | Geography | Value Band | Why it exists | |---|---|---|---| | 1 | US National | $75-$500 | The volume engine. Fast learning, branded long-tail capture, the campaign that funds the others' learning periods. | | 2 | US National | $500+ | Premium goods to the national audience. Longer learning, higher tCPA, creative tone pitched to considered purchase. | | 3 | US National | Bundles | The high-LTV layer. Targets the cohort that buys a complete nursery or a complete room. Slow burn, big payoff. | | 4 | Hyperlocal (1 state) | $75-$500 | Local-intent mid-tier. Often the cheapest CPAs in the account because hyperlocal creative wins against national big-box. | | 5 | Hyperlocal | $500+ | Premium to local. Often store-visit-driving or pickup-adjacent. Creative emphasizes local availability and staff who know the product. | | 6 | Hyperlocal | Bundles | Smallest budget but often the highest blended ROAS, because local bundle buyers know the brand and the brick-and-mortar trust signal closes them. | Budget allocation runs roughly 65% national, 35% hyperlocal. Within each geography, the mid-tier carries 55-60% of the spend, premium gets 25-30%, bundles take the remaining 15%. Adjust by margin profile. ## What feeds the matrix Splitting Performance Max into six campaigns is useless if the inputs underneath are weak. The matrix depends on three pieces working in parallel. **Customer Match segments.** I seed each campaign with the customer-match audiences that match its tier. Past purchasers of mid-tier goods seed the national mid-tier campaign. Past bundle purchasers seed the bundles campaigns. Repeat-purchaser cohorts seed the premium tiers. The point isn't to target those audiences directly (Performance Max decides that). The point is to give Smart Bidding a high-quality "this is what good looks like" reference for each campaign. A mature account in this structure ends up with 20-30 segments stitched into the matrix. **Search themes, per campaign.** Each Performance Max campaign supports up to 50 search themes. Six campaigns means 300 search themes total. They should not be copy-paste across campaigns. The mid-tier national campaign gets themes around the queries actual mid-tier buyers run. The bundles campaigns get themes around "nursery set", "complete bedroom", "room package" intent. The hyperlocal campaigns get themes that include the state name plus product category. The 300 search themes become the steering wheel that keeps each campaign aligned to its tier. **A clean product feed with custom labels.** Each campaign's asset group filters the product feed by custom label. `tier_mid`, `tier_premium`, `tier_bundle`. Without these labels you cannot cleanly assign products to the right campaign and the matrix collapses. This is feed work. It happens once at the Shopify layer and pays for years. ## What you need working before you build the matrix Don't build six Performance Max campaigns onto a broken foundation. The matrix needs: 1. **Server-side tracking that doesn't drop conversions.** If sGTM is misfiring on Shopify checkout extensibility, the matrix amplifies the dropout. Six campaigns all undertrained instead of one. 2. **Conversion value that excludes shipping and tax.** Smart Bidding optimizes against the signal. If the signal includes $40 of shipping per order, the model chases high-shipping orders. Audit Goals → Conversions → Purchase value before you split. 3. **Brand isolation.** A dedicated branded search campaign with brand-as-exclusion on every Performance Max campaign. Otherwise the mid-tier national campaign eats branded long-tail and looks better than it is. 4. **A real product feed with GTINs, custom labels, and titles that match buyer queries.** I've written about [why Performance Max gets credit for Shopping conversions](/blog/why-performance-max-gets-credit-for-shopping-conversions/). The same logic applies, more so, at this scale. The [Tracking Stack reference](/frameworks/tracking-stack/) covers the foundation layer in detail. If those eight layers aren't in place, the matrix will look great on the build day and underperform by week six. The [STACK Audit](/blog/google-ads-tracking-audit-guide/) is the five-pass walkthrough I run before any campaign architecture change at this scale. The first failure mode is almost always at the [conversion-value layer](/blog/roas-inflated-by-shipping-and-discounts/): shipping and discounts baked into the number Smart Bidding is chasing. ## How to test the matrix on your account If you run one Performance Max campaign now and want to know whether the matrix is the right next move: 1. Pull the last 90 days. Segment by product. Look at the AOV distribution. If 60% or more of revenue comes from one tier and the rest splits across two more, the matrix will help. If your AOV is unimodal, it won't. 2. Look at geography. If one state, metro, or DMA accounts for 25% or more of your revenue, the geo split will help. 3. Look at your customer list. If you can build distinct customer-match segments by AOV tier (a "past purchaser of $500+" list with at least 1,000 members), Smart Bidding has something to learn from. Without enough audience density, the matrix is theoretical. 4. If all three boxes check, build in this order: feed plus custom labels first, then the matrix structure, then customer match seeding, then search themes per campaign. Two weeks of build. Eight to ten weeks of relearning. Don't measure performance against the prior campaign until week six. ## How this lands in the board deck A six-campaign matrix only earns the budget conversation if it produces a number the board can act on. The [board-deck quartet](/blog/board-deck-paid-acquisition-numbers/) is the format: contribution-margin ROAS, new-customer CAC, incrementality lift, payback weeks. The matrix shows up in slide two as "the strategic decision the board needs to make this quarter." Pair the architecture move with a [21-day geo holdout](/blog/21-day-geo-holdout-incrementality-test/) at the back end of week eight so the incrementality number lands in the next quarterly update. ## Keep going If this hit, the next two pieces in the same universe: - **[Why Performance Max Gets Credit for Shopping Conversions](/blog/why-performance-max-gets-credit-for-shopping-conversions/)**. The attribution misread that kills Shopping budgets prematurely. - **[The STACK Audit: the 5-layer pass I run before I touch a single bid](/blog/google-ads-tracking-audit-guide/)**. The audit that catches the foundation problems before they amplify across a six-campaign matrix. Free PDF: **[The Tracking Stack](/frameworks/tracking-stack/)**. Eight layers, no email gate. The foundation under every campaign architecture I run. If your account is past the point where one Performance Max campaign can carry it and you're not sure what the next architecture should look like, [that's the conversation](/contact/). ## I Kept the Blog Every Senior Operator Quit URL: https://connercrowe.com/blog/why-im-still-writing-this-blog-in-2026/ Published: 2026-05-17 | Updated: 2026-05-26 The senior-operator blog playbook collapsed in 2025. Plofker, Faris, Holiday, Aslam, Bandholz all pivoted off written essays. Here is why I am staying. ## Quick Take Most of the senior operators I used to compare myself against quit blogging in 2025. Cody Plofker shut down his solo Beehiiv newsletter and consolidated into a multi-byline brand at operatorscontent.com. Andrew Faris's site no longer has a blog at all. Taylor Holiday sold Common Thread Collective to private equity in July 2025 and Taylor Reacts hasn't shipped consistently since. Kasim Aslam exited Solutions 8 and pivoted to talent-marketplace work. Eric Bandholz moved his founder column off the Beardbrand site to Practical Ecommerce. The category I write inside emptied out in eighteen months. I'm staying. Here is the math on why, and what that means for the founders who land on this site looking for a senior consultant who actually writes. ## The receipt I track six senior paid-media operators as my benchmark cohort. As of May 2026: - **Cody Plofker.** The solo Beehiiv newsletter at `codys-newsletter.beehiiv.com` last published March 2022. `codyplofker.com` returns 404. He fully consolidated his writing into [operatorscontent.com](https://operatorscontent.com), which now runs at issue 106 with rotating bylines from Sean Frank, Matt Bertulli, Mike Beckham, Jason Panzer, and Connor Rolain. The solo voice is gone; the brand is now a curated collective. - **Andrew Faris.** [ajfgrowth.com](https://ajfgrowth.com) has no blog. 251 podcast episodes, 3-4 LinkedIn essays a week, no long-form site content. AJF Growth is currently at capacity for consulting clients, which is the actual moat. The podcast is the lead-gen, not the writing. - **Taylor Holiday.** Common Thread Collective sold to PE in July 2025. Taylor Reacts on commonthreadco.com shows visible posts through August 2025 and then a gap. The format he invented (reactive video commentary) requires a production team and a release schedule that doesn't survive an acquisition. - **Kasim Aslam.** Sold his stake in Solutions 8 in a reported eight-figure exit. [kasimaslam.com](https://kasimaslam.com) has pivoted to "CEO of Pareto Talent | 3X Freedom Founder." The Solutions 8 blog itself is still up but runs as an SEO machine with no visible bylines or dates. It reads like agency content marketing, not founder writing. - **Eric Bandholz.** Moved his founder POV column to [Practical Ecommerce](https://practicalecommerce.com) (five guest pieces in 2025-2026). The Beardbrand blog now publishes grooming SEO content. He still ships the founder voice; he just stopped doing it on his own real estate. - **Frederick Vallaeys / Optmyzr.** Shipped Sidekick, a PPC AI agent. Aaron Young's Define Digital shipped "AI Aaron." The play has shifted from "publish to build authority" to "ship a product the buyer interacts with." That is the entire shape of the category I write into. Five of six named operators have moved away from the founder-written long-form essay format in the last eighteen months. The sixth (Vallaeys) is building product instead of writing. I'm staying with the format. Here is why. ## Why most of them quit The senior-operator blog playbook stopped paying off for three concrete reasons: **1. The ROI of written essays collapsed for operators with an audience already large enough to sustain a podcast or video channel.** A weekly podcast episode reaches an audience that does not read blogs, and the production cost is lower per minute of attention than the same operator's writing cost per word. For Faris, Holiday, Plofker, operators with established names, the marginal hour is better spent recording than writing. **2. The agency-acquisition exits closed the chapter.** Plofker is now CMO at Jones Road and writing for the multi-byline brand. Holiday is post-exit. Aslam is post-exit. The personal-brand blog as a tool to scale a one-person consultancy is irrelevant once the consultancy is sold or absorbed. **3. AI-generated content flooded the SEO surface.** Posts that used to rank for "Google Ads PMax audit" now compete against fifty AI-written posts on the same query. The recent research I've read puts AI content roughly 23-41% lower in average ranking than human-written content, but the volume of AI content is so high that the senior-operator post is buried in noise even when it ranks. For an operator with a podcast or course alternative, the rational move is to abandon the SERP and own the listener instead. None of those three reasons applies to me. ## Why I'm staying I am a one-person consultancy. Not pre-exit, not post-exit, no plans to either. The blog is the spine of the business for the exact reasons it stopped being the spine for the others: **I cannot record fifty podcast episodes a year and also do the actual client work.** Faris can run AJF Growth and the podcast because he has a team. I do not. A weekly podcast burns the calendar that should be on client accounts. A weekly blog post does not, because dictating an outline takes thirty minutes and the polish runs in parallel with the client work itself. **The founders I want to work with read.** Maya (the $3-8M Shopify founder watching blended ROAS slip) reads blog posts on her phone at 9pm after the kids are down. Rachel (the service-business owner trying to figure out why qualified leads stopped coming in) reads them on the commute. Daniel (the $10-25M CMO prepping a board pitch) reads to sharpen his read before the meeting. The buyer I sell to is a reader. The buyer who consumes my work in a podcast is, statistically, somebody else's buyer. **The blog is the audit-bench reference architecture.** [The Tracking Stack](/frameworks/tracking-stack/) is an eight-layer framework. [The STACK Audit](/blog/google-ads-tracking-audit-guide/) is the five-pass methodology that verifies it. Both work because they are scannable, searchable, linkable artifacts a buyer can return to or send to a developer. A podcast cannot do that work. A YouTube video cannot do that work. The artifact has to be written. **The AI-flood is a moat the other way.** When the SERP fills up with AI-written posts that read identically, the human-written operator post becomes the rare signal. I run a [voice-audit checklist](/blog/spotting-ai-in-your-own-writing/) on every piece before it ships so the AI tells stay out. The result is that the posts read like one person actually wrote them, which is now the differentiation, not the table stakes. ## What this means for the buyer reading me If you landed on this site looking for a senior paid-media consultant, the field is smaller than you think. Most of the named operators in the category are either at capacity, post-exit, behind a podcast paywall, or running an agency you would have to filter through a layer of account managers to reach. The senior-solo lane has emptied out in the last eighteen months. The operators still in it tend not to write, which makes them harder to evaluate before a call. What you can do here that you cannot do with the others: - Read the [archive](/blog/) on conversion tracking, attribution, and the diagnostic patterns I actually run. Decide if my read on a problem matches yours. - Read [the meta-case-study](/results/rebuilding-my-site-with-claude/) on how this site was built so you know how I work, not just what I work on. - Download [the Setup Audit PDF](/freebies/google-ads-setup-audit.pdf). No email gate. The page-23 ask is the only CTA. Read 25 pages of my actual diagnostic shape and decide if the calendar matters. - If you want a senior consultant who is also the keyboard, [book a call](/contact/). Same person on the call as on the keyboard. No account manager between us. You do not get that on a podcast feed. You do not get it on a multi-byline newsletter. You get it on a blog written by the person you would hire. ## What I'm changing in 2026 The posts you see today are not the final form. Three concrete changes shipping over the next ninety days: **Monthly cadence, not weekly.** Weekly is the rhythm Plofker and Faris ran when they had teams. For a one-person operation, monthly long-form (one substantial diagnostic post a month, 1,200-1,800 words) plus four LinkedIn POVs derived from it is the cadence that survives client load. The blog gets fewer posts but each one is sharper. **Named frameworks, not generic explainers.** [The Tracking Stack](/frameworks/tracking-stack/) is the architecture. [The STACK Audit](/blog/google-ads-tracking-audit-guide/) is the audit methodology. [The Operator Method](/process/) is the engagement shape. Future posts get tied to one of these named artifacts so the buyer who reads three posts in a row leaves with a working mental model, not three unrelated tips. **Operator Teardowns as a recurring series.** Quarterly account reviews, public, permission-granted. The structure peers like Faris use on podcast, only written, scannable, linkable. The first one ships when the first client account clears the permission gate. ## The receipts The blog is now eighteen-plus posts deep across the tracking, lead-quality, margin, and anti-agency pillars. Most of them score gold-standard on the headline rubric I audit against, and the cohort cross-links so a buyer reading one post lands on the next two in the same universe instead of dead-ending. The blog has driven roughly 60% of the inbound that turned into actual paid engagements in the last six months. I rebuilt the site itself in 24 hours using [the workflow documented here](/blog/wispr-flow-claude-the-input-bandwidth-problem/) so the writing surface scales with the way I actually work. The infrastructure compounds. The cadence is sustainable. The buyer who lands here knows what they are getting before they call. That is the case for staying with the format when the rest of the cohort has moved on. ## Keep going If this hit, the next two pieces in the same universe: - **[The STACK Audit: the 5-layer pass I run before I touch a single bid](/blog/google-ads-tracking-audit-guide/)**. The named diagnostic this blog is built around. - **[I switched a law firm off Max Clicks last quarter](/blog/why-conversions-win-over-clicks/)**. The shape every diagnostic post on the site tries to hit. Free PDF: **[The 25-page Google Ads Setup Audit](/freebies/google-ads-setup-audit.pdf)**. The audit walkthrough behind every post in the tracking pillar. If you want a senior paid-media consultant who still writes, that is the [audit call](/contact/). ## The Bing pixel that said YOUR_VALUE_HERE URL: https://connercrowe.com/blog/bing-pixel-your-value-here/ Published: 2026-05-16 | Updated: 2026-05-17 One afternoon in an inherited Shopify tracking stack: two GA4 properties, four duplicate scripts, and a Bing pixel firing placeholder text since November. ## Quick Take A six-month-old Shopify + Stape Pro stack I audited last week was firing placeholder text at Microsoft Ads for three conversion goals. The literal string `YOUR_VALUE_HERE`. Untouched since the snippet was pasted in. That was finding number four. There were seven more, including a Meta CAPI access token sitting in plaintext in GTM version history that anyone with read access could lift. None of it was on fire. The store was making money. PMax was running. Dashboards looked tidy. This is what an inherited tracking stack looks like after six months of drift. Here is the full punch list, and the structural reason agencies miss it. ## The store had been running this stack for six months I gave myself one afternoon to audit a six-month-old Shopify tracking stack. The store was paying an agency. They were paying for Stape Pro. They were running real PMax spend across Google, Meta, and Bing. From a distance the setup looked clean. The first thing I found, forty seconds in, was a Meta Conversions API access token hardcoded in plaintext inside a GTM tag from 2024. Still the live token. Still powering every server-side Meta purchase event in production. Sitting in version history that anyone with read access to the workspace could scroll back to and copy. The fourth thing I found was three Microsoft Ads conversion tags with the literal string `YOUR_VALUE_HERE` in the conversion-action ID fields. For six months, every conversion the store had sent to Bing carried placeholder text from the snippet documentation. Untouched. All firing. All wrong. The PMax was running. The campaigns were "optimizing." Whatever Bing thought the brand was selling, it wasn't. This is a Shopify baby and parenting brand. Real revenue, real ad spend. The kind of operation where the tracking layer is supposed to be the boring part. They had inherited the GTM build from a previous agency relationship and had been told everything was in good shape. I gave myself an afternoon to look. Web container, server container, Shopify theme, Stape dashboard, GA4, Events Manager, Microsoft Ads. The pass any senior operator should do on a stack they did not personally build. Here is what was in there, in order of how angry it made me. ## Two GA4 properties were receiving production data The real one, the one the marketing team was reporting on, and a phantom property called `G-23179768` that nobody on the team recognized. Both collecting pageviews. Both collecting purchases. The real property was undercounting because every event was being split. The phantom was a black hole nobody was looking at. I asked who set it up. Nobody knew. It had been collecting events for months. The fix was in a place you would not find unless you went looking. Shopify admin → Sales channels → Google & YouTube → Settings → Data sharing and tag management → Additional conversion measurement settings → Google tags. Six menus deep. The phantom GA4 was bound there as a "manually added" tag with a trash-can icon next to it. Click trash. Save. Phantom property stops getting fed. ## The Custom Loader was paid for and idle Stape Pro tier with a Custom Loader subdomain configured at `load.gtm.[brand].com`. DNS pointed at the right place. SSL valid. Hitting the URL directly returned a 200 with a real `gtm.js` payload. The custom loader had been live for ten days. Stape Analytics showed 0% adblock recovery over those ten days. The reason was simple. `theme.liquid` was still loading the container from `www.googletagmanager.com` directly. uBlock Origin and the standard blocklists caught it on every visit and that was the end of GTM for anyone with an adblocker. The entire reason to pay for Stape Pro is so the loader script comes from your own domain and adblockers stop blocking it. The store was paying for the upgrade and not using it. The fix is a find-and-replace, but in more places than you would expect. `theme.liquid` has the GTM bootstrap snippet's `j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;` line plus the `