Two words of copy on a pricing page. Changed the template, uploaded it, republished the page. Design Manager showed the new wording. The API returned 200.
The live page served the old copy for hours, through two full unpublish-and-republish cycles.
This is worth writing down because it is the worst failure mode a deploy can have. Everything reports success. There is no error anywhere. The only way to find out is for a human to look at the page and notice.
x-hs-prerendered: Sun, 30 Aug 2026 03:20:32 GMT
x-hs-cf-cache-status: HIT
x-hs-cfworker-meta: {"resolver":"PreRenderedContentResolver"}
The prerender timestamp was frozen hours in the past and was not moving. HubSpot was serving a prerendered copy of the page and had not regenerated it.
Things that were ruled out one at a time: no stored widgets or layout sections on the page, a single page object pointing at the right template, and cache-busting query strings making no difference at all.
A republish regenerates the prerender only when the page object changed.
A template edit does not touch the page object. HubSpot looks at the page, sees nothing different, and correctly concludes there is nothing to regenerate. The template is new; the page is not.
The part that makes this genuinely hard to spot: changing the publish date does not count. Every republish writes a fresh publish date, so the round trip looks like it should be enough. It is not, and the page object has to be dirtied some other way.
Write a content field to a different value and back, inside the round trip.
PATCH {"state": "DRAFT"}
PATCH {"metaDescription": <current> + " "}
PATCH {"metaDescription": <current>}
PATCH {"state": "PUBLISHED_OR_SCHEDULED", "publishDate": <now>}
The meta description ends where it started. The page object is marked changed, the prerender regenerates, and the new copy serves immediately.
If you deploy HubSpot templates with a script, the script needs this step. Without it, template edits reach Design Manager, report success, and never reach a visitor. Every check you have will pass.
Check the prerender header, not the API response. A 200 on publish tells you HubSpot accepted the request. x-hs-prerendered tells you whether anyone will see the result. They are different questions and only one of them matters.