Copy commands, open localhost checkout, Stripe test dashboards, logs, and API billing — one page for repeat workflows.
Terminal A. Use http://127.0.0.1:8788, not file://.
cd C:\Python10Proj\kpl-analytics
venv\Scripts\python website\serve_checkout.py
Local: Terminal B stripe listen → paste whsec_… into .env as STRIPE_WEBHOOK_SECRET, restart Terminal A. Prod: Dashboard endpoint on HTTPS URL → different whsec_… on the droplet only.
cd C:\Python10Proj\kpl-analytics
.\scripts\stripe.ps1 listen --forward-to http://127.0.0.1:8788/api/stripe/webhook --events payment_intent.succeeded,invoice.paid
.\scripts\stripe.ps1 login
Test card 4242 4242 4242 4242 · any future expiry · any CVC.
.envRepo root .env = local test. Server gets its own copy after deploy. Webhook secret is per endpoint (listen vs Dashboard URL).
# Local (already in your .env)
STRIPE_CHECKOUT_BASE_URL=http://127.0.0.1:8788
STRIPE_WEBHOOK_SECRET=whsec_… # stripe listen
KPL_FULFILLMENT_EMAIL=0
KPL_FULFILLMENT_TEST_TO=pauldyon@gmail.com
KPL_COOKIE_SECURE=0
KPL_TRUST_PROXY=0
# Droplet /opt/kpl-analytics/.env (after Caddy + systemd)
STRIPE_CHECKOUT_BASE_URL=https://www.kplanalytics.com
STRIPE_WEBHOOK_SECRET=whsec_… # Stripe Dashboard → Add endpoint → signing secret
# pk_test_… / sk_test_… first; pk_live_… / sk_live_… when ready
KPL_COOKIE_SECURE=1
KPL_TRUST_PROXY=1
KPL_WEBSITE_HOST=127.0.0.1
KPL_WEBSITE_PORT=8788
KPL_FULFILLMENT_EMAIL=0
# KPL_FULFILLMENT_TEST_TO=pauldyon@gmail.com # only with sk_test_ on server
# + SERPER, PLACES, PAGESPEED, CLAUDE/XAI, gmail_token under secrets/
Template: .env.example · checklist: docs/PHASE4_PREP_SHEET.md
After checkout: STARTED → PASS in fulfillment ledger.
# tail fulfillment (PowerShell)
Get-Content -Path logs\fulfillment_ledger.jsonl -Tail 8
Separate from Stripe. Spend shows in today's transactions_*.jsonl → run_cost.
cd C:\Python10Proj\kpl-analytics
venv\Scripts\python Main.py
venv\Scripts\python Main.py --fresh
cd C:\Python10Proj\kpl-analytics
venv\Scripts\python scripts\regen_pdf_from_data.py runs\YYYYMMDD_slug\slug_*_data.json
Domain at Namecheap · Basic 2 GB Ubuntu droplet · HTTPS after Caddy + app deploy. Edit Droplet IP / Host in the header.
Primary site: www.kplanalytics.com · A www → droplet IP · email forward hello@kplanalytics.com → Gmail. Later: redirect www.kpl-analytics.com → primary on Caddy.
Status: DNS → droplet ✓ · app + Caddy HTTPS ⬜ · Stripe prod webhook ⬜
# once per PC (creates .ssh if missing)
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.ssh"
ssh-keygen -t ed25519 -C "paul-digitalocean" -f "$env:USERPROFILE\.ssh\id_ed25519_do" -N '""'
notepad "$env:USERPROFILE\.ssh\id_ed25519_do.pub"
ssh -i "$env:USERPROFILE\.ssh\id_ed25519_do" root@167.172.241.47
nslookup www.kplanalytics.com
# on droplet (SSH) — first boot
apt update && apt upgrade -y
apt install -y git python3 python3-venv python3-pip ufw
ufw allow OpenSSH
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable
Stripe webhook (Dashboard): Add endpoint → URL below → events payment_intent.succeeded, invoice.paid → Reveal signing secret → STRIPE_WEBHOOK_SECRET on server · STRIPE_FULFILLMENT_PRODUCTION.md.
https://www.kplanalytics.com/api/stripe/webhook
Google Places, PageSpeed, Serper, Anthropic, Stripe dashboards.
Fulfillment + checkout security tests; set KPL_RATE_LIMIT_DISABLED=1 for burst API tests.
cd C:\Python10Proj\kpl-analytics
venv\Scripts\python -m unittest tests.test_fulfillment_job_config -v
git status -sb
Open from repo (file explorer) or via this server when Terminal A is running.