Fátima has run a neighbourhood furniture business for years with no website — just a Facebook page gone dormant since February 2022. She resells factory furniture, delivers it, and assembles it, and every sale already happened over WhatsApp. This was a paid client project on a tight budget where the demo had to come before the money: a working site built on her real brand and real stock, shown to her on her phone, was what won the job.
— Case study 09
F&A Móveis
A furniture catalogue where every measurement on the page is the real one

project overview
A catalogue site for a Rio de Janeiro furniture shop that sold entirely over WhatsApp from a dormant Facebook page. No cart, no checkout — every product page ends in a pre-filled WhatsApp message to the owner, and every centimetre shown on it is a real, sourced measurement.
shipped outcome
Live at fa-moveis.vercel.app with 13 real products — no illustrative filler left on the site — 3 from her own D'Doro line and 10 from a second Novo Horizonte supplier, priced against real supplier sheets and her own WhatsApp confirmations. 10 of the 13 carry a confirmed price; the remaining 3 show an honest 'Consulte o preço' rather than a guess. A production build measured Lighthouse 93 performance and 100 accessibility on /produtos, CLS 0, every product image under 32 KB against a 180 KB budget.
- Role
- Full-stack product engineering
- Timeline
- Ongoing
- Year
- 2026
- Team
- Solo
The build is deliberately backend-less: a typed TypeScript catalogue in content/, no CMS, no database, no monthly bill. Every measurement is stored as a number in centimetres and formatted at the edge, never hand-typed as a string, and every wa.me link is built by one function reading her real phone number from a single content module. Nothing outside lib/catalog/source.*.ts is allowed to import a Shopify type, which is what makes a later Shopify upsell a one-module swap instead of a rewrite. Where a price wasn't confirmed, the page says so — 'Consulte o preço' — instead of shipping a plausible number.
Live at fa-moveis.vercel.app with 13 real products — no illustrative filler left on the site — 3 from her own D'Doro line and 10 from a second Novo Horizonte supplier, priced against real supplier sheets and her own WhatsApp confirmations. 10 of the 13 carry a confirmed price; the remaining 3 show an honest 'Consulte o preço' rather than a guess. A production build measured Lighthouse 93 performance and 100 accessibility on /produtos, CLS 0, every product image under 32 KB against a 180 KB budget.
— Interface evidence
The product, not a placeholder
These are the verified interface captures from the project build. Scroll inside taller frames to inspect each complete page.



— Delivery process
From operating constraint to shipped system
The work is sequenced around risk. Domain rules and failure states come before interface polish; automation arrives before handoff.
Scaffold on her real brand
Name, mark, the rose accent (#A87C7C), and a Didone serif were already hers, evidenced in her own Facebook video — the job was bringing an existing identity onto the web with better craft, never redesigning it from zero.
A typed catalogue, no CMS
content/produtos.ts, categorias.ts, ambientes.ts, and loja.ts became the single source of truth; components read only the domain Produto type, never a raw content import.
Real stock, real prices
The 27-product illustrative catalogue used to demo the concept was removed once real supplier stock replaced it — 3 D'Doro pieces from Fátima's own catalogue QR codes, 10 Novo Horizonte pieces priced from a supplier sheet with the same freight-and-tax markup used on an earlier sibling project.
The real-device checklist
A pass against the live deployment, not localhost, caught two defects invisible from a dev server: every WhatsApp message was shipping a literal localhost URL, and /produtos had no Open Graph card.
— System architecture
Clear boundaries, explicit responsibilities
Each layer has one job and a narrow contract. That keeps external services replaceable and product behavior testable.
roupeiro mônaco plus
240 × 230 × 55
l × a × p, em cm reais
preço
R$ 3.073 à vista
catálogo / 13
Next.js App Router
Server-rendered catalogue, product, and home routes — zero client components in the shipped build.
content/*.ts
Typed product, category, and store data — the only source any page or component is allowed to read.
lib/whatsapp.ts
The one wa.me builder used by every product CTA, reading the phone number from content/loja.ts.
Vercel
Fully static, no database, no auth — a production build fails on purpose if SITE_URL would resolve to localhost.
— What shipped
Product capabilities
Real measurements, formatted at the edge
Every dimension is stored as a number in centimetres and rendered as 'L × A × P' — never typed as a display string, never rounded by hand.
Honest pricing
10 of 13 products show a confirmed price; the other 3 say 'Consulte o preço' instead of a plausible guess.
One WhatsApp builder
Every product page, from any category, resolves through the same pre-filled wa.me link — no second place composes that URL.
— Engineering pressure
Challenges resolved
A localhost URL that shipped to production
An unset SITE_URL fell back silently to localhost, so the deployed site's own WhatsApp messages carried a dead link — caught by a real-device pass against the live URL, not the dev server, and fixed by failing the build outright on that exact misconfiguration.
Sourcing prices for stock that wasn't hers to guess
Novo Horizonte's 10 pieces needed real supplier-sheet numbers and the same freight-plus-tax markup logic already used on a sibling project — 3 items still show 'Consulte o preço' because that number wasn't confirmed yet, not because it was estimated.
Retiring the demo catalogue without losing the pitch
The original 27-item illustrative catalogue existed to win the job before real stock was ready; removing it once 13 real products existed meant the site never quietly kept selling furniture that wasn't actually in stock.
verified project destinations
next transmission
Need a system this deliberate?
Bring the operating problem. We will shape it into a clear product brief and a buildable next step.
Start a project