// experience

Work I've done, from my side of the screen.

Not documentation, the actual experience of building something. What I set out to do, the walls I hit, and how I got past them. Client names stay out of it; the engineering doesn't.

Articles

Before and after of a lead attribution pipeline: every lead recorded as Direct, versus leads carrying their real source and campaign into the CRM
Tracking & attribution

Fixing broken lead attribution on a WordPress and HubSpot site

Every enquiry was reaching the CRM as Direct, so paid search could not be measured. One symptom hid five faults. I traced each from the outside in, rebuilt the attribution path, and proved it end to end through the mail log.

Oct 2026~9 min read
read →
Two caching layers: an nginx reverse-proxy cache in front of an Apache and WordPress origin
Performance & infra

Fixing multi-second TTFB on WordPress behind an nginx proxy cache

An audit said the HTML wasn't cached; the real defect was a proxy cache revalidating a slow origin on every hit. I traced it from one clue, a HIT no faster than a MISS, fixed it in .htaccess with no CDN, and named the render floor honestly.

Sep 2026~10 min read
read →
Root-level forwarding to the homepage versus page-to-page 301s via a Cloudflare Worker
Migrations & infra

Fixing a decade-old migration with page-level 301s, and no server

A ten-year-old domain move done with no redirects, so every deep URL 404'd. I rebuilt the old URL inventory from archives and shipped page-level 301s from one Cloudflare Worker, no hosting.

Sep 2026~9 min read
read →
Feed re-architecture, plugin XML to a self-owned Google Sheet as the single controlled source
Paid media & tracking

Getting a restricted store approved on Google, then tracking every sale

One of Google's hardest verticals: from suspension and disapprovals to a fully approved catalog, a self-owned feed, value-based tracking through GTM, and the judgment to hold the launch until it could convert.

Sep 2026~10 min read
read →
A cross-origin booking form iframe blocking the submit event from the page's pixel
Tracking & automation

Recovering form leads from a sealed iframe into Meta

The form was a cross-origin Jobber iframe the browser couldn't see, so I went around it: polling the CRM's GraphQL API and posting hashed Lead events to Meta CAPI from one Cloudflare Worker, after a first build on n8n and Hugging Face had to be scrapped.

Sep 2026~8 min read
read →
Server-side tracking data-flow diagram
Server-side tracking

Moving conversion tracking server-side with Stape

Recovering lost conversion data with server-side GTM and first-party GA4, deduplicating Meta events, and working around cross-origin booking iframes, SSL and free-tier limits.

Sep 2026~7 min read
read →