Coyotes and Candles: Building a Full-Service Creative Platform for a Two-Person Business
Role: Solo Full-Stack Developer & Co-founder
Timeline: June 2026 (~8 days active development)
Client: Coyotes and Candles (my wife Alli's and my Helsinki-based creative services business)
Status: Live and taking bookings
THE HOOK
Built a production-grade booking, billing, and live-session platform from scratch in 8 days as the sole developer — replacing a patchwork of third-party tools with a single, unified system that handles everything from first visit through payment, live video session, and post-session follow-up. 330 commits. Real money. Real clients from day one.
THE CHALLENGE
My wife Alli and I run Coyotes and Candles together — she delivers live tarot readings and runs TTRPG campaigns as a GM; I handle everything technical. The idea was sound but the infrastructure didn't exist yet.
What the market offered:
Calendly for scheduling — no payment, no rooms, no recurring billing
Zoom for video — separate login, no VTT, no session tools
Patreon or Ko-fi for subscriptions — no booking integration
Discord for community — separate platform, no campaign access control
Manual invoicing for everything else
What we actually needed:
Customers book, pay, and join their session without leaving our site
Recurring campaign subscriptions with proper lifecycle handling (skips, cancellations, payment failures, forming campaigns with delayed billing)
A full virtual tabletop built into the video room — no download for clients
A community space automatically gated to enrolled players
A complete admin back-office so Alli and I have full visibility without digging through Stripe and email
WHAT I BUILT
Platform Scale
Metric Count Booking flows 6 (tarot, one-shot, private group, group circle, campaign seat, free join) Payment integrations 2 active (Stripe + PayPal), both with full webhook lifecycle handling Automated email types 20+ (confirmations, reminders, reschedules, failures, recovery, notifications) VTT features Tokens, fog of war, character sheets, music sync, drawing, dice, undo/redo Community features Channels, DMs, reactions, push notifications, moderation, Discord mirroring Character systems D&D 5e (full sheet + SRD compendium) + Shadowrun 4e (full sheet + Chummer import) Languages English (Finnish and EU compliance infrastructure throughout) Git commits 330
For Customers
Service browsing with instant booking for one-off sessions and recurring campaigns
Real-time availability calendar per GM, with per-GM booking buffers enforced
Stripe and PayPal checkout, with embedded Stripe for one-time payments and native PayPal Subscriptions API for recurring billing
Gift cards (custom amounts, emailed to recipient, redeemable at checkout)
Promo and discount codes with per-code use limits and expiry
Forming campaigns — reserve a seat and save payment details now, no charge until the campaign hits its minimum player count and a first session date is confirmed
Automatic full refund on cancellation (48h+ before session)
Self-service reschedule from the account page
Abandoned checkout recovery emails
Timezone-aware session times throughout — every time converts to the customer's local timezone
For Session Delivery
Built-in video rooms via Agora — no app download, no separate link
Full virtual tabletop on canvas: token drag-and-drop, multi-scene management, fog of war, layer controls, measurement tools, AoE templates, freehand drawing broadcast live
D&D 5e character sheets with full SRD compendium, spell browser, and condition tracking — tokens sync HP to sheets
Shadowrun 4e character sheets with Chummer import, d6 dice pool roller, Edge spending, and initiative tracker
GM-controlled music via YouTube (playlists or single tracks, synced to all participants)
Per-participant volume controls, noise suppression slider, and in-app mic/speaker switching
Two-way DiceCloud sync via the CarmaCloud browser extension
For Community
Discord-style channel system built into the site — campaign channels automatically created and access-gated to enrolled players
Sub-channels, direct messaging, emoji reactions, typing indicators, DM read receipts
Web push notifications including closed-tab delivery
Pinned messages, in-channel search, and moderation tools (reports, bans, audit log)
Optional Discord webhook mirroring for General/Updates channels
For Admin
Full booking and campaign management dashboard
Player management: kick, skip sessions, price changes (reductions immediate, increases require player email confirmation), PayPal reauth on campaign start
Session notes per campaign (GM private notes, shared recaps, per-player notes)
Attendance tracking with per-session chips per player
Analytics hub: traffic (cookieless, first-party), revenue, P&L with expense tracking
Google Search Console integration for real keyword and click data
Production error monitoring with grouped deduplication and email-on-first-occurrence alerting
EU candle compliance tracker (GPSR technical files, CLP labels, PCN references) for the handmade goods launch later this year
TECHNICAL ARCHITECTURE
Frontend: Next.js 16 (App Router), deployed to UpCloud VPS via pm2 with zero-downtime deploys using a build-beside-and-symlink-swap strategy — the live server is never deleted mid-build.
Backend: Supabase (PostgreSQL, Auth, Realtime), with Row Level Security hardened across six rounds of security auditing. All privileged operations use the service role server-side; the anon key never touches write paths.
Payments: Stripe for one-time checkout (embedded) and recurring subscriptions. PayPal via the native Subscriptions API — Stripe's PayPal integration doesn't support recurring billing, so this required a separate implementation with lazy plan creation, pending-booking state storage across redirects, and full webhook lifecycle handling.
Video: Agora for live video and voice, with token refresh handling for long sessions and per-participant volume routing.
Security: Nonce-based CSP with unsafe-inline removed from script-src. Atomic DB operations for seat decrements, gift card reservations, and promo code claims. Timing-safe comparisons, path traversal prevention, open redirect patching, and HTML-injection-safe email templating.
Compliance: GDPR erasure and export covering all PII stores. Finnish VAT (25.5%) applied throughout. Full toiminimi legal identity (Y-tunnus: 3572436-7) in footer, Terms, Privacy Policy, and JSON-LD structured data.
One platform replacing Calendly, Zoom, a VTT subscription, a community platform, a subscription billing service, and a manual admin process — built and shipped to production in 8 days, serving real paying clients from day one. Alli runs the sessions. I built everything else.
Finnish sole trader · Caitlyn Carmabella Nayeli · Y-tunnus: 3572436-7 · coyotesandcandles.com

