WorkTAMO-HAUS

TAMO-HAUS

A complete business platform, delivered so the client could run it without me.

Start a projectLive site ↗

Type
Client project — business platform
TAMO-HAUS — interface overview
Endpoints
~190
Admin tabs
18
Delivered in
Under 4 months

The outcome

The client can take on more clients at once than before. The work that used to consume the owner's hours — onboarding, invoicing, chasing payments, updating content, handling files — either runs itself now or takes minutes instead of an afternoon, and the capacity that was going into administration goes into clients instead. That is also the honest argument for building the admin panel wide rather than shipping a website and a maintenance contract: the platform's value is not that it looks good, it is that it removed the ceiling on how much business the owner could personally handle.

An 18-tab admin control panel, a client portal, Stripe subscriptions, a media pipeline, analytics, bilingual content, and background automation — around 190 endpoints, delivered in under four months. Live at tamohaus.com.

What the client needed

The brief was not "build me a website". It was what a real business actually needs: a public presence that sells, a portal their clients log into, payments that recur without chasing invoices, and — the part most freelancers skip — an admin panel comprehensive enough that the business runs itself without the developer on retainer forever. That last requirement shaped everything. A platform the client cannot operate is a platform they have to keep paying someone to operate.

What I built

The admin control panel — 18 tabs. Content, services, media, clients, orders, subscriptions, analytics and settings, in one place, behind role-gated access. It includes a visual content editor, so the client edits their own site copy and layout instead of sending change requests. That decision deliberately reduced my own future billable work, which is the point: a client who can self-serve renews their maintenance plan because it works, not because they are trapped.

The client portal. Accounts, roles and workflows — the authenticated surface where the business's own customers manage what they bought. Auth runs on Supabase with SSR session handling and middleware-enforced route protection, so an unauthenticated request never reaches a protected page in the first place.

Payments and subscriptions. Stripe, handling both one-off purchases and recurring commitment-based subscriptions. Recurring billing is where business platforms quietly break — proration, failed payments, plan changes, cancellations mid-cycle — so it is built against Stripe's primitives rather than reimplemented on top of them.

The media pipeline. S3 with presigned URLs, so uploads go direct from browser to storage and never proxy through the application server. A media-heavy platform that routes every upload through its own backend turns a marketing page into an outage, and presigned URLs mean the server never holds credentials that could leak.

Background automation. A Postgres-backed job queue running the recurring work: scheduled tasks, cleanup, and the compliance jobs below. Choosing a queue that lives in the database the platform already runs means no extra infrastructure to pay for, monitor, or explain — one less line on the hosting bill and one less thing that can fail independently.

Legal and compliance, built in. Most projects treat this as a footer link; here it is functional. Versioned legal documents with content hashing, so the build detects when a policy has changed; a reconsent flow that re-prompts existing users when terms materially change, with consent logged as an audit trail; and account deletion and purge pipelines — real right-to-be-forgotten handling, not a support-inbox promise.

Analytics, monitoring and tests. Chart-driven analytics in the admin panel, Sentry for error tracking, schema validation on inputs, and an actual test suite. The platform reports its own health rather than waiting for the client to notice.

The decisions that actually mattered

Stack