Pre-Deploy Checklist
Run through this before every first deploy of a new client site.
Config
Section titled “Config”-
site:inastro.config.mjsset to production domain -
robots.txtsitemap URL matchessite:(no www mismatch) -
wrangler.tomlhas correctnameandpages_build_output_dir = "dist" -
_redirectshashttps://www.<domain>/* https://<domain>/:splat 301 - Sitemap filter excludes noindex pages (
/checkout,/payment-return,/thank-you) — verify indist/sitemap-0.xmlafter build
SEO & meta
Section titled “SEO & meta”- Every page has unique
titleanddescription - Canonical suppressed on noindex pages (checkout, payment-return, thank-you)
-
aggregateRatinghas real client numbers - or block removed - Schema validated at search.google.com/test/rich-results
- OG image exists at
/public/og-image.jpg(1200x630, under 300KB) - Favicon PNG links only added if PNG files exist in
/public/
Code quality
Section titled “Code quality”- All icon-only links have
<span class="sr-only">text - No “Learn more” anchor text without sr-only context
- No footer links pointing to removed anchors or pages
- No duplicate H2 text across pages
-
npm run buildcompletes without errors
Content
Section titled “Content”- Real address, phone, email in schema and contact page
- Google Maps embed uses real business listing (Share -> Embed -> copy src)
-
sameAsarray has correct social URLs - All placeholder copy replaced with real client content
- Web3Forms access key set in contact form
- Testimonials are real (or section removed)
Cloudflare Pages
Section titled “Cloudflare Pages”- Repo connected in Cloudflare Pages
- Build command:
npm run build, output dir:dist - Both
domain.comANDwww.domain.comadded as custom domains - Environment variables set (Cashfree, etc.) if applicable
Analytics & payments
Section titled “Analytics & payments”- GA4 Measurement ID set and snippet uncommented in Layout.astro
- Privacy Policy mentions Google Analytics
- Cashfree env vars set in Cloudflare Pages dashboard
- Cashfree payment flow tested end-to-end in sandbox before switching to production
Blog & scheduling (if blog exists)
Section titled “Blog & scheduling (if blog exists)”-
content.config.tsusesz.union([z.coerce.date(), z.literal(''), z.null()]).optional()forupdatedDate -
faqsfield in content schema:z.array(z.object({ q: z.string(), a: z.string() })).optional() - All 4
getCollection("blog", ...)calls include!data.draft && data.pubDate <= nowfilter -
.github/workflows/scheduled-build.ymlcreated with daily 9:00 IST cron -
CF_PAGES_DEPLOY_HOOKCloudflare deploy hook URL added as GitHub repo secret -
llms.txtin/public/with service descriptions, pricing, contact details
Post-deploy
Section titled “Post-deploy”- Visit
https://domain.com- loads correctly - Visit
https://www.domain.com- 301 redirects to apex domain - Visit
/robots.txt- shows AI bot allow rules + Disallow rules + correct sitemap URL - Visit
/llms.txt- loads and describes the business - Visit
/sitemap-index.xml- lists pages - Run
npm run indexnow- submit URLs to Bing/Yandex - Submit sitemap in Google Search Console
- Submit sitemap in Bing Webmaster Tools (feeds Perplexity and ChatGPT)
- Test OG image: opengraph.xyz
- Force social preview re-scrape: Facebook debugger