Series

What broke this week

Most of what I know about marketing systems I learned from something that broke. A promotion that died quietly on four country shops. A tag that disappeared from the page while the dashboard looked fine. A routine that told me a draft was ready when no draft existed.

I write these up the way I'd want to read them: what happened, how I found it, and what I changed so it can't happen the same way again. Client names stay out. The mechanics stay in, because that's the part you can use.

23 post-mortems · newest first · Follow the series (RSS)

  1. A fix applied to the live page is not a fix: locking rebuilt pages against the generator that re-creates the error

    Lesson: Fix the generator, not the page, and lock rebuilt pages against it.

  2. "The draft is ready" is not a status: what an agentic routine owes you when it reports on its own work

    Lesson: An agent must verify the claims it carries in its own state.

  3. A shop platform upgrade took out the ad layer, not the shop: 60 disapproved Google Ads that don't come back when the pages do

    Lesson: Ad disapprovals are stored state. Somebody has to ask for the re-review.

  4. A counted conversion with a made-up value is worse than no tracking: the flat €10 add-to-cart that flattered four markets' CPA

    Lesson: A conversion with a made-up value is worse than no tracking at all.

  5. Price governance in ecommerce: how a promotion died silently on four country shops for a month

    Lesson: Declare a price once and audit the whole chain daily. The price guard itself can be the bug.

  6. The LinkedIn account I deleted came back: why closing an account isn't closing it, and the four steps that are

    Lesson: Closing an account means revoking every sign-in grant behind it.

  7. An expired promotion doesn't expire by itself: the ended sale still on the shop, the promotion asset still serving a 404

    Lesson: A promotion is a set of artefacts, not a date. End every one of them.

  8. I called a keyword set off-product before I opened the client's shop: how to check product–query fit before cutting a Google Ads campaign

    Lesson: Open the client's shop before you call a keyword set off-product.

  9. Nineteen days of ad spend with no measurement: the Google Tag Manager snippet was gone from the page, not broken in the console

    Lesson: When a conversion drops to zero, check the page source before the container, and tell Smart Bidding its data was wrong.

  10. I replaced a monthly client report with a 90-day review — and found two broken comparisons in my own numbers

    Lesson: Compare equal windows, measured with the same ruler as the target.

  11. My scheduled Claude Code routine failed three weeks running: what agentic workflows need that a written lesson doesn't give them

    Lesson: An agent has to know what its environment can do, and every lesson needs an owner.

  12. The channel filter on my dashboard silently broke ROAS: how to attribute ad spend across sales channels

    Lesson: Ad spend lives per advertising channel, revenue per sales channel. Filter both or neither.

  13. I named the cookie the obvious thing. So had the script that was already there.

    Lesson: Namespace what you add, and treat your own change as the first suspect.

  14. The lead went out to a company. It had been struck off the register two years earlier.

    Lesson: Check a directory against the commercial register before it sends anyone a lead.

  15. Forty-six live ads. Not one of them had a page to land on.

    Lesson: Somebody has to own the landing page of every ad.

  16. Our ROAS doubled. We hadn't sold a thing more.

    Lesson: When a ratio jumps, check the denominator and the definition before you celebrate.

  17. I scheduled a weekly check that could never run.

    Lesson: Schedule a check where its tools exist, and let it report "nothing" honestly.

  18. We fixed checkout in production. The generator was still holding the bug.

    Lesson: A fix that never reaches the build engine gets rebuilt away.

  19. Everything returned 200. Four leads still went nowhere.

    Lesson: Silent failures are the expensive ones. Make the systems shout.

  20. My assistant created the same task three days running. The fix has a name: idempotency.

    Lesson: Ask what happens when it runs twice, and make the automation idempotent.

  21. The form promised a copy by email. Nobody was sending it.

    Lesson: Every promise a form makes is a send you have to test end to end.

  22. Yesterday's ad spend kept landing on today. Two bugs were wearing one costume.

    Lesson: Pin the day boundary to one timezone, and never show an estimate as a booked fact.

  23. The AI handed me a number that was wrong in the most convincing way

    Lesson: Plausible wrong data survives longest. Check what a figure actually measures.