# Custom landing page release runbook

Use this beside the project-specific `DEPLOY.md`. Replace the examples with the real project, hostnames, routes and tag IDs before review.

## 1. Lock the release contract

- Source commit:
- Vercel project:
- Preview deployment:
- Production hostname:
- Changed routes:
- Protected routes:
- Page revision:
- Meta Pixel:
- GA4 stream:
- Google Ads destination:
- PostHog allowed hosts:
- Previous production deployment:

## 2. Static preflight

- Build succeeds.
- Every changed route exists without relying on a fallback.
- Local images, video posters, fonts and scripts resolve.
- No placeholder, debug copy, invented number, em dash or en dash remains.
- Prices, ratings, reviews, shipping, returns and guarantees match the current store.
- Campaign routes carry page-level and response-header noindex rules.
- Every commerce link has `data-cta`, the right destination and the right placement.

## 3. Preview gate

Create an ordinary Vercel Preview. Do not move the production hostname.

Inspect each changed route at:

- Desktop: about 1440 by 900.
- Tablet: about 1024 by 768.
- Mobile: 390 by 844.
- Any supplied client screenshot width.
- Both sides of every high-risk breakpoint.

Keep a route by viewport by section ledger. Inspect every major section at normal scale, including the header, hero, repeated cards, product finder, proof, offer, FAQ and footer.

Exercise navigation, tabs, selectors, accordions, video, sticky CTA, keyboard focus and reduced motion. Check horizontal overflow, visible broken images and console errors.

## 4. Tracking and handoff gate

- Register the source-brand mapping, exact approved hostname and page catalogue entry in the Hey Sage analytics platform before the first production event.
- Real Meta, Google, GA4 and PostHog tags do not fire on localhost, Preview or review hosts.
- The exact production hostname is present in every required allowed-host rule.
- Page context contains the right client, landing page, template and revision.
- A tagged landing-page URL preserves approved UTMs and click IDs on every Shopify CTA.
- Existing product, variant and destination parameters survive the handoff.
- A product-page handoff is not named AddToCart, checkout or purchase.
- Meta domain verification is complete.
- Conflicting email or chat popups are suppressed on campaign routes.

## 5. Promote and verify

Create a detached Production build with `vercel --prod --skip-domain`. Inspect and smoke-test its real Production settings without moving the campaign hostname. Promote that exact staged Production deployment, record its deployment ID and confirm the branded alias points to it.

On the public hostname:

- Open every changed route directly.
- Confirm HTTPS and intended redirects.
- Recheck the complete mobile and desktop page.
- Recheck the highest-risk interaction.
- Confirm tags fire once and carry the right context.
- Confirm campaign noindex headers and meta tags.
- Repeat the tagged Shopify handoff.
- Complete the controlled order or lead test permitted by the release.
- Verify protected routes and assets remain unchanged.

## 6. Rollback

If a blocking issue appears, restore the recorded known-good deployment and repeat the public hostname, route, tag and handoff checks. Fix the source, create a new Preview and run the release gate again. Never patch an unverified build directly over production.

## 7. Close the loop

- Confirm the first events carry the expected revision and acquisition data.
- Record the commercial control and reporting window.
- Add the next evidence-based hypothesis to the iteration log.
- Fold any durable client ruling or technical gotcha into the current brand notes and shared playbook.
