Skip to content

Pre-Deploy Checklist

Run through this before every first deploy of a new client site.


  • site: in astro.config.mjs set to production domain
  • robots.txt sitemap URL matches site: (no www mismatch)
  • wrangler.toml has correct name and pages_build_output_dir = "dist"
  • _redirects has https://www.<domain>/* https://<domain>/:splat 301
  • Sitemap filter excludes noindex pages (/checkout, /payment-return, /thank-you) — verify in dist/sitemap-0.xml after build
  • Every page has unique title and description
  • Canonical suppressed on noindex pages (checkout, payment-return, thank-you)
  • aggregateRating has 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/
  • 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 build completes without errors
  • Real address, phone, email in schema and contact page
  • Google Maps embed uses real business listing (Share -> Embed -> copy src)
  • sameAs array 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)
  • Repo connected in Cloudflare Pages
  • Build command: npm run build, output dir: dist
  • Both domain.com AND www.domain.com added as custom domains
  • Environment variables set (Cashfree, etc.) if applicable
  • 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
  • content.config.ts uses z.union([z.coerce.date(), z.literal(''), z.null()]).optional() for updatedDate
  • faqs field in content schema: z.array(z.object({ q: z.string(), a: z.string() })).optional()
  • All 4 getCollection("blog", ...) calls include !data.draft && data.pubDate <= now filter
  • .github/workflows/scheduled-build.yml created with daily 9:00 IST cron
  • CF_PAGES_DEPLOY_HOOK Cloudflare deploy hook URL added as GitHub repo secret
  • llms.txt in /public/ with service descriptions, pricing, contact details
  • 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