AutomateDojo — Changelog
2026-05-30 — Enterprise readiness, night 7 (blocks 58-60)
Lead form abuse detection (block 58)
- lib/lead-abuse.ts scores every dojo-lead submission on 10 heuristics (honeypot, fast submit, link spam, suspicious TLDs, automation user-agents, non-Latin script…).
- Verdict ≥80 = silently dropped; ≥35 = stored as 'review' status, downstream fan-out skipped (no SMS, no outbound webhooks, no CRM push); <35 = normal flow.
- Score + reasons stored in lead.enrichment.abuse for audit.
Weekly digest one-click unsubscribe (block 59)
- RFC 8058 List-Unsubscribe + List-Unsubscribe-Post headers added to weekly client digest emails.
- /api/digest/unsubscribe (GET + POST) sets notification_prefs.weekly_digest = false and logs activity.
Price-lock guarantee (block 60)
- Public /price-lock — 24-month no-raise commitment for customers signed up at any current SKU price.
- Covers SKU recurring + annual + bundled AI tokens. Doesn't cover ad spend, Twilio metered, token top-ups beyond included, newly-added SKUs.
- Acquisition clause: commitment transfers OR full refund of unused prepaid time.
2026-05-30 — Enterprise readiness, night 6 (blocks 55-57)
Subprocessor list (block 55)
- Public /subprocessors lists 8 third-party processors (Vercel, Supabase, Stripe, Resend, Twilio, Anthropic, Google Cloud, Meta) with purpose, data shared, region, compliance posture, and links to privacy/DPA.
- 30-day notice policy for adding new processors.
Cancellation retention flow (block 56, migration 051)
- /client/
/cancel intercepts before Stripe portal. - Reason picker → context-aware retention offers (pause / downgrade / talk to founder / stay / cancel).
- Admin alerted within minutes on all non-retained outcomes.
Outbound webhooks for customer integrations (block 57, migration 052)
- /client/
/integrations/webhooks lets owners add URLs + select events. - HMAC-SHA256 signed deliveries, 10s timeout, auto-disable after 10 consecutive failures.
- Per-delivery audit ledger.
- lead.created event already wired through /api/dojo-lead — first webhook fires the moment your dojo receives a new lead.
2026-05-30 — Enterprise readiness, night 5 (blocks 51-54)
Stripe ↔ DB reconciliation (block 51)
- Nightly cron at 07:00 UTC walks every active dojo_sku with a Stripe subscription, fetches it, and corrects DB drift (status, billing_interval, deleted-in-Stripe). Emails admin summary only when drift > 0.
GDPR / CCPA data subject requests (block 52, migration 048)
- Public /data-request form for export / delete / rectify. Email verification before any action. Admin gets notification email; subject gets receipt.
- /api/gdpr/verify confirms ownership.
Multi-user team access (block 53, migration 049)
- /client/
/team — owners invite teammates (read-only access to all dojo data) or co-owners (full equivalent). - 14-day invite expiry, revocation, status badges. /accept-invite/
binds invite to current user. - canViewClientDojo() now honors team membership.
Promo / discount codes (block 54, migration 050)
- /admin/promo-codes mints Stripe Coupons + Promotion Codes with % or $ off, duration (once / repeating N / forever), max_redemptions, expiration.
- Stripe webhook attributes each redemption to 9dm_promo_redemptions + increments counter.
2026-05-30 — Enterprise readiness, night 4 (blocks 46-50)
RSS for the changelog (block 46)
/changelog.rssfeed (RSS 2.0) auto-built from CHANGELOG.md sections — 15 min cache, 1 hour swr.declared inso feed readers + AI agents auto-discover.- /changelog page gains an RSS chip in the header.
Pricing A/B implementation (block 47)
- pricing_setup_fee_framing experiment resolved server-side via lib/ab.
- Treatment variant adds a "From $98/mo" hook above the bundle grid framing setup fees as right-sized.
- ABView client component fires one view event per session per experiment.
SLA page (block 48)
- /sla with per-surface uptime targets (99.95% leads/sites, 99.9% dashboard + API, 99.5% AI/ad APIs).
- Support response times (critical < 4h, high < 1bd, normal < 3bd).
- Data residency + ownership + encryption + audit-trail commitments.
- SLA credit ladder (10/25/50% with cancel-and-refund at <95%).
- Honest "what this isn't" — no SOC 2 yet, no HIPAA, no 24/7 phone.
Customer success metrics dashboard (block 49)
- /admin/customer-success — Total MRR, ARR, active/onboarding counts, avg MRR.
- Time-to-first-lead (key activation metric).
- Monthly cohorts table with retention % and cohort MRR.
- Active dojo ladder sorted by MRR with 30d leads + NPS color-coded by category.
Public sales playbook (block 50)
- /how-we-sell — transparent 6-section page laying out what we don't do (no 60-min sessions, no annual lock-in) vs what we do (public pricing, live demo, ROI calc).
- Includes "when NOT to sign up" and a 5-question vendor evaluation checklist.
2026-05-30 — Enterprise readiness, night 3 (blocks 39-45)
Status badge
/status/badge.svgreturns a 180×20 shields.io-style badge reflecting latest probe-log overall_status. Customers can embed on their own sites. /status includes copy-paste embed block.
NPS surveys (migration 044)
- Daily cron at 17:00 UTC sends first survey 30 days after each dojo's first lead, then every 90 days.
- Public
/survey/page (noindex) — color-coded 0-10 grid + comment field. - Detractors (0-6) trigger an immediate admin alert email.
/admin/npsshows NPS score, promoters / passives / detractors, response rate, quotes.
Programmatic case studies
/case-studiesindexes testimonials with metric_before/after. Empty-state with onboarding CTA./case-studies/[slug]individual case page with Schema.org Review JSON-LD.
Re-engagement (migration 046)
- Weekly Tuesday cron sends dormant-prospect touches (30/60/90 days) and winback emails (60/120/180 days) with max 3 touches.
- RFC 8058 List-Unsubscribe + one-click POST headers.
- Public opt-out endpoint sets re_engagement_opted_out_at.
Per-dojo audit log CSV export
- GET /api/client/
/activity/export.csv (auth = canViewClientDojo) returns full activity ledger including system events. ?days=N (max 1825). Surfaced as "Export 1-yr CSV ↓" on /client/ /activity.
Customer API tokens (migration 045)
/client/lets owners mint scoped read-only tokens. SHA256-hashed at rest, prefix-displayed./api-tokens - GET /api/v1/leads is the first public REST endpoint — Authorization: Bearer ad_live_…, scope read:leads, ?since pagination.
- Activity-log entries for token mint + revoke.
A/B experiment infrastructure (migration 047)
- 9dm_ab_experiments + assignments + events tables.
- lib/ab.ts with first-party visitor cookie + deterministic bucketing + variantFor() server helper + logAbEvent().
- /admin/ab-experiments dashboard with per-variant funnel metrics.
2026-05-30 — Enterprise readiness, night 2
Testimonials infrastructure
- Migration 040 enriches 9dm_testimonials with metric before/after, per-surface eligibility flags, consent tracking.
component on /pricing + /compare. Renders nothing when no eligible quotes.- /admin/testimonials form gained 18 new fields.
Affiliate program
/affiliatespublic landing — 20% recurring + 10% setup + 12-month tail, math example, anti-spam rules./api/affiliates/applyaccepts applications, emails admin./admin/affiliatestabbed (Affiliates / Applications / Commissions) with one-click approval → email.- Attribution:
?ref=CODEpersisted in sessionStorage; resolved on signup via lib/affiliate-attribution. - Monthly accrual cron at
0 2 1 * *computes per-dojo MRR × commission_pct, honors 12-month tail, idempotent.
Annual upgrade prompt
- Migration 042 adds billing_interval to 9dm_dojo_skus; Stripe webhook writes it from session metadata.
on /client//billing-portal nudges monthly customers — calculates yearly savings. - POST /api/client/
/billing/switch-to-annual updates Stripe subscription items to annual price with proration.
Live demo sandbox
/demo/sandbox— fully populated read-only fake dojo with 6 tabs (Overview, Leads, Ads, Site editor, Reviews, AI assistant). No signup required.- Sticky DEMO MODE banner with /pricing CTA. All action buttons stub-disabled.
Customer onboarding checklist
- 6-item checklist on /client/
computed honestly from DB state (active SKU, logo, domain, tracking ID, AI budget, first lead). - Progress bar, per-item "Do it →" link to right surface. Dismissible per dojo.
Status page incidents + uptime
- Migration 043 adds 9dm_status_incidents + 9dm_status_probes_log.
- /status now shows 90-day uptime bar (per-day color-coded squares), 90-day uptime %, recent incidents list.
- /admin/incidents to post + manage incidents (severity, status, affected components, public/private).
- health-alerts cron writes one probe log row per run.
Deliverability health check
- GET /api/admin/deliverability-status checks RESEND_FROM + Resend domain verification.
on admin home + /admin/settings/email when unhealthy.- health-alerts cron warns when RESEND_FROM is still onboarding@resend.dev or domain isn't verified.
SEO + AI discoverability
- WebSite JSON-LD with SearchAction (Google sitelinks search box).
- Preconnect / dns-prefetch for GA4, GTM, Facebook, Stripe.
- /llms.txt + /ai.txt routes for AI crawler discovery.
2026-05-29 evening — Enterprise readiness + annual billing
New surfaces
- Annual billing — Monthly/annual toggle on [/pricing](/pricing). 17% discount (≈2 months free) on prepaid annual. Threads end-to-end through /get-started → pitch → Stripe checkout.
- [/roi-calculator](/roi-calculator) — Plug in your numbers, get payback period + 12-month ROI across bundles + DIY + agency.
- [/compare](/compare) — 18-row honest comparison of AutomateDojo vs DIY (Squarespace) vs local agency.
- [/security](/security) — Trust + compliance position. Includes the HONEST "what we don't do yet" (2FA, SAML, HIPAA, SOC 2).
- [/refund-policy](/refund-policy) — Explicit money-back terms.
- [/franchises](/franchises) — Multi-location sales surface with volume discounts (10% at 2-4 locations, 20% at 5-9).
- [/api-docs](/api-docs) — Public API + webhook reference.
- [/roadmap](/roadmap) — 26-item public roadmap.
- [/demo](/demo) — Book a 15-minute walkthrough.
- [/help](/help) — 12 self-serve articles.
Pricing rework
- Website Only setup: $1,700 → $348 (5× drop). Ratio 17× monthly → 3.5×.
- Ads Managed: $299 → $399/mo (reflects real labor).
- Full Bundle (was Soup To Nuts): $973/mo + $3,150 setup → $1,173/mo + $1,743 setup.
- All 21 SKUs re-synced to live Stripe.
Customer success
- 30-day welcome drip — 5-touch email sequence (day 1, 3, 7, 14, 30). Idempotent.
- Notification preferences at [/client/
/notifications](/client) — email/SMS/digest/quiet hours/CC emails. - Per-lead email to dojo owner with honors for prefs.
- Welcome tour refresh with the new AI surfaces.
Production-safety
- Webhook idempotency — Stripe retries can't double-activate SKUs.
- Health-alert cron — hourly probe of /api/status, Claude error rate, webhook backlog. Emails admin with 4-hour dedupe.
- Cron heartbeats — all 4 new crons emit activity rows for /admin/cron-health visibility.
- Stripe checkout rate-limited (20 / IP / hour).
SEO + sales enablement
- Schema.org Product markup on /pricing with AggregateOffer.
- Sitemap 30+ entries; robots.txt explicit allow list.
- Homepage footer rewritten linking every public surface.
- /pricing FAQ (10 objection-handling Q&As) + risk-reversal strip.
2026-05-29 — Major release: composable pricing + self-serve
New ways to use AutomateDojo
- 5 bundles + À La Carte builder at [/pricing](/pricing). Pick exactly what you need: Website Only ($98/mo), Ads Reporting Only, Ads Managed ($399/mo), Website + Ads Reporting, or the Full Bundle ($1,173/mo). Setup fees right-sized to monthlys (3.5× ratio low end, 1.5× ratio high end).
- Self-serve checkout from the pitch page. /pricing → bundle → /get-started → preview → Stripe Checkout → auto-invite + magic link → /client/<slug>. Zero staff touch on the common path.
- 30-day money-back guarantee on your first paid month. Cancel anytime, your domain + leads + data stay yours.
New customer-facing surfaces
- AI website editor at /client/<slug>/site — plain-English prompts that update your site. 200,000 Claude tokens / month included with the SKU.
- Ads AI Assistant at /client/<slug>/ads/assistant — chat with Claude grounded in your live ad data. 200k tokens / month included.
- Unified reporting dashboard at /client/<slug>/reporting — roll-up KPIs + per-channel tiles + funnel + attribution table, all in one view.
- AI token billing page at /client/<slug>/billing/ai-tokens — balance per surface, buy more, auto-recharge toggle.
- Subscription management at /client/<slug>/billing-portal — SKU breakdown + Stripe Customer Portal access.
New marketing surfaces
- [ROI calculator](/roi-calculator) — plug in your dojo's numbers, get payback period + 12-month ROI for each bundle vs DIY vs agency.
- [Comparison page](/compare) — honest 18-row table comparing AutomateDojo vs DIY vs local agency.
- [Help center](/help) — 12 self-serve articles across getting-started, site editing, ads, billing, data.
- [Pricing FAQ](/pricing#faq) — 10 common questions (cancel, refund, add/remove SKUs, setup time, token top-ups) answered directly on the pricing page.
Customer success
- 30-day welcome drip — 5-touch email sequence over 30 days for paying customers (day 1, 3, 7, 14, 30). Feature-aware copy.
- Welcome magic link sent automatically the moment Stripe payment clears.
Behind the scenes
- 21 SKUs in the catalog, synced to live Stripe. Hard rules enforced in DB + runtime + UI (Website AI Editor needs Website Managed; Ads AI Chatbox needs Ads Managed).
- Idempotent Stripe webhook — duplicate deliveries can't double-activate SKUs.
- Auto-recharge cron for AI tokens (opt-in only, off by default).
- Bing + TikTok data plane ready for the rollup cron once OAuth wizards land.
- Customer data export — one-click JSON download of leads, site revisions, billing history.
2026-05-21 — 4 changes
New features
- full-site rebuild pipeline + brand-adaptive template (#3) — *Anthony* ([
5c0ffa3](https://github.com/kennyhyder/automatedojo/commit/5c0ffa3e3b126eb64f291c7947fbc29fd6b70e73)) - Cost reduction: 3-tier model strategy + prompt caching — *Kenny* ([
54edfce](https://github.com/kennyhyder/automatedojo/commit/54edfcea1ad892500c9525281ff3d8a8891632ba)) - Instrument Claude cost across every call site + admin dashboard + per-dojo daily cap — *Kenny* ([
d33ce70](https://github.com/kennyhyder/automatedojo/commit/d33ce701b257082f898d0fbcea4d8b19ad6fe48d)) - CLAUDE.md: persistent project instructions to maintain session-to-session consistency — *Kenny* ([
9caaf38](https://github.com/kennyhyder/automatedojo/commit/9caaf387e258c5f263ddb0a206d3ad5374215584))
Other
2026-05-18 — Polish round
- Cmd-K command palette in admin — search dojos, jump to any page. ⌘⇧N new client, ⌘⇧P new pitch, ⌘⇧L leads, ⌘⇧I inbox.
- Logo upload per dojo. PNG / JPEG / WebP / SVG.
- Brand color customizer — 8 presets + custom hex, applies to templates + emails.
- Lead detail drawer — click any lead row to see contact, enrichment (LinkedIn + score), UTM, notes thread.
- Notes thread per lead so staff + clients can log conversations.
- System notice banner — admins can post global announcements at /admin/settings/notices.
- Manual cron triggers — run any of 8 background jobs on demand from /admin.
- Per-dojo Slack webhook — real-time lead alerts in your own Slack channel.
- Lead lifecycle metrics at /admin/leads — win rate + conversion by source.
- Stripe customer quicklink on every prospect page.
2026-05-17 — Customer-facing polish
- Stripe billing portal embedded in client dashboard — update card, view invoices, cancel without emailing us.
- Toast notification system — all forms now use consistent in-app feedback.
- First-login walkthrough for dojo owners (4-step tour).
- Print/save-as-PDF on client dashboards.
- Loading skeletons + empty states across admin lists.
- Lead enrichment scaffold — auto-infers company name, LinkedIn search URL, business vs free email, quality score 0-100.
2026-05-16 — Phase 2: full operations stack
- Mobile-responsive admin with hamburger drawer.
- Bulk-onboard clients from CSV.
- Per-location everything: Meta page + pixel + campaign filter, CallRail tracking number, lead routing, KPI breakdown.
- Lead status workflow (new/contacted/qualified/converted/lost).
- CSV export for leads, audit log.
- Manual lead entry for walk-ins / referrals.
- Domain health monitoring — daily DNS / Vercel / HTTPS / SSL probe.
- Webhook retry queue — failed lead fan-outs retry with exponential backoff.
- Daily content snapshots — full DR backup of every dojo's content.
- Webhook health dashboard for staff visibility into integration reliability.
- Per-tier feature gating with upgrade prompts.
2026-05-15 — Launch
- Weekly client digest email — Friday 9am PT with leads + ad spend + per-location breakdown.
- Multi-location dojo support with per-location lead attribution.
- Per-dojo lead-source breakdown in client portal.
- Public dojo directory at /dojos.
- Public status page at /status.
- Referral program scaffold — clients earn $200/mo credit per dojo they refer.
- Pre-cutover preview email sent when domain cutover is scheduled.
- Pitch share OG image — pitch links look professional in iMessage/Slack/Twitter.
- Onboarding wizard — 9-step save-and-resume flow.
This changelog is rendered from /CHANGELOG.md in the repo. Edit there and it updates here on next deploy.