Prizely — Multi-Tenant Gamified Lead-Gen SaaS
Overview
We designed and developed Prizely, a multi-tenant SaaS platform in Laravel 12 that turns lead capture into a branded game experience. Merchants register, create one or more brands (each with its own slug, 2-color palette, logo, and up to 8 rewards with images), configure win percentages per reward, and activate Lucky Wheel or Scratch-to-Win games. Each brand lives at a clean /{brand-slug} URL with its own visual identity — the player sees only that brand. Before playing, leads fill in a name, email, and phone form (GDPR consent checkboxes configurable per brand); duplicate detection by email+phone prevents replay abuse. Winners receive an automated reward email with optional redemption codes. Credit packs are purchased via Stripe Checkout (metered per-play billing), with a self-service billing history page. The admin dashboard surfaces plays-per-day charts, reward distribution stats, conversion rates, and a filterable, exportable leads table (.xlsx). A sandboxed test-games mode lets owners preview games without consuming credits or logging leads. For physical events, kiosk mode locks the device to a single brand with an owner-only unlock flow. The platform is bilingual (Greek/English), WCAG 2.2 AA compliant, and includes GSAP scroll animations, SEO with JSON-LD, per-page hreflang alternates, and an llms.txt for AI crawler visibility.
Challenges
Designing a multi-tenant architecture where each brand maintains its own visual identity (colors, logo, rewards) under a single Laravel install, building two distinctly different game engines (wheel vs. scratch) that share a common play/reward pipeline, and implementing metered Stripe billing that deducts credits per play while keeping latency invisible to the player.
Solutions
Used Laravel's tenant-agnostic routing with {brand} wildcards and policy-based ownership gates — one codebase, infinite branded storefronts. Built each game as a self-contained Blade/Alpine component feeding into a shared PlayController that validates credits, prevents duplicates, resolves rewards via weighted random selection, and dispatches queued confirmation emails. Stripe Checkout sessions carry metadata (pack_id, brand_id, user_id) fulfilled via webhook; a credit-balance cache column avoids per-play DB writes. Kiosk mode uses a session flag + unlock PIN flow with rate-limited attempts. The admin dashboard uses Chart.js for plays/reward distribution and a filterable DataTables-powered leads table with .xlsx export.
Gallery

Home Page — What It Does, Who It Is For and a Free Start

How It Works — A Brand, Its Prizes and a Link in Three Steps

The Games — Lucky Wheel and Scratch-to-Win on One Lead Form

Kiosk Mode — One Tablet, One Brand, a Fresh Game for Each Visitor

Q&A — The Questions a Marketer Asks Before Signing Up

Pricing — Pay per Play, With the First 100 Free

Contact — Three Fields or a Direct Email, Answered Within Two Days

Brand Page — In the Brand's Own Colours, With a Choice of Game

Home on a Tablet — The Pitch and Four Proof Points at a Glance

About — The Mission Behind Prizely, Without the Jargon

Use Cases — Shops, Cafés, Expos and QR Campaigns, One Card Each

Lead Form — Four Fields Between the Player and the Prize

Home on a Phone — The Same Pitch, Stacked for One Hand

Mobile Menu — Every Page and the Sign-Up, a Tap Away

The Games on a Phone — Each One Explained in a Single Card

Brand Page — What a Player Sees After Scanning the QR Code

Lead Form — The Player's Details, Captured Before the Game
