Back to Portfolio
Prizely — Multi-Tenant Gamified Lead-Gen SaaS

Prizely — Multi-Tenant Gamified Lead-Gen SaaS

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.

Technologies

Laravel 12 PHP 8.5 Tailwind CSS GSAP Stripe MySQL Multilingual (el/en) JSON-LD / SEO WCAG 2.2 AA Responsive Design Kiosk Mode Email Automation

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.