A modern event platform for communities and small organisers.
Beautiful pages, fast ticketing, social momentum, and reliable check-in — without enterprise pricing.
Part of the Geiger suite.
Geiger Events is an all-in-one platform for creating events, selling tickets, managing guests, and running the door on the day. It is built for creators, communities, local businesses, workshops, meetups, and small conferences — organisers who need serious ticketing power without the cost and complexity of an enterprise suite.
The product has two sides: an organiser workspace for building and running events, and an attendee experience made up of public event pages and a personal members portal.
| Area | What it does |
|---|---|
| Events | Create and manage events, templates, and recurring series, each with its own editor and a public event wall. |
| Ticketing | Reusable ticket types, tiers, bundles, discounts, early-bird and dynamic pricing, donations, group buying, memberships, and secure Stripe checkout. |
| Registrations | RSVPs, custom forms, waitlists, approval gates, capacity limits, and dietary/accessibility collection. |
| Guests (CRM) | A unified contact database with import, dedupe, segments, tags, notes, and export. |
| Check-in | QR tickets, wallet passes, a check-in app, door sales, offline mode, kiosk mode, badge printing, and multi-gate scanning. |
| Campaigns | Email, SMS, and WhatsApp outreach with templates, drip sequences, segmentation, and scheduling. |
| Advertising | A simple control panel over Google Ads, Meta Ads, and related platforms. |
| Workflows | A no-code automation engine with a visual builder and run history. |
| Conference | Agenda builder, speakers, sponsors, expo booths, call for papers, and recordings. |
| Members portal | Attendees manage tickets, orders, memberships, and refunds, show a QR pass, and message organisers directly. |
For the full, non-technical tour see docs/product-overview.md.
- Framework — Next.js 16 (App Router, SSR/SSG) and React 19
- Styling — Tailwind CSS v4 and shadcn/ui, with the shared
@geiger/uicomponent library - Icons — Lucide
- Backend — Supabase (Postgres, Auth, Storage)
- Payments — Stripe
- Other — Recharts (charts), React Flow (workflow canvas), Leaflet (maps), qrcode / jsQR (tickets)
- Node.js 20 or later
- A Supabase project and a Stripe account
npm installCreate a .env file in the project root:
# Runtime (browser) — Supabase
NEXT_PUBLIC_SUPABASE_URL=your-supabase-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
# Server-only
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
STRING_URI=your-direct-postgres-connection-string # migrations only
STRIPE_SECRET_KEY=your-stripe-secret-key
STRIPE_WEBHOOK_SECRET=your-stripe-webhook-signing-secret
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=your-stripe-publishable-keyRegister the production endpoint
https://geiger-events.vercel.app/events/api/stripe/webhook in Stripe for
checkout.session.completed and checkout.session.async_payment_succeeded.
The return page uses the same idempotent fulfillment path, but the webhook
guarantees an order is recorded even if the buyer never returns after payment.
In Stripe Dashboard, open Developers → Workbench → Webhooks, then:
- Choose Create new destination and Events on your account.
- Select
checkout.session.completedandcheckout.session.async_payment_succeeded. - Choose Webhook and enter the production endpoint above.
- Create the destination, reveal its
whsec_…signing secret, and add it to Vercel asGEIGER_STRIPE_WEBHOOK_SECRETfor the Production environment. - Redeploy, complete a Stripe Checkout payment, and confirm its delivery shows
HTTP
200in the destination's Event deliveries tab.
Stripe sandbox and live-mode destinations have different signing secrets. Use the live destination's secret in Production; use a separate sandbox destination and secret for local/preview testing.
Schema changes are timestamped SQL migrations in supabase/migrations/, applied
in version order by @geiger/orm
and recorded in events.geiger_migrations:
npm run db:status # applied vs pending
npm run db:new -- <name> # scaffold a migration
npm run db:push # apply everything pending
npm run db:seed # re-runnable dataSee MIGRATION_CONVENTIONS.md before writing any DDL.
npm run devOpen http://localhost:3000 in your browser.
app/ Next.js App Router routes
e/ Public event pages
w/ Public organiser walls
login/ Members portal auth
project/ Organiser workspace
components/
internal/screens/ Organiser workspace screens (by area)
internal/shared/ Shared screen kit (headers, tables, stats, dialogs)
portal/ Attendee-facing members portal
ui/ shadcn primitives
lib/
supabase/ Data-access layer (one module per area)
portal/ Portal domain logic
rbac.js Permissions catalog
supabase/migrations/ Timestamped @up/@down migrations (npm run db:push)
supabase/seeds/ Re-runnable idempotent data (npm run db:seed)
docs/ Product and reference documentation
This codebase follows a consistent set of patterns. Read these before contributing:
AGENTS.md— working notes for this Next.js versionMODULE_CONVENTIONS.md— how to build a workspace screenSUPABASE_CONVENTIONS.md— the data-layer playbookMIGRATION_CONVENTIONS.md— schema changes and@geiger/ormcrafting.md— UI craft and quality bar
docs/product-overview.md— full product tourdocs/product-intro.md— short and long introsdocs/product-pitch.md— positioning and pitchdocs/product-keywords.md— keywords and tagsdocs/competitive-feature-matrix.md— competitive research
Geiger Events is one application in the broader Geiger suite, alongside Geiger Flow and Geiger Notes. The suite shares a common design language and the @geiger/ui component library, so every product feels native to the whole.
Private and unpublished. All rights reserved.