Limited Rob Van Dam and Kelly Kelly Meet and Greet Tickets at Battle for the Brave II on 9/26/26 now available!Buy Now

Changelog

What's New in Three Count

Platform updates, new features, and improvements.

v2026.06.04

Refund Reliability & Platform Hardening

Behind-the-scenes reliability and safety improvements:

  • Refund approvals are now fully race-safe — simultaneous approve/deny actions can never move money under an already-resolved request.
  • Event refund-policy settings (deadline, max percent) are validated on save to prevent invalid windows.
  • Ticket-delivery text messages can no longer delay order confirmations.
  • Self-service refund lookups and automated domain health checks were hardened.
v2026.05.15

Section-Scoped Seat Display Labels

Seat labels now carry meaningful section context all the way from the venue builder to the printed ticket.

What's new: - event_seats.display_label column stores a human-readable label generated at seat provisioning time (e.g. "North Row 1, Seat 3", "Bleachers Row 2, Seat 7") - Label format: {Section Name} Row {row label}, Seat {number} — built from the section assignment in the venue canvas - formatSeatLabel() uses the stored label when available; falls back to the legacy side_label/row_label/seat_number fields for older seats - Seat labels appear on the ticket page, confirmation email, and scanner check-in screen - Default row label changed from blank to "1"; duplicated rows auto-increment (1 → 2 → 3)

To activate on an existing venue: assign directional sections to rows, set row labels, re-save the venue, then re-provision event seats.

v2026.05.08

Standalone Experience Ticket Purchases

Experience tickets (Meet & Greet, VIP packages) can now be purchased without requiring an event ticket. Promoters set requires_event_ticket to false on any experience add-on, and buyers see it in a dedicated section on checkout — no event ticket needed. Each experience ticket incurs the standard $2.50 platform fee. The checkout flow, webhook processing, and scanner all handle standalone experiences seamlessly. Under the hood, tickets.tier_id is now nullable to support experience tickets that don't belong to a pricing tier.

vv2026.04.24b

Gutwein Legal Document Migration (Session 4)

Completed cleanup and archival of pre-Gutwein legal documents.

  • Signing flow simplified: New signing sessions now use a single unified CSA v2 document (Order Form + Exhibit A Terms & Conditions + Exhibit B Acceptable Use Policy) instead of the previous 2-document flow
  • Template rendering fixed: Provisioning engine now properly renders CSA variables into HTML and computes content hashes (was storing empty HTML)
  • New Session modal expanded: Added Client Address, Client Title, Term, and Number of Websites fields for the Gutwein Order Form
  • Pre-Gutwein templates archived: csa-v1.md and tos-v1.md renamed to .ARCHIVED.md suffix (matching existing aup-v1 and dma-v1 convention)
  • Design doc updated: digital-onboarding-design.md annotated with Gutwein migration status
vv2026.04.24a

Card-at-Door Phase 2: Stats & Reconciliation

Card-at-door payments are now fully tracked across all dashboards.

Scanner Stats Panel — New indigo "Card Sales" reconciliation section shows card revenue, per-tier breakdown, and pending payments alongside the existing Cash Summary. The "Door (Card)" stat card gives staff a quick count at a glance.

Revenue Analytics — The promoter analytics donut chart now shows four ticket sources: Online, Door (Cash), Door (Card), and Comps. The per-event breakdown table includes a dedicated Card column with footer totals.

Confirmation Email — Buyers who pay via card at the door now receive a ticket confirmation email (retrieved from the email they enter on the Stripe Checkout page). The order record is updated with their email for admin visibility.

Platform Admin — Card-at-door platform fees ($2.50/ticket) were already included in MTD revenue calculations — no change needed. Card door sales flow through the same orders table with the same fee structure as online sales.

vv2026.04.23b

Featured Match & Champions Showcase

Two new homepage content modules, available in the Layout Editor.

Champions Showcase — displays current titleholders in a gold-accented card grid. Each championship shows the belt image, champion photo, title name, and weight class. Tag team titles show both champions with overlapping portraits. Vacant titles are handled gracefully.

Featured Match — a dramatic VS-style spotlight card that auto-highlights the main event from the next upcoming show. Fighter photos on each side, match type badge, championship stakes when applicable, and a "Get Tickets" CTA linking directly to the event. Handles singles, tag teams, and multi-person matches.

Both modules are available under "Add Section" in the Theme Editor's Homepage Layout panel. No migration required.

vv2026.04.23a

Page Layout Builder Phase 2

Suggested layouts, templates, and master admin layout assignment.

Preset-specific layouts — Each theme preset (Arena, Territory, Broadcast, Marquee, Ark) now ships with a suggested homepage layout tuned to its visual style. Tenants using a preset get its suggested layout automatically — no manual setup needed.

Layout templates — Save any homepage layout as a reusable template. Load templates from the Theme Editor to quickly apply proven arrangements across tenants.

Master Admin layout assignment — The Clients page now includes a Layout Assignment panel. Quick-apply templates, use a preset's suggested layout, or link to the full editor — all from one place.

Smart layout resolution — Homepage layout now resolves in priority order: custom layout → preset manifest suggestion → code-defined preset default → global default.

vv2026.04.23

Page Layout Builder

Homepage Layout Editor — A new "Homepage Layout" section in the Theme Editor lets operators reorder and toggle homepage content sections. Drag sections up/down, show/hide them with a toggle, or add new ones from the module menu.

What changed under the hood: - The homepage is now powered by a dynamic layout engine instead of hardcoded JSX - Hero banner is decoupled — events and news are separate modules positioned by the layout engine - 8 content modules available: Hero Banner, Upcoming Events, Latest News, Next Show Countdown, Roster, Sponsors, Email Signup, Call to Action - Tenants with no custom layout see the exact same homepage as before — zero visual change - New page_layouts table stores per-tenant layout definitions - 11 additional modules planned for future phases (Featured Match, Video Embed, Champions Showcase, and more)

v2026.04.23a

Pipeline: Demo Site Links Now at Top of Lead Modal

The green 🌐 Demo Site panel in the pipeline lead modal has been moved to the top of the card, just below the promotion name. Previously it appeared below the form fields and required scrolling to find. It now appears immediately when you open a lead with a demo site built.

v2026.04.22a

Marquee Theme — 5th Theme Preset

New theme preset: Marquee — a dark entertainment venue aesthetic inspired by concert halls and nightlife venues.

6 custom layout variants: - EventCard — poster-dominant 3:4 cards with overlaid amber date badges (day/date/month) - Hero — full-bleed banner with heavy bottom gradient fade - Nav — translucent dark bar with backdrop blur on scroll - EventDetailHeader — full-bleed poster with scaled-up date badge - FighterCard — portrait photo cards with name overlay at bottom - NewsFeed — dark card grid with thumbnail images, minimal chrome

Design DNA: Near-black (#0a0a0a) palette, Barlow Condensed uppercase headings, warm amber (#f97316) structural accents, 0.25rem tight radius, shadow-defined cards. 7 remaining surfaces use Classic variants with Marquee tokens applied.

Theme Showcase updated with Marquee and Broadcast preview cards at /themes.

Test coverage: 320 visual contract tests passing across all 11 themed surfaces × 5 variants.

v2026.04.22

Broadcast Theme — Editorial Media Variant Family

New theme preset: Broadcast — a WWE.com-inspired editorial media aesthetic for promotions that want a premium, content-forward look.

6 custom Broadcast layout components: - Hero: Full-bleed cinematic imagery with smooth gradient overlay - Nav: Sleek translucent bar with backdrop blur and accent line - Event Cards: Landscape 16:9 media cards with overlay text and "Live Event" category labels - News Feed: Card-based feed with color-coded category tags per news type - Event Detail Header: Full-bleed poster with cinematic bottom gradient - Fighter Cards: Portrait media cards with gradient overlay text and champion badges

7 surfaces reuse existing variants (Footer, TicketCTA, EventsList, PolicyBadges, CtaSection, SponsorGrid, MailingListSignup) styled by Broadcast tokens — dark cinematic palette, smooth shadows, modern rounded corners.

Self-hosted Bebas Neue font for bold condensed display headings.

252 visual contract tests passing across all 4 theme variants (Classic, Arena, Territory, Broadcast).

Broadcast is the 4th theme preset, completing Phase 4 Track 2 of the theme system. The Flex Tokens infrastructure from Track 1 means future token-only themes can now be created in ~15 minutes with just a JSON manifest — no new component files needed.

v2026.04.22

Flex Tokens — Expanded Theme Token Vocabulary

Expanded the theme token system from 10 to 22 properties, enabling future themes to be created as token-only JSON diffs without writing new component code.

New token categories: border color, 3 shadow magnitudes (card/button/heavy), 5 surface colors (surface, surface-alt, text-primary, text-secondary, background), and 4 visual treatments (overlay style, image treatment, section divider, card border).

Refactored all 37 variant components (13 Classic + 13 Arena + 11 Territory) from hardcoded inline styles to CSS variable references. Territory variants are now fully registered and active.

204 visual contract tests passing across 11 test files.

v2026.04.21

Bug Fix: Comp Ticket Issuance

Fixed: The "Issue Comp" button in the admin dashboard was silently failing for all tenants. Comp tickets can now be issued reliably from the Comps tab on any event.

Root cause: The comp and door-sale ticket API routes imported a utility from lib/stripe.ts, which initializes the Stripe client at module load time. Without the Stripe key present in certain contexts, the entire route crashed before executing. Additionally, the ticket insert included a source field that does not exist on the tickets table, and comp tickets were assigned a static qr_hash value of "comp" instead of a unique HMAC hash.

What changed: - Extracted generateTicketCode() to its own file (lib/ticket-code.ts) with no Stripe dependency - Removed invalid source field from ticket inserts in comp and door-sale routes - Comp and door-sale tickets now receive unique HMAC-SHA256 qr_hash values, consistent with paid tickets

v2026.04.21

Comp Tickets, Attribution Analytics & Demo Cleanup

Comp Tickets (Admin Dashboard)

Promoters can now issue complimentary tickets directly from the web admin — no scanner required. Head to any event → Tickets → Comps tab.

  • Issue comps with recipient name, optional email, tier, and a note
  • Optional confirmation email sent to recipient with ticket code
  • Comps scan in at the door like any paid ticket
  • Stats bar shows total comps issued, redeemed count, and total face value given away

Attribution Analytics Dashboard

New page at Platform Admin → Attribution showing where demo requests are coming from.

  • Requests by UTM source, campaign, and medium (bar charts)
  • Top referrer domain breakdown
  • Recent requests table with colored source/medium/campaign pills
  • Graceful empty state until UTM data accumulates

Demo Tenant Cleanup

  • delete_demo_tenant(slug) Postgres function — safely cascades through all demo tenant data; refuses to delete real tenants
  • Onboarding wizard no longer includes demo or test tenants in the client list
v2026.04.21

Checkout UX: Quantity-First Seat Selection

What Changed

The reserved seating checkout flow now works the way you'd expect: choose your quantity first, then pick your seats.

### Before - The floor plan appeared immediately on page load - Reserved tiers showed "Pick seats below" with no way to set quantity - GA tiers mapped to a floor plan section showed "Pick seats below" instead of +/- buttons

### After - All tiers (GA, reserved, standard) show +/- quantity buttons - The seat map only appears after you select at least 1 reserved ticket - While the map is open, a per-tier hint shows "X / N seats chosen" - Hitting − back to 0 collapses the map and clears your seat selections - Reserved vs. GA detection is now based on explicit section mapping — not a fallback

No migrations. No API changes. Pure checkout UX improvement.

v2026.04.20b

Theme System Phase 3 Complete

Theme System — Legacy Cleanup Complete

Final phase of the theme preset system migration. The platform has fully transitioned from tenant-specific CSS variables to the preset token architecture.

### What changed - Removed legacy CSS variables--color-accent, --color-bg, --color-surface, --color-text-on-primary, --color-text-on-bg, --font-family, --texture-bg, --texture-opacity no longer exist in the global stylesheet. The texture overlay system (.bg-surface::after, .card::after) has been retired. - Database cleanup — 12 legacy columns dropped from the themes table (accent_color, background_color, font_family, texture_*, surface_color, etc.). Existing values were snapshotted to legacy_theme_data JSONB before removal. - Leaner theme APIthemeToCSS() now emits only 3 CSS variables: --color-primary, --color-secondary, and --header-logo-height.

### What this enables All public tenant pages are now styled exclusively through the Classic, Arena, and Territory theme preset tokens. Adding a new theme no longer requires touching the database schema or the CSS variable bridge — just add a preset manifest.

v2026.04.20a

Arena & Territory Theme Variants

Two new visual themes are now available for assignment to tenant sites. Each theme transforms all 11 public-facing surfaces — hero, event cards, event detail header, ticket CTA, footer, nav, events list, policy badges, fighter cards, news feed, and CTA section.

Arena — Brutalist, high-contrast design for hardcore and punk-rock promotions. Anton display headings (uppercase), Oswald body text, 0px border radius, 3px borders, 6px hard drop shadows, accent stripes, and angular overlays. Self-hosted Anton and Oswald fonts.

Territory — Throwback newsprint aesthetic for old-school territory promotions. Playfair Display serif headings, Lora serif body, cream backgrounds (#f5f0e8), earth-tone palette, double-rule borders, and sepia-tinted imagery. Self-hosted Playfair Display and Lora variable fonts.

Both themes are assignable from the Master Admin client detail page. 177 visual contract tests pass across all three themes (Classic, Arena, Territory).

Technical: 22 new variant components, 4 self-hosted font files, migrations 025 + 026 (preset seed data).

v2026.04.20

Theme System Infrastructure

Laid the groundwork for operator-assigned visual themes across tenant sites. This release ships the infrastructure layer — no visible changes to any existing tenant site.

What's new under the hood:

  • Theme presets table — a new data model for storing named theme configurations (manifests) that can be assigned to tenants by the platform operator.
  • Classic preset — the default preset, mapping all 11 themeable surfaces to the current component designs. Every tenant automatically falls back to Classic.
  • ThemeProvider context — a React context that resolves the active preset and injects design tokens (fonts, radii, shadows) as CSS variables for downstream components.
  • 6 themed component variants — EventCard, Footer, Nav, TicketCTA, FighterCard, and NewsFeed have been refactored into a variant resolver pattern. Each surface can now render different visual treatments based on the active preset.
  • Middleware resolution — tenant requests now resolve the assigned theme preset and pass it through to the rendering layer.
  • Platform admin UI — theme assignment card on the client detail page and a dedicated Themes listing page for browsing available presets.

This sets the stage for Phase 2, where we'll introduce the first alternate theme variants (Arena and Territory) that give each promotion's site a distinct visual identity.

v2026.04.13

Admin Refund Workflow

Promoters can now issue full or partial refunds from the Tickets tab.

New features: - Per-ticket Refund button on valid, non-comp tickets — opens a refund modal with full/partial toggle, custom dollar amounts, and reason field - Per-event refund policy: configurable deadline (hours before event) and max refund percentage in Event Policies - Refund History panel on the Tickets tab — full audit trail of all refunds with buyer, type, amount, status, and date - Over-refund protection — tracks cumulative refunds per order, prevents exceeding the order total - Buyer email notifications for both full and partial refunds via Resend - Public event pages show a blue "Refunds: Up to Xh before event" badge when a deadline is configured

Technical: - New refunds table (migration 020) with Stripe refund ID tracking - Stripe partial refund support via Connect (stripe.refunds.create with amount parameter)

v2026.04.13

Help Center Phase 2: Complete Article Catalog

The promoter Help Center is now fully stocked with 29 articles across all 10 categories.

New articles (14):

  • Team & Permissions — Inviting Team Members, Roles & Permissions Explained, Custom Roles, Permission Overrides
  • Season Tickets — Creating a Season, Managing Season Holders, Auto-Assignment, Generating Tickets
  • Settings & Theme — Promotion Settings, Branding & Theme, Custom Domain, Stripe Payouts & Payments
  • Getting Started — Quick Start: Your First Event in 15 Minutes
  • Roster & Content — Building a Match Card

Bug fix: Help Center article cards and search hover states now render correctly in Light theme.

v2026.04.08

UTM Attribution & Preview Deployment Fix

What's New

Demo Request Attribution

The demo request form now captures UTM parameters, referrer, and landing page at submission time — no cookies, no third-party tracking. When a prospect submits via a UTM-tagged link (e.g., from a Facebook ad or a campaign email), the source data is stored with their lead record. The Platform Admin Leads view shows a Source strip with color-coded pills for utm_source, utm_medium, and utm_campaign, plus landing page and referrer lines.

Preview Deployment Fix

Fixed a bug where all Vercel preview deployments (feature branch URLs like *.vercel.app) were returning a not-found page instead of loading the platform. Preview URLs now correctly serve the marketing site and all admin routes, making branch testing reliable again.

v2026.04.03

Venue Layout Builder — Preview, Locking & Migration

What's New

  • Preview as Buyer — New toggle in the venue layout builder lets promoters see exactly what buyers will see at checkout, with a slider to simulate different sold-out percentages
  • Layout locking — When an event has sold tickets using a venue layout, the builder locks editing and shows which event is blocking changes
  • Per-section capacity — The capacity bar now breaks down seat counts by section name instead of the old seats/bleachers view
  • Compass migration — Legacy compass-based seat maps can now be converted to the new canvas layout format via API
  • Deprecation banner — The old seat map builder shows an upgrade notice directing promoters to the layout builder

Venue Unification Progress

This completes Phase 3 of the venue unification project. The canvas layout builder is now the single source of truth for venue design — what the promoter draws is what the buyer sees at checkout.

v2026.03.28

Platform Launch & Core Features

What's New

  • Multi-tenant platform — Full website + ticketing for indie wrestling promotions
  • Reserved seating — Interactive seat maps with drag-to-select
  • Scanner PWA — Offline-capable QR ticket scanning at the door
  • Season tickets — Auto-assigned across event series
  • Promo codes — Percentage and fixed-dollar discounts at checkout
  • Event add-ons — Meet & greet, merch, and custom upsells
  • Revenue analytics — Monthly trends, source breakdowns, per-event reports
  • Digital onboarding — Click-through contract signing (E-SIGN compliant)
  • Roles & permissions — 5 system roles + custom roles with granular overrides
  • Event cancellation — Bulk Stripe refunds with email notifications