The launch-day operations playbook for the ScamCheck growth engine: exact env vars, validated config assumptions, static-first deployment order, Vercel/Firebase/GSC checklists, rollback steps, launch validation commands, a first-week operational playbook, the first 30-page publishing schedule, backlink outreach targets, first-week SEO/GEO monitoring, and Day 1/3/7/30 checklists.
Operational playbook for launch day + week one. Builds on the Phase 25 runbook; this adds exact config validation, validation commands, the 30-page schedule, outreach targets, and Day 1/3/7/30 checklists. No new architecture — operations only. Steps marked [you] run on your accounts.
Minimum for a static-first launch (pages/OG/widgets/sitemap):
| Var | Required | Purpose |
|---|---|---|
NEXT_PUBLIC_SITE_URL | Yes | Canonical + sitemap + schema origin. The one must-set var. |
Add for live AI (defer until after static-first is verified):
| Var | Purpose |
|---|---|
VERTEX_PROJECT_ID (or FIREBASE_PROJECT_ID) | Vertex AI project |
GOOGLE_SERVICE_ACCOUNT_JSON (or VERTEX_ACCESS_TOKEN) | Vertex auth (roles/aiplatform.user) |
DAILY_BUDGET_USD (start at 1) · DEEP_TIER=flash | cost guard |
Add for persistence (ingestion / dashboards / trending):
| Var | Purpose |
|---|---|
FIREBASE_PROJECT_ID + FIREBASE_API_KEY (or FIREBASE_ACCESS_TOKEN) | Firestore |
Add for admin + automation:
| Var | Purpose |
|---|---|
ADMIN_API_TOKEN | gates admin APIs + dashboards |
CRON_SECRET | authenticates Vercel cron calls |
Optional: NEXT_PUBLIC_SCAM_BASE_URL, NEXT_PUBLIC_SCAMCHECK_APP_URL, NEXT_PUBLIC_GA_ID/NEXT_PUBLIC_PLAUSIBLE_DOMAIN, NEXT_PUBLIC_ADSENSE_CLIENT + slots, NEXT_PUBLIC_PAID_FLAG_KEY, AUTOPILOT_PER_RUN, BUNDLES_PER_DAY, PUBLISH_PER_HOUR, QUALITY_THRESHOLD. Full template in .env.example. No secrets are committed.
lib/seo/programmatic.ts and app/sitemap.ts resolve the origin identically: NEXT_PUBLIC_SCAM_BASE_URL → NEXT_PUBLIC_SITE_URL → lab fallback. They cannot diverge if env is set consistently.NEXT_PUBLIC_SITE_URL to the exact origin where pages are served (scheme + host, no trailing slash).NEXT_PUBLIC_SCAM_BASE_URL: leave unset if serving scam pages on the same origin as the site. Set it only if scam pages live on a different origin (e.g. https://scamcheck.asquaresolution.com) AND that origin actually serves this app (DNS/proxy). If set but not served there → canonical points to a dead URL. Most launches: leave unset.NEXT_PUBLIC_SCAMCHECK_APP_URL: the checker the homepage "Check a message" box routes to (default https://scamcheck.asquaresolution.com), as ?q=MESSAGE&t=TYPE. Confirm the checker app reads q (rename if its param differs).NEXT_PUBLIC_SITE_URL set (AI/Firebase unset → mock/memory, zero cost/risk).FIREBASE_* → ingestion/dashboards/trending persistence.DAILY_BUDGET_USD=1, DEEP_TIER=flash, AUTOPILOT_PER_RUN=1; watch one full day.CRON_SECRET; enable after a clean cost day; raise caps gradually.NEXT_PUBLIC_ADSENSE_* last, after CWV confirmed live.NEXT_PUBLIC_SITE_URL (Production scope).NEXT_PUBLIC_SITE_URL.vercel.json.roles/aiplatform.user (Vertex) + Firestore access; enable Vertex AI API.FIREBASE_PROJECT_ID=… npm run setup:firestore → composite + vector indexes + TTL policies; wait for build.NEXT_PUBLIC_SITE_URL origin./sitemap.xml./scams, /scams/type/upi-fraud, /otp-fraud, /kyc-fraud, /phishing, /investment-fraud.git revert the merge (themed commits revert cleanly).vercel.json + redeploy, or DAILY_BUDGET_USD=0.Run against your live origin (replace SITE):
SITE=https://your-domain
curl -s -o /dev/null -w "sitemap %{http_code}\n" $SITE/sitemap.xml
curl -s $SITE/robots.txt | grep -E "Allow|Disallow|Sitemap" # expect Allow /api/og, Disallow /api/,/ops
curl -s $SITE/sitemap.xml | grep -c "<loc>" # expect ~730
curl -s -o /dev/null -w "OG %{http_code} %{content_type}\n" "$SITE/api/og?template=scam&title=UPI+Fraud&sev=high"
curl -s $SITE/scams/type/upi-fraud | grep -o '"@type":"FAQPage"' # schema present
curl -s $SITE/scams/type/upi-fraud | grep -o 'rel="canonical" href="[^"]*"' # canonical = SITE origin
curl -s -o /dev/null -w "widget.js %{http_code}\n" $SITE/widget.js
/ + a scam page → confirm CLS ≈ 0, good LCP.| Metric | Where | Healthy |
|---|---|---|
| AI cost today | /ops/analytics | under DAILY_BUDGET_USD |
| Vertex quota | /ops/analytics | under 85% |
| Queue failure / DLQ | /ops/analytics | failure under 5 percent, DLQ 0 |
| Indexing coverage | GSC | rising; not stuck "Discovered – not indexed" |
| Discover impressions | GSC → Discover | first impressions by week 2–3 |
| Rich results | GSC → Enhancements | no FAQ/Article errors |
| CWV | GSC/PSI | CLS good, LCP good |
| Function errors | Vercel logs | no spikes/timeouts |
First 30 pages (already prerendered; prioritise for indexing + promotion):
First Hindi targets (10): the 10 tier-1/2 type pages (already bilingual + Hindi OG) — promote the Hindi share text via the alert-formats API.
First Shorts topics (5): UPI refund-PIN trick · OTP "bank security" call · KYC freeze SMS · fake-job registration fee · Telegram investment "task" scam.
First LinkedIn authority topics (3): "Why UPI refund requests are a scam" · "The KYC-freeze SMS pattern" · "Investment groups that block withdrawals."
First X/Twitter alert threads (5): one per tier-1 type (snippets from /api/scam-intel/alert-formats?type=<id>).
Full ready-to-post copy is in launch-content-pack; per-channel snippets at
/api/scam-intel/alert-formats.
/api/og)./api/scam-intel/growth?view=entities — fastest-growing categories/platforms/regions.NEXT_PUBLIC_SITE_URL./ + one scam page./ops/analytics: cost under cap, DLQ 0, quota under 85%.AUTOPILOT_PER_RUN/BUNDLES_PER_DAY slightly if clean./api/scam-intel/growth.NEXT_PUBLIC_SITE_URL).NEXT_PUBLIC_SITE_URL = real serving origin.