Changelog
Every meaningful update to Admaxxer since launch. Updated weekly.
Seven-day free trial on every plan + 46 seeded GEO content pages
Extended the app-managed 7-day free trial from Starter-only to every plan, and shipped 46 canonical content pages across comparisons, features, guides, FAQs, and research blog posts.
- Trial mechanic extended from AD_STARTER-only to any plan the user picks at signup — no credit card, no Stripe trial_period_days.
- New shared/offer-copy.ts constants module is the single source of truth for TRIAL_LENGTH_DAYS, REFUND_WINDOW_DAYS, and BRAND_ONE_LINER.
- 46 idempotent SQL-seeded pages: 8 comparisons, 4 feature pages, 8 attribution guides, 8 install/troubleshooting guides, 6 research blog posts, 12 FAQs.
- scripts/verify-geo-content.ts validates DB rows, route-matcher resolution, template size, and robots/sitemap/llms wiring end-to-end.
Fail-closed access gate + annual plans live
Shipped the requireActivePlan middleware that denies paused, expired, and past_due workspaces, and turned on 20%-off annual billing across Starter, Pro, and Agency.
- requireActivePlan middleware denies paused/expired/past_due at the API layer — no more silent access for lapsed subs.
- Trial banner + expired-trial wall now gate dashboard, chat, and campaign ops.
- Annual plans priced at $24/$64/$159 per month when billed yearly (20% off), six plan keys live in shared/pricing.ts.
- Checkout metadata casing normalized to snake_case to match the webhook reader (GL#41).
Documentation hub + 20 per-platform install tutorials
Shipped a unified /documentation/install hub driven by a single-source registry that powers both the React pages and the SSR templates.
- Single registry at server/docs/install-platforms.ts drives client pages, SSR templates, route-matcher, sitemap, robots, and llms.txt.
- All 20 tutorials render full HTML with TechArticle, HowTo, FAQPage, and BreadcrumbList JSON-LD — verified via ClaudeBot UA curl.
- LocalStorage keys migrated with read-old-fallback so GA4 conversion tracking does not double-fire during the rebrand.
- 12 dead URLs removed from sitemap and llms.txt (no matching App.tsx routes or SSR templates).
Claude agent gains sixth tool + streaming SSE hardening
Added query_metrics as a read-only analytics tool alongside the five destructive-gated campaign tools, plus prompt-cache hit improvements on the system block.
- query_metrics tool exposes the same Tinybird pipes that power the dashboard — the agent can now reason about MER, CAPI match rate, and cohort LTV in one turn.
- Prompt caching preserved on the system block and tools array so cache hit rate stayed above 90% after the new tool was added.
- update_campaign, create_campaign, and pause_all_low_roas still require explicit confirmed: true before execution.
- Streaming SSE reconnect now exponential-backoff with jitter — no more thundering-herd on WAN flaps.
CAPI match rate monitor (Hyros-style) + cohort LTV 7/30/90d
Built-in CAPI quality scoring per pixel and per ad account, plus ad-level cohort LTV over 7, 30, and 90 day windows.
- CAPI match rate is computed from the first-party pixel stream and Meta's conversions API feedback — surfaced in the Attribution drill-down.
- Cohort LTV exposed at ad level so you can see which creatives pull in buyers with 90-day LTV, not just day-one ROAS.
- New adsLtv.ts route runs alongside adsCapiMatchRate.ts and shares the workspace-scoped tinybirdPipeLimiter.
- Dashboard adds a 'CAPI flying blind' alert when match rate drops below 50% for a 24h window.
MMM + forecast + incrementality v0.1
Shipped the first cut of channel contribution via OLS with geometric adstock, a 30/60/90-day forecast with weekly seasonality, and paid-vs-organic incrementality via two-proportion z-test.
- forecast.ts uses OLS with weekly seasonality to project 30/60/90-day blended revenue.
- mmm.ts runs OLS + geometric adstock so each channel's contribution is stable week-over-week.
- incrementality.ts applies a two-proportion z-test to paid-vs-organic cohorts to surface lift.
- All three are fail-closed on missing TINYBIRD_ADMIN_TOKEN — no silent empty dashboards (GL#231).
First-party pixel + Tinybird analytics foundation
Launched the storefront-agnostic first-party pixel plus 33+ Tinybird pipes for visitors, revenue, cohorts, MER, LTV, MMM, forecast, and incrementality.
- Pixel fires on Shopify, WooCommerce, headless commerce, and fully custom storefronts — one snippet in the site head.
- Tinybird pipes under tinybird/pipes/ power the Summary dashboard, Marketing Acquisition, and Attribution drill-down.
- Pixel writes public cookies admaxxer_visitor_id (365d) and admaxxer_session_id (30min rolling) that merchants can pass through to any payment provider.
- 33+ pipes cover visitors, revenue, cohorts, blended MER, LTV, MMM, forecast, and incrementality.
BullMQ workers + Upstash Redis for insight syncs
Moved ad platform insight syncs onto BullMQ with Upstash Redis so sync fan-out is rate-limit-aware, retryable, and observable.
- One shared ioredis connection across queues and workers — no per-queue connection fan-out (GL#67).
- Incremental, catchup, backfill, and manual-resync job types with BullMQ priority tiers.
- 90-day Meta and Google backfills are chunked 3x30d at priority 10 so live syncs never starve.
- Token-expiry cron widened to a 7-day window so tokens are refreshed before they silently lapse.
Google Ads GAQL + refresh token flow
Google Ads service now executes GAQL queries against the v17 API with manager-account (MCC) support via the login-customer-id header.
- Paste your Google Ads refresh token and a 10-digit Customer ID — Admaxxer handles the adwords scope exchange.
- login-customer-id header is configurable per workspace for MCC structures.
- cost_micros divided by 1e6 at the service layer so downstream code always sees dollars, never micros.
- GAQL queries validated against the reference before execution — malformed queries fail fast with a helpful error.
Meta long-lived paste-token onboarding + 60-day expiry cron
Launched the paste-token model for Meta Marketing API — no Meta App Review required, and a proactive 60-day expiry cron warns workspace owners 7 days before a token lapses.
- Paste a Meta System User long-lived token with ads_management and ads_read scopes — connection ready in under 60 seconds.
- Tokens encrypted with AES-256-GCM at rest, keys derived from SESSION_SECRET via scrypt.
- Token-expiry cron inspects expires_at on every sync and emails the workspace owner 7 days before expiry.
- Expired tokens auto-pause the integration instead of silent-failing — every lifecycle event is written to adSyncLogs.
Magic-link auth + workspace invites
Replaced password auth with magic-link by default; added workspace invites with owner and member roles plus audit logging on every membership change.
- Magic links are single-use, 24-hour TTL, and stored in the magicLinks table with hash-at-rest.
- workspaceInvites table tracks pending invites with scoped workspace IDs and per-invite roles.
- Owner-only routes enforced by requireScope middleware; audit logs recorded in adSyncLogs.
- Signed HTTP-only session cookies (SameSite=Lax) with optional TOTP 2FA on paid plans.
Stripe billing live + crawler-only SSR
Wired Stripe Checkout and Customer Portal for Starter, Pro, and Agency plans, and turned on crawler-only SSR for every public marketing page.
- Three flat tiers — Starter $29, Pro $79, Agency $199 — all billed monthly or annually.
- Webhook handler routes subscription lifecycle events through a snake_case metadata reader (GL#41).
- SSR_MODE='crawlers-only' renders full semantic HTML for GPTBot, ClaudeBot, PerplexityBot, and DeepSeek, while the SPA shell serves humans with no FOUC.
- robots.txt, sitemap.xml, and llms.txt enumerated so every public page is discoverable from day one.
Want to be the first to hear about updates?
Start your 7-day free trial. No credit card, no sales call — every plan, every feature, including every update on this page.