50by50
Day 12 / 132 ·

Day 12: measurement infrastructure across the portfolio

Week 1 weekly review published. Search Console verified across four properties. Sitemaps shipped for every counted site. Three counted launches now have signal to measure against.

The Week 2 gap, closed

Opened the day by backfilling Days 8-11 in the Hub from cross-repo git timestamps. That work landed first thing: Day 8 honestly thin (no commits anywhere), Day 9 reconstructing the three-repo Tuesday, Day 10 the LocalShoot video + handyman factory build, Day 11 the image-first overhaul + Galveston. Public chain is unbroken.

Week 1 weekly review — published

reviews/2026-20.md shipped (commit e38f490), following playbooks/sop-weekly-review.md. Owed since Day 8.

Headline finding: build outpaces launch-and-measure. Three counted launches end of Week 1 sits exactly on Path C cadence (3/week). But none of them had measurement wired all the way through — GA4 was on but Search Console wasn’t, so the 21-day kill clock from playbooks/kill-or-scale.md had nothing to read. That made the #1 action for the day obvious.

Search Console — four properties verified

The afternoon’s spine.

  • 50by50.dev (Cloudflare OAuth) — covers the four factory subdomains in one verification.
  • localshoot.app — same Cloudflare integration.
  • handscript.app — same Cloudflare integration.
  • trustcore-media.vercel.app — HTML-tag method via the NEXT_PUBLIC_GSC_VERIFICATION env var. The GA-tag method failed because Next’s next/script with afterInteractive injects gtag.js after the document loads — GSC reads that as “tracking code in wrong location.” The env-driven <meta> in the layout is the reliable path on Next App Router and is now the standard for future Next launches.

Sitemaps — eight URLs, all 200

  • All five Astro sites in the factory got @astrojs/[email protected] plus site: set (commit ef19276).
  • LocalShoot got a dynamic sitemap.ts that pulls 141 URLs from Supabase — every approved location plus the static routes — with hourly revalidation. (shot-spot repo.)
  • Handscript got a static 2-URL sitemap (homepage + /template); the rest of Handscript is sign-in-gated, so listing a gated route would just point Google at a redirect.
  • TC Media’s existing sitemap.ts was already serving; today added the verification meta and resubmitted.

Every sitemap got submitted to GSC for its property.

Handyman: redesign in, gate-close deferred

HandyCost’s “Trade Authority” redesign landed (commit f179408) — the visual + structural pass to make it feel less like a generic calc site. The §5 gate-close on it still needs a real GA4 measurement ID, a real affiliate URL, and a real contact email — operator inputs, not engineering.

Austin Handyman got audited against the §5 gate today. It fails on item #5 (the site self-flags PLACEHOLDER DATA — replace before any real launch in its own code) and item #8 (the wizard is a client-side demo with no backend, so there’s no real conversion). The honest move was to deferring the gate-close decision rather than shipping a fake counted launch: either real backend work happens, or the site gets formally deferred and removed from the Phase-1 slate. That call lives on Day 13.

One new operational rule

Yesterday five Cloudflare Pages deploys failed with code 8000111: Invalid commit message. The cause was the em-dash this repo’s commit style favors — Cloudflare’s deploy API rejects non-ASCII commit messages outright. Going forward, Birthday-Challenge commit messages stay ASCII-only. Captured in CHANGELOG.md and on daily/day-012.md.

What changed on the scoreboard

Nothing. Still three counted launches. What changed is that all three now have measurement wired all the way through. The kill clock can actually start running.

Day 12 of 132. 120 days remaining. Three of 25 counted launches.

Tomorrow: collect the HandyCost gate-close inputs and finish item #4. Make the Austin Handyman call. Start LocalShoot beta outreach.


Subscribe

Follow the build

One email a week. Real numbers, real lessons. No hype.

Unsubscribe in one click. No selling, no sharing.