Moveis.pro
Multi-tenant SaaS for furniture stores, with CRM and WhatsApp/Instagram operations.
Full-stack development, end to end · built in under 45 days
- models
- 40
- apps
- 3
01 Problem
Furniture stores sell over WhatsApp and Instagram with no CRM: conversations get lost, salespeople don't know who has already been helped, and each store is a separate customer that should never see another store's data. What was missing was a SaaS that handled the commercial side for real inside each store, without mixing tenants.
02 Architecture
There are 3 applications: a Fastify API, a Next.js management panel, and a PWA for salespeople to use on the shop floor. The data model has 40 Prisma models. Deployed on a VPS with Nginx, with a CI pipeline that enforces a test coverage threshold before allowing a merge.
03 Hard decisions
Multi-tenant isolation
Each store is an isolated tenant: every query carries the tenant scope, and the data model was designed so an application bug cannot cross data between two stores — the same authorization concern as OSCapstack, solved at the schema level instead of RLS because the database here is Prisma over a shared Postgres, not Supabase.
Per-instance conversation assignment to salespeople
Each store can run more than one WhatsApp/Instagram instance, and a conversation landing on an instance needs to be assigned to the right salesperson without two people answering the same customer. Assignment happens per instance, not globally, because that is how the actual store organizes its team.
Offline-first PWA for in-store use
Salespeople use the PWA on the shop floor, where Wi-Fi drops. The interface works offline and syncs once the connection returns, instead of freezing on an error screen in the middle of serving a customer.
Deploy pipeline with a separate prod/dev policy
CI enforces a test coverage threshold before allowing a merge, and the VPS deploy with Nginx follows a policy that separates what goes to production from what stays in development — no merge reaches production just because it passed the build.
04 Stack
- TypeScript
- Next.js
- Fastify
- Prisma
- PostgreSQL
- PWA
- Docker
- Nginx
05 What changed
The system answers the customer, closes the order, sends it to the factory and tracks stock — all in the same place where the conversation started. The sale stopped changing tools at every step, which is where the handover used to get lost, and where the salesperson's time went.