0→1 Products

Granber

Digital voucher marketplace for restaurants, bars, cafés, and leisure venues in Portugal — built solo from zero to launch, with full ownership across UX, product, frontend, backend, and SEO.

Client

Thr33 Studio

Year

2026

Link

Visit project →
Granber

Context

Hospitality businesses in Portugal — restaurants, bars, cafés, leisure venues — operate with shrinking margins and rising customer acquisition costs. Existing discount platforms charge 25–50% commission and add friction at every step: app installs, mandatory reservations, upfront payments, multi-day delivery.

Granber was built to invert the model. A voucher marketplace where the user discovers an offer, claims a QR code, and walks into the venue — all in ~15 seconds, with no payment, no app, no reservation. Merchants pay nothing until the voucher is validated at the counter.

Problem

The discount market existed but every existing solution prioritised the platform's economics over the merchant's margin and the user's time.

For merchants, the problem was acquisition cost without guarantee. Listing on TheFork meant paying ~25% commission and competing for ranking. Running a Groupon meant ceding ~50% upfront and being locked into terms that often left the business unprofitable on the discounted ticket. None of the existing players sold a model where the merchant pays only when a paying customer actually walks in.

For users, the existing flows added steps that filtered out the casual, walk-in demand merchants needed. Discount platforms felt transactional, not exploratory.

How can I bring in new customers without paying 25% commission, without forcing them to install an app, and without taking the financial hit before they even show up?

Process

The architecture was designed around three actors with strictly separated permissions — Client, Merchant, Admin — and three subsystems: a public frontend for discovery, two Filament panels for operations, and a single voucher service that owns all claim and validation rules.

UX & Product

Mobile-first by default. The entire claim flow — discovery → offer detail → claim → QR voucher — is built to complete in under 15 seconds on a 4G connection. Account creation is deferred to the claim step itself, where Google OAuth is the primary path. The QR code is the artefact: scannable from the lock screen, validated by the merchant in one tap.

Merchant onboarding is gated through an admin approval step, but the trial is generous: the first 50 validated vouchers carry zero commission, so the merchant sees real results before any money changes hands. Maximum of 3 active offers per establishment, by design — scarcity protects quality.

Development — Frontend, Backend & SEO

Two Filament 3 panels (Admin and Merchant) running on the same Laravel application, with RBAC isolation via Spatie Permission. The admin panel handles establishment approval, commission tracking, and global oversight. The merchant panel handles offer CRUD, voucher validation by QR scan, and monthly commission reports.

AI image generation is integrated via Replicate FLUX schnell, allowing merchants to produce on-brand offer imagery from a title and category, synchronously, at ~€0.003 per image. The cost is absorbed by the platform and rate-limited silently.

Stack used for Backend Laravel 11 · PHP 8.3 · Database MySQL 8 (prod) / SQLite (dev) · Redis · Frontend Blade, Tailwind CSS, Alpine.js, Livewire 3 · Admin Panel Filament 3 (Admin + Merchant) · Auth & Permissions Spatie Permission, Breeze, Socialite (Google OAuth) · Testing Pest, PHPStan, Pint · AI Replicate FLUX schnell · Version Control GitHub · Deploy Laravel Forge → Hetzner · SEO JSON-LD (WebPage, FAQPage, LocalBusiness), sitemap, hreflang, Schema breadcrumbs.


Granber
Granber
Granber
Granber
Granber
Granber
Granber
Granber
Granber

Impact

The product is deployed to production with a seeded MySQL database. All admin and merchant flows are live; the public frontend is in active polish.

  • 3 actors with strictly separated roles — Client, Merchant, Admin
  • 2 Filament panels running side-by-side with RBAC isolation via Spatie Permission
  • 9 database tables covering users, districts, categories, establishments, offers, vouchers, commissions, and pivots
  • 30+ business rules centralised in VoucherService and config — commission rate, trial accounting, claim eligibility, validation ownership, state transitions
  • 20+ prompts shipped end-to-end — from foundation migrations through go-live preflight, every feature TDD-driven with Pest
  • AI image generation integrated via Replicate FLUX schnell (~€0.003/image, synchronous, rate-limited)
  • PWA-ready with manifest, multi-resolution favicons, lighthouse budget enforced, GA4 + GTM + Meta Pixel with EU Consent Mode v2

The product goes beyond a simple discount platform — it is a trust and commission infrastructure designed to make hospitality discounts profitable for both sides of the marketplace.

From a technical standpoint, Granber demonstrates full ownership of a multi-tenant SaaS product: permission architecture across three roles, two Filament panels, a single transactional service for the entire voucher lifecycle, RGPD-compliant data handling from the schema up, and a consistent design system built from scratch.

Key Learnings

Frictionless is a discipline, not a feature

Every step removed from the claim flow was a decision defended against the easier path of adding a checkbox. The 15-second target shaped database design, OAuth integration, QR rendering, and copy — not just the visual UI.

AI image generation as design infrastructure

Replicate FLUX schnell turned image production from a per-merchant blocker into a commodity — synchronous, sub-three-second, ~€0.003 per image. Treating it as infrastructure rather than a feature shifted the design system from "what images do we have" to "what images do we need".

Prompt-driven development scales solo work

Numbered prompt files, a bash runner with automatic git checkpoints, and TDD enforced per engineering pillar produced predictable progress without scope drift. The spec became the deliverable; the code became the artifact of executing it.


Have a similar challenge?

Let's talk →