Overview
GetFlowDesk is a business operations OS for small and medium businesses. Invoices, bookings, client CRM, recent activity feed, and quick actions — all in a single multi-language dashboard. It runs at getflowdesk.app/en/ with full i18n routing via next-intl.
The Problem
SMBs manage their operations across disconnected tools: invoices in Wave or FreshBooks, bookings in Calendly, clients in a spreadsheet or basic CRM. Each tool has a different login, different UI, and no shared context — the client in your CRM isn't linked to their invoices or bookings.
GetFlowDesk unifies these workflows in a single authenticated dashboard, with all entities (clients, invoices, bookings) sharing the same database and cross-linking to each other.
Core Modules
Dashboard — Daily snapshot: today's bookings, outstanding invoices, recent client activity, quick action buttons (new invoice, new booking, add client).
Invoices — Create, send, and track invoices. Status states: Draft → Sent → Viewed → Paid → Overdue. Automated overdue reminders via Resend. PDF generation server-side.
Bookings — Schedule work sessions or client meetings. Calendar view (week/month), conflict detection, automatic confirmation emails.
Clients (CRM) — Client profiles with contact info, linked invoices, linked bookings, notes, and activity timeline. One-click actions: new invoice for this client, schedule a booking.
Recent Activity Feed — A real-time event stream across all modules: "Invoice #042 paid by Acme Corp", "New booking from Sarah Chen", "Client added: TechStart Ltd". Implemented as a Postgres trigger → Supabase Realtime channel.
Quick Actions — Persistent shortcut panel for the 5 most common operations, accessible from any module.
Architecture: i18n Routing
GetFlowDesk uses next-intl for full internationalization. The routing structure is /[locale]/[route]:
/en/dashboard,/es/dashboard,/fr/dashboard- Locale detected from URL prefix, with automatic redirect from
/to the user's preferred locale - All server components receive locale via
next-intl'sgetTranslations()function - Translation strings stored in JSON files per locale under
/messages/ - New locale requires: add
/messages/[locale].json, add locale toi18n.tsconfig — zero component changes
This pattern is the standard for multi-market SaaS. GetFlowDesk is the proof that the architecture works at the full-product level, not just a demo.
Stack
| Layer | Technology |
|---|---|
| Frontend | Next.js 15 (App Router), TypeScript, Tailwind |
| i18n | next-intl |
| Database | Supabase (Postgres + RLS + Realtime) |
| Payments | Stripe |
| Resend (invoices, reminders, confirmations) | |
| Deploy | Vercel |
Key Decisions
next-intl over next-i18next — next-intl is built specifically for Next.js App Router, with first-class support for server components and the /[locale]/ routing pattern. next-i18next was designed for the Pages Router and requires more configuration to work correctly in App Router.
Supabase Realtime for activity feed — The activity feed needs to update across browser tabs and devices in real time. Supabase Realtime broadcasts Postgres trigger events to subscribed clients over WebSocket. The alternative (polling) adds unnecessary database load for what is essentially a push-based data pattern.
PDF generation server-side — Invoice PDFs are generated on the server using a headless rendering approach (React component → HTML → PDF via a Node PDF library). Client-side generation (jsPDF) produces inconsistent results across browsers and can't handle complex layouts.
What This Proves
GetFlowDesk is a full SMB business OS with multi-language i18n routing, Supabase Realtime event streaming, cross-linked entities (clients ↔ invoices ↔ bookings), and Stripe billing — all in a production-deployed Next.js application.
If you need a business management platform, internal operations tool, or multi-language SaaS for international markets, this architecture is the foundation.
