Skip to content
- billing: the Free-tier platform fee on payments you collect is now 2% (previously 1%). Every paid plan stays at 0% — you keep 100% of what you collect. The fee is VertaFlow’s cut on top of Stripe’s own standard processing fees, applied only to money you collect from your customers (not your own subscription). See Stripe payments & platform fee.
- pos: cash sales now apply your location’s configured sales-tax rate (they previously rang up tax-free), matching card/terminal checkout.
- ci: enforce white-label rules in client templates (raw-hex + brand-string + WCAG gate)
- brand: derive full ~38-role token kit from minimal input, all WCAG-gated
- brand: tenant brand mode/secondary/dark-logo + accentText softening
- brand: reproducible deriveBrandkit + WCAG validation gate
- brand: one effective white-label resolver honoring the add-on on every surface
- portal: serve /activate via portal-next shell + portal-native contract links
- domains: finish os.vertaflow.io CRM-app cutover + legacy 301 redirects
- auth: pass BARE code to exchangeCodeForSession (real flow_state_not_found fix)
- brand: split brandkit.ts under file-size budget (unblocks build 294)
- auth: store PKCE verifier in localStorage, not cookies (os. login fix)
- ci: login guard reads SUPABASE_ACCESS_TOKEN from env (where deploy sets it), not just the secret store
- ci: unbind-var crash in live-smoke redirect check + HARD-FAIL the login-config guard (no more silent skip)
- portal: preview sealed-email links use preview.clients portal host (not preview.os)
- secrets: rebind BETTER_AUTH_SECRET store entry as APP_SIGNING_SECRET
- cleanup: rename recycled BETTER_AUTH_SECRET→APP_SIGNING_SECRET (fallback-compat), drop dead better-auth cruft
- regenerate route manifest for branch
- arch: Edge Brand CDN — CF-native white-label delivery (future work)
- preview: admin re-sync DNS endpoint + ops script (repair/backfill)
- preview-shell: restore PreviewHub DO (unbreak prod deploy)
- arch: capture CF four-layer target architecture (deepening roadmap)
- preview: regenerate route manifest + api-types for resync-dns route
- Fix #275 prod deploy: delete-class migration for orphaned PreviewHub DO
- move push opt-in out of Security (single home under Notifications)
- Unblock client preview-delivery pipeline (Web Viewer dead links)
- Post-green hardening round: Gut C rename + test-noise filter + 1-width sweep + cache-busting finale
- chat: enable two-way live chat (flag on)
- backlog-swarm: two-way chat (staged, flag off), notif resilience, pricebook guards, login e2e
- chat: capture visitor identity + FAIL-CLOSE until two-way replies land
- reseller: demo-tenant provisioner — one real login per vertical
- billing: founding free-for-life exemption (config-driven, protects ANTHONY.)
- ops: VertaFlow-native operator push on API 5xx + launch health check
- spin: ship the embeddable /v1/spin.js loader + third-party CORS
- spin: data-driven per-tenant spin-wheel promo (config API + widget)
- seats: Team & Seats settings UI (self-serve seat purchase)
- stripe-connect: prefill the business name into Connect onboarding
- seats: self-serve extra seats via pricebook + Checkout (no Price ID)
- dedba: Phase 2 foundation — data-driven lead-source→tenant registry
- dedba: Phase 1 — kill the tool-store (#25)
- contracts: named contract library + per-estimate selector (#20)
- preview: un-stub client Approve → schedule-go-live (SP3) (#18)
- crm-next: reseller “Add client / Create workspace” UI (#17)
- first-login activation wizard (SP-A) — fixes broken onboarding (RC gate E) (#12)
- release: add opt-in RELEASE_CHANNEL=rc prerelease channel + rollback runbook (#14)
- frontend: wire Sentry error tracking into crm-next + portal-next (#15)
- money: delivery integration = $499 across catalog, pricebook, Elements + PDF
- launch: login hardening, MCP OAuth grant, widget theming + fail-closed popups
- nav: per-vertical menus only + remove ‘View as’ picker + de-hardcode operator comp
- hardening: audit swarm batch C — idempotency, races, tenant-scope, retries
- ux: dashboard + reports show “incomplete” banner instead of $0 during outages
- hardening: LOW batch A — open-redirect, form-swallow, inventory oversell
- hardening: MED batch B — Stripe call timeout + invoice-number race
- hardening: MED batch A — lost-update races + dedup 500s + metadata clobber
- hardening: P1 batch B — booking data-loss, MCP consent bypass, drip cap
- hardening: P1 batch A — payment-ledger races, widget origin, invoice re-sync, convert 500
- security: P0 — close cross-tenant contract read + JWT RBAC/entitlement bypass
- hardening: audit batch 1 — booking idempotency, rate limits, query/payload bounds
- seats: prevent double-charge on the self-serve seat return
- crm-next: immutable asset caching + Supabase preconnect on the shell
- qa: exclude /oauth/consent from the authed route-sweep (main #211 red)
- mcp: clean OAuth on preview + prod — consent page + per-host discovery
- seats: use rem() tokens for inline spacing in Team & Seats UI (lint gate)
- de-platform: Gut B1 — contract/portal ownership routing is fail-closed
- de-platform: Gut A — lead-source→tenant routing is data-driven + FAIL-CLOSED
- migration: 0113 array-type cast — unblock the preview deploy
- portal: PBKDF2 iterations within the Cloudflare Workers cap (100k)
- portal: push-notification click deep-links to the target screen
- observability: stop Sentry-spamming ‘no APNs/FCM creds’ on every notify
- rbac+abac+perf: money gates, actor-less escalation, per-record ownership, public rate-limit reorder (#24)
- multitenant: tenant-scope sharded primitives + storage keys (cross-tenant leak sweep)
- ci: merge-to-main pushes via SSH deploy key, not GitHub App token (#21)
- ci: raise preview-smoke timeout 25→50m (build #147 red was a wall-clock timeout, not a failure) (#19)
- crm-next: RC polish — proper not-found on detail routes, resilient appointments loader, pin wildcard deps (#13)
- money: re-sent-invoice double-charge guard + audit regression tests (RC gate C) (#11)
- Sweep Vite→rsbuild path debt from CI/perf/Sentry scripts
- Harden Supabase auth-config guard against site_url trailing-slash false positive
- record iOS notification deep-link fix in go-live checklist
- Fix iOS notification deep-link (cold-launch lands on the right screen)
- Fix stale service-worker cache-buster (rsbuild entry detection) + close the gap
- Bind widget ingest signer secret
- Fix customer-proxy widget endpoints
- Polish CRM notification copy
- Add bar widget offer form id config
- Add bar widget offer config fields
- Fix bar widget offer capture
- Stamp contract widget views before signing
- Fix popup widget pointer interception
- Prefer Buildkite QA auth secrets in preview smoke
- Allow preview smoke QA auth metadata override
- fix widgets as customer drop-ins
- match the per-vertical-menu / no-switcher / free-for-life changes
- test+ci: fix swarm-batch test mocks + allow-list webhook admin-bypass
- watchdog: extract billing-exempt helper to keep main.ts under budget
- biome-format the demo-provisioner tenantId return (CI format gate)
- qa: register contractAccess.spec in the route manifest
- runbook: launch-night watch + first-response section
- spin: regenerate v1.d.ts for GET /spin/config (SpinConfigResponse)
- spin: format + regenerate api-types/manifest for the spin-wheel routes
- audit: multi-tenant correctness audit (2026-07-05, 7-dimension)
- crm-api: un-skip tenant-isolation via hermetic mock-DB behavior specs (#16)
- inventory: Scan-First inventory: scan-to-restock, batch QR label sheets, cycle-count blitz, truck-stock QR wallet, and barcode-native receiving
- loyalty: Loyalty & delight: check-in streaks, automatic tier-ups, lucky-scan surprises, milestone confetti, and birthday rewards
- pos: Tap-to-Tip on the in-person card terminal
- reviews: Verified-Review fast lane
- nav: Vertical-aware quick-create verbs in the Command Bar
- crm-next: Native mobile re-skin: floating glass pill navigation, large titles, soft-indigo KPI cards, and rounder surfaces
- billing: Billing portal auto-provisions a Stripe customer so it opens for every active plan
- deploy: Database migrations now apply to preview as well as production, ending schema drift
- crm-next: Page headers stack on mobile so wide toolbars no longer overlap the title