HomeServicesWorkAboutContactBook a Consultation
Home/Work/ROOM
SaaS Platform

ROOM

A form builder that grew into a ledger. ROOM started as a general-purpose alternative to Google Forms and Typeform, and found its sharpest use in Nigerian cooperative societies.

Role
Product engineering
Timeline
2 months to v1, ongoing
Stack
Next.js, React, TypeScript, Prisma, Postgres, Paystack
ROOM: form and survey builder

The challenge

ROOM began in January 2025 without a grand origin story: a general-purpose form and survey builder, an alternative to Google Forms and Typeform for teams that wanted their own.

The interesting part came later. What surfaced in use was not a market for another survey tool but something more specific. Nigerian cooperative societies were already running ROOM to track member contributions. In 2026 the product pivoted toward Passbook, and the engineering problems changed with it.

What we built

ROOM is a drag-and-drop form builder: over forty field types, conditional logic, real-time response analytics, exports to Excel, CSV and PDF, role-based team permissions and an API, across a free tier and a paid tier.

It runs on Next.js App Router and React with TypeScript, Postgres through Prisma, and Paystack for payments, chosen over Stripe for a Nigerian user base.

Key technical decision

Never delete a field that has answers

The hard part of a form builder is not the drag-and-drop. That is standard react-dnd. The hard part is what happens when someone edits a form that already has responses.

Delete a field and you orphan every historical answer attached to it. Keeping a full version of every schema on every edit is one answer to that, and a heavy one. ROOM takes a simpler line: an answered field is never removed. It is hidden and moved out of the way, so every historical answer keeps its link to the field that produced it and old responses stay readable years later.

The form owner sees a field disappear. The data underneath never moves.

Key technical decision

A formula engine that never calls eval

Passbook needs totals that update as you type, and totals that are correct when they are saved. Those are two different requirements, and the obvious solutions to each conflict.

Run formulas in the browser and you get instant feedback you cannot trust. Run them only on the server and you get truth with a round-trip on every keystroke. The usual shortcut for the client half is eval, which hands arbitrary code execution to whatever someone types into a formula box.

ROOM has a hand-written tokeniser and recursive-descent parser instead, with no eval anywhere. The same engine runs in the browser for instant totals and on the server as the source of truth, so the two agree by construction rather than by discipline.

That only works because of a constraint chosen up front: formulas are held to row-level scope. No cross-row references, no whole-sheet dependency graph. The limit is what keeps the engine small enough to run identically in two places.

Outcome

ROOM runs in production across a free tier and a paid tier, with Nigerian cooperative societies using Passbook to track member contributions.

Version one took two months. The most recent release took two weeks.

Have a project in mind?

Let's build your next product

Tell us what you are working toward and we will help you map the fastest, most reliable path to get there.