Our application form 404'd after the cutover. The gate was green the whole time.
Peter Benes ·

On August 12 a prospect told us something we should have found ourselves: the application form on kpixies.com finished on a 404 page.
They were right. Every application since the cutover had been redirected to /thank-you, which redirected (308) to /thank-you/, which did not exist.
What was lost, and what was not
No leads were lost. The form posts to Web3Forms, which captures the submission and emails it before the redirect happens. Every application reached us.
What was lost was everything after the submit button. Applicants saw an error page instead of a confirmation, at the moment they had just handed us their business details. And conversion tracking had been blind since the cutover, because the confirmation page is where a completed application gets counted.
Why nothing caught it
The thank-you pages are designed to be unreachable. They are not linked from anywhere, they are not in the sitemap, and robots.txt disallows them. That is correct for a confirmation page. You don’t want Google indexing it or anyone landing on it cold.
The same design meant our prober, which walks the site with ordinary GET requests, never visited them. The property that makes them correct is the property that made them invisible.
Our decision log also said the pages had been “ported” to the new platform. They had not. Someone recorded an intention, and the record treated it as a fact.
The bigger problem: production was behind
While fixing it we found something worse. Work had been committed and pushed on Monday, August 10. It never went live.
Our sites send their build ID in a response header, x-aw-build-id. Live production reported build 35a0077, from August 9 at 10:52. The repository head was 10fdba0, from August 10 at 12:12. Five pushed commits had never reached production. One of them carried the message “Stage 3 CLOSED: gate exits 0 against the deployed preview.”
The gate had passed. The preview was green. None of it was in production, because Cloudflare’s Git integration was not building. During provisioning, that was the one item we had marked “partial” and then moved past.
A passing preview gate tells you the preview is good. It says nothing about what customers are being served.
The fix
We rebuilt both confirmation pages as static pages instead of CMS-backed ones. A conversion page must not be able to 404 because a CMS row is missing. We added a noindex meta tag on top of the robots rule, so the pages stay out of search even if one layer is changed later. And each route now fires its own application_submitted event in GA4, so the two forms can be told apart and a silent one stands out.
The leave-behind
The lasting change is a small script, deploy-drift.mjs. It reads the build ID off the live site with one HEAD request, compares it with the repository head from git rev-parse, and complains if they differ. It costs nothing to run: no AI tokens, no service, no subscription. It would have caught this on August 10, before a prospect did.
A related miss, two days earlier
On August 10 kpixies.com had an outage, and our daily report said “Nothing changed since the last run.” A manual probe run had advanced the baseline without sending a report, so by the time the scheduled run looked, there was no change left for it to report. We traced and fixed that on August 11.
It belongs to the same family. In both cases a report described a state of the world that nobody had checked against the live site.
What we took from it
Three habits came out of this week. Read the build ID off production before saying anything is live. Treat any provisioning item marked “partial” as broken until proven otherwise. And for pages that are hidden on purpose, check them on purpose, because no crawler ever will.
What this means if you hire us
We verify against what your live site serves, not against a green checkmark in a dashboard. Because our builds put their build ID on the wire, “is the fix live?” has a one-request answer. That is what measured, not promised, looks like in practice, and it starts with a free assessment.