PutThrough Product engineering studio
Book a build call

Service 03

Web application development

Most of what we repair was never wrong so much as unfinished. This is the same work, done in the right order.

Prefer to write? Send your requirements

A new application, a substantial feature on an existing one, or a rebuild that moves you off a platform you have outgrown. We build the product surface and the layer underneath it at the same time — access rules, payment correctness, migrations, deploys and monitoring are part of the work rather than a later rescue.

Product

  • Application UI: dashboards, forms, flows, empty and error states
  • Authentication, accounts, roles and multi-tenant separation
  • Payments and subscriptions wired to the provider as source of truth
  • Search, filtering and the pagination that stops it falling over
  • Admin tooling, so support does not need an engineer with database access

Backend

  • APIs, background jobs and scheduled work
  • Third-party integrations, with the failure paths handled
  • File handling and storage with per-object access rules
  • Server-side validation and authorization on every write
  • Webhooks in both directions, verified and idempotent

Data

  • Schema design, migrations in the repository, applied in CI
  • Indexes sized to the queries you will actually run
  • Backups with a restore that has been executed at least once
  • Separate environments with no path from staging to live data

Shipping

  • CI deploys on merge, with a rollback that has been tested
  • Error tracking, uptime checks and structured logging
  • A written handover so the next engineer does not need us

Built with

  • TypeScript
  • React
  • Next.js
  • Astro
  • Node
  • Python
  • Postgres
  • Supabase
  • Vercel
  • Cloudflare

What this is not

  • Not design or branding. We build against a design you have, or a plain interface built from a component library — we do not art-direct.
  • Not a marketing site. A brochure site is a job for a template and a content tool, and we will tell you so rather than bill for it.
  • Not open-ended. Scope is agreed in writing before the first commit, and work outside it is a separate quote.

01Self-assessment

Signs this is the work you need

Things that are either true of your situation or not. If most of these are true, a build is the right purchase rather than a rescue.

  • You have a clear idea of the product and no application yet, or only a prototype you intend to replace.
  • You know who the users are and roughly what each type of user is allowed to do.
  • The product will charge money, or hold data that belongs to more than one customer.
  • You have outgrown a no-code or builder platform and want to own the code.
  • You need an internal tool your own team will use daily, and support currently means somebody running SQL.
  • You have designs, or you are comfortable with a plain interface built from a component library.
  • You can name the one thing the product must do on day one, and separate it from everything you want by day ninety.
  • You would rather have a fixed price against a written scope than an hourly rate and an open end.

02Approach

How we approach it

The second layer is most of the work

Every application has a visible layer — screens, forms, the thing you demo — and a second layer underneath it: who is allowed to do what, what happens when two people edit the same record, how money reconciles, what occurs when a third-party service is down, how you find out something broke, and how you get back to a working state afterwards.

The visible layer is a fraction of the effort and nearly all of the perceived progress. That mismatch is why software estimates go wrong, and it is why a tool that can produce a working demo in an afternoon has not produced something you can charge for. The demo is not eighty per cent done. It is the part that was always going to be quick.

We build both layers together because retrofitting the second one is dramatically more expensive than including it. Tenant isolation designed in is a column and a policy; tenant isolation retrofitted is every query, every policy and every test, on a live database with customers on it.

Boring choices, made early

The decisions that matter most in a new build are unglamorous and nearly all of them are made in the first week: how the schema models your domain, where authorization is enforced, whether tenancy exists, how migrations run, what the environments are.

Each of these is cheap to decide correctly at the start and expensive to change later, which is the opposite of the visible features people spend the kickoff discussing. We would rather spend the first conversation on the data model and the permissions matrix than on which shade the primary button is.

A related principle: one application, one database, until you have a measured reason to do otherwise. Splitting a system into services before you know its seams buys you distributed-systems problems in exchange for an architecture diagram.

Admin tooling is a feature, not overhead

The single most reliably forgotten part of a new product is the interface your own team needs: refund a customer, correct a record, unblock an account, look up why somebody is seeing an error. Left out, every support request becomes an engineer running SQL against production.

That is a bottleneck, a security problem and a data-integrity risk at the same time — direct database edits skip whatever validation and side effects your application does. It is usually a meaningful slice of the total build, and worth planning for rather than discovering.

Working software, in stages you can stop between

Long projects fail less often because of bad code than because everybody discovers in month four that they wanted something different. We split larger builds into milestones that each end at something deployable, with a decision point between them.

That means you can stop, change direction, or take the work elsewhere at a natural boundary rather than at whatever point the relationship becomes difficult. It also means the estimate is being tested continuously against reality instead of being defended until the end.

The visible layer and the layer underneath it A small block labelled what you demo sits above a much larger block containing access control, payments, data integrity, operations and admin tooling. What you demo Screens, forms, the happy path the quick part What a working prototype proves Access control Payments that reconcile Migrations and backups Deploys and rollback Monitoring and alerts Admin tooling Failure paths: concurrency, network loss, partial writes most of the work
The demo is not eighty per cent done. It is the part that was always going to be quick.

03Choices

Decisions you will have to make

Postgres or Firestore?

Postgres (including Supabase and Neon)
Your data has relationships, you will need to ask questions of it later, and you want constraints the database enforces rather than hopes for. True for most business software.
Firestore or another document store
The shape is genuinely document-like, the access patterns are known and narrow, and real-time sync to many clients matters more than query flexibility.

Where we start Postgres. It is easier to add document-shaped columns to a relational database than to add relational integrity to a document store, and per-read billing models make exploratory queries expensive exactly when you most want to run them.

Client-to-database, or an API layer of your own?

Direct from the browser
Small surface area, simple permissions, speed of delivery matters most. Row-level security is then the only thing between a public key and your data.
Your own server layer
You have business rules, side effects, third-party calls, or anything you would want to log and rate-limit.

Where we start A server layer for anything with rules, and direct reads for things that genuinely are just reads. Database policies stay on regardless, as the floor that cannot be bypassed.

How should multi-tenancy work?

Shared schema with a tenant column
The common case. Cheap, simple, and safe provided every table has a policy and every policy has a test.
Schema or database per tenant
Contractual or regulatory isolation, or a small number of large customers with very different data volumes.

Where we start Shared schema with enforced policies. The per-tenant options sound safer and cost you migrations across N databases forever — a real operational burden that should be chosen deliberately, not defensively.

Build authentication, or buy it?

Buy
Almost always. A managed provider gives you sessions, refresh, password reset, MFA and social sign-in, all maintained by people who do nothing else.
Build
A genuinely unusual requirement no provider supports, and you have accepted the ongoing maintenance.

Where we start Buy. Authentication is the area where a subtle mistake is both most likely and most costly, and where the off-the-shelf option is closest to free.

Server-rendered or single-page?

Server-rendered (Next.js, Astro)
Content needs to be indexed, the first paint matters, or you would rather keep data fetching and auth on the server.
Client-heavy app
It is a tool behind a login where interactivity dominates and search engines are irrelevant.

Where we start Server-rendered by default, with rich client behavior where a screen earns it. Most products have both a public surface that needs to be found and an application behind a login.

04Price

What a web build actually costs, and why

We do not publish a price for new builds, because they have no typical size and a published number would only mean padding it to cover the worst case. What we can do is tell you honestly what moves it, so you can shape the scope before you ask.

How it is priced Quoted after a scoping call, as a fixed price against a written scope. No hourly rate, and no estimate that moves once you have accepted it. Larger builds are split into staged milestones you can stop between.

Number of distinct user roles

The largest hidden multiplier. Two roles is a boolean; five roles with overlapping permissions is a matrix that has to be designed, enforced and tested in every direction.

Multi-tenancy

A yes/no that changes the shape of everything: schema, policies, tests, admin tooling and billing.

Payments

One-off charges are modest. Subscriptions bring proration, upgrades, downgrades, failed renewals, refunds, dunning and tax — each a real path with real states.

Third-party integrations

Each one is a failure surface: rate limits, outages, schema changes and retries. Count them honestly when scoping.

Migrating existing data

Often underestimated. Real data is messier than the schema suggests and the cleaning is the work.

Real-time features

Live collaboration, presence and instant updates are a different architecture from request/response, not a setting.

Admin tooling

Frequently forgotten and frequently a meaningful share of the total. Cheaper to plan than to bolt on.

Whether a design exists

Building to a design is faster than inventing one. We can work from a component library, but that is a decision, not a default.

Compliance obligations

Audit logging, data residency, retention and export duties are specific engineering work, not paperwork.

05Process

How a project runs

  1. Scoping call

    60 minutes, free

    We go through what the product does, who uses it, what the roles are, whether tenancy exists, and what has to be true on day one versus day ninety.

    What we need
    Whatever you have — a document, a prototype, a competitor you are pointing at.
    What you get
    A straight answer about whether this is work we should be doing.
  2. Written scope

    Two to four business days

    We write down what is being built, in what order, what is explicitly excluded, and the data model and permissions the rest depends on.

    What we need
    Answers to whatever the call left open.
    What you get
    A scope document and a fixed price, with milestones for anything sizeable.
  3. Build

    Per milestone, agreed in the scope

    Branches and pull requests you review, each milestone ending at something deployable. Access rules, migrations and monitoring land with the features rather than after them.

    What we need
    Someone available to review and to answer product questions within a day or so.
    What you get
    Working software at every milestone boundary, on your infrastructure.
  4. Handover

    Half a day

    A written record of the architecture and the decisions behind it, a walkthrough of deploys and monitoring, and a restore rehearsal.

    What we need
    An hour of whoever will own it next.
    What you get
    Documentation, and no dependence on us.

06Deliverables

What you actually end up with

A written scope

What is being built, in what order, and what is explicitly excluded — agreed before the first commit and used as the acceptance criteria at the end.

The data model and permissions

The schema and the matrix of who may do what, written down before the screens are built, because both are expensive to change later.

Working software at every milestone

Each milestone ends at something deployable, with a decision point after it — so you can stop, change direction or take the work elsewhere at a natural boundary.

Migrations in the repository

The schema reproducible from zero and applied in CI, so environments cannot drift and the database can be rebuilt by anyone.

Admin tooling

The interface your own team needs to refund, correct, unblock and investigate — so support does not require an engineer with production database access.

Deploys, rollback and monitoring

CI deploys on merge, a rollback that has been executed once, error tracking with releases, and uptime checks on the paths that matter.

Architecture documentation

Not a diagram for its own sake — the decisions taken and why, so the next engineer understands the system rather than reverse-engineering it.

07Stack

What we build it with

Deliberately conservative. A stack that is boring and widely known is a stack you can hire for after we are gone, and that matters more than any individual technical merit. TypeScript end to end, Postgres unless something argues otherwise, and a framework that renders on the server.

Web Primary here

Frontend and full-stack

TypeScript everywhere, and a framework that renders on the server unless the product is purely an application behind a login.

We default to

  • TypeScript
  • React
  • Next.js
  • Astro
  • Tailwind CSS
  • Vite

We also work in

  • JavaScript
  • Remix
  • SvelteKit
  • Vue 3
  • Nuxt
  • shadcn/ui
  • Radix UI
  • TanStack Query
  • TanStack Table
  • React Hook Form
  • Zod
  • Zustand
  • Redux Toolkit
  • Framer Motion
  • MDX
  • Storybook
  • Vitest
  • Playwright
  • Testing Library
  • ESLint
  • Prettier
  • Recharts
  • D3
API Primary here

Backend and services

Boring, typed and synchronous until something measurably needs to be a queue. Most systems need fewer moving parts than they are given.

We default to

  • Node.js
  • Python
  • REST
  • tRPC
  • Background jobs
  • Queues

We also work in

  • Hono
  • Fastify
  • Express
  • NestJS
  • FastAPI
  • Django
  • GraphQL
  • OpenAPI
  • WebSockets
  • Server-sent events
  • BullMQ
  • Celery
  • Inngest
  • Trigger.dev
  • Cron and scheduled work
  • Stripe
  • Paddle
  • Razorpay
  • Resend
  • Postmark
  • Twilio
  • Webhooks in both directions
Data Primary here

Databases and storage

Postgres unless there is a specific reason otherwise, migrations in the repository, and a restore that has been executed rather than merely configured.

We default to

  • Postgres
  • Supabase
  • Redis
  • Migrations
  • Backups and restore

We also work in

  • Neon
  • PlanetScale
  • MySQL
  • SQLite
  • Turso
  • Firebase Firestore
  • Upstash
  • Drizzle ORM
  • Prisma
  • Kysely
  • pgvector
  • Row-level security
  • Point-in-time recovery
  • Meilisearch
  • Typesense
  • Elasticsearch
  • S3
  • Cloudflare R2
  • Read replicas
  • Connection pooling
App

Mobile

Expo unless the product is the platform experience. One codebase is worth a great deal when the maintenance bill outlasts the project.

We default to

  • React Native
  • Expo
  • EAS Build
  • Swift
  • Kotlin

We also work in

  • Capacitor
  • Flutter
  • SwiftUI
  • Jetpack Compose
  • Expo Router
  • React Navigation
  • Reanimated
  • MMKV
  • WatermelonDB
  • StoreKit
  • Google Play Billing
  • RevenueCat
  • APNs
  • Firebase Cloud Messaging
  • Expo Notifications
  • Fastlane
  • App Store Connect
  • Google Play Console
  • Detox
  • Maestro
  • Privacy manifests
Ops

Infrastructure and observability

Managed platforms until scale or cost argues otherwise. The parts we insist on are a deploy you can roll back and an error that reaches a human.

We default to

  • Vercel
  • Cloudflare
  • Docker
  • GitHub Actions
  • Sentry

We also work in

  • AWS
  • Cloudflare Workers
  • Cloudflare R2
  • Cloudflare D1
  • Fly.io
  • Railway
  • Render
  • Terraform
  • Nginx
  • Caddy
  • GitLab CI
  • Grafana
  • Prometheus
  • Axiom
  • Better Stack
  • Checkly
  • Uptime checks
  • Structured logging
  • Staged rollouts
  • Tested rollback
AI

AI systems

Hosted models behind an interface you can swap, with the eval set deciding which one you use this quarter rather than a contract.

We default to

  • Claude
  • OpenAI
  • MCP
  • Evals
  • Tracing
  • Cost control

We also work in

  • Gemini
  • OpenRouter
  • LiteLLM
  • Vercel AI SDK
  • Anthropic SDK
  • Tool and function calling
  • Structured output
  • Prompt caching
  • Batch APIs
  • Model routing
  • pgvector
  • Qdrant
  • Pinecone
  • Chroma
  • Hybrid retrieval and re-ranking
  • Langfuse
  • LangSmith
  • Braintrust
  • Helicone
  • Ollama
  • vLLM
  • OAuth 2.1 for MCP

Split into what we default to and what we also work in. If your system is outside this, tell us on the call — we would rather say no than learn a stack on your budget.

08Pitfalls

Mistakes we see most

Treating the demo as most of the build

The visible layer is a fraction of the effort and nearly all of the perceived progress. Budgets set from a working prototype are usually set from the cheapest part of the work.

Deferring the permissions model

Roles added later touch every query and every screen. Deciding who can do what is a first-week conversation, not a second-phase one.

Changing the schema by hand

Without migrations in the repository, environments drift and nobody can rebuild the database from scratch — including whoever has to recover it.

Leaving admin tooling out of scope

Every support request then needs an engineer with production database access. It is a bottleneck and a second security problem at the same time.

Adding services before there are seams

Splitting a young system into services buys distributed-systems problems in exchange for an architecture diagram. One application and one database until measurement says otherwise.

No indexes, then a mysterious slowdown

Everything is fast with fifty rows. The queries that will hurt are predictable from the access patterns, and the indexes are cheap to add before rather than during an incident.

Validating only in the form

Client-side validation is a courtesy to honest users. The server has to assume the request came from anywhere and check accordingly.

09Honestly

When you should hire somebody else

  • You need a marketing site or a blog. A template and a content tool will be faster and cheaper, and we will say so.
  • You need a design partner. We build to a design or to a component library; we do not art-direct a brand.
  • You want to hire by the hour and direct the work day to day. We sell fixed scopes, which is a different relationship.
  • The requirements are still moving. Scoping a build that changes weekly is the most expensive way to discover what you want.

10Questions

Questions

Something we haven’t covered?

Ask on a call
01 How much does it cost to build a web application?

We quote a fixed price after a scoping call rather than publishing a number, because builds have no typical size. What we can tell you is what moves it: the number of distinct user roles, whether the product is multi-tenant, whether it takes subscription payments, how many third-party systems it integrates with, whether existing data has to be migrated, and whether admin tooling is in scope. Those six factors account for most of the difference between two projects that sound the same in a sentence.

02 How long will it take?

Anything substantial is split into milestones that each end at something deployable, so the useful answer is per milestone rather than for the whole thing. The scope document sets those out before you commit. A small, single-tenant application with one user role and no payments is weeks; a multi-tenant product with subscriptions, several integrations and admin tooling is months.

03 Do you work with my existing team?

Yes, and it is common. We work in your repository in branches and pull requests, so your engineers review what we do and can pick it up at any point. Where there is an existing team we would rather agree a clear boundary — a service, a surface, a milestone — than interleave, because two teams editing the same files without a boundary is slower than either alone.

04 Can you take over a project another developer started?

Usually, and we start with an audit rather than a quote. The honest reason is that inheriting a codebase blind means either padding the estimate heavily or discovering the real state halfway through, and neither is good for you. The audit tells us both what condition it is in, and it tells you something useful even if you then hire somebody else.

05 What technology will you use?

TypeScript, React with Next.js or Astro, Node or Python on the server, and Postgres — often via Supabase or Neon — for data, deployed to Vercel or Cloudflare. We are deliberately conservative about this: a stack that is boring and widely known is a stack you can hire for after we are gone, which matters more than any individual technical merit.

06 Do I own the code?

Yes, entirely, and it lives in your repository on your accounts from the first commit. There is nothing to transfer at the end and no proprietary layer of ours left behind. Our own pre-existing tools and templates stay ours, and you get a perpetual license to anything of that kind embedded in the work.

07 What if I already have designs?

That makes it faster and we would rather you did. We build to Figma or to whatever exists. If there are no designs, we build a plain, consistent interface from a component library and say plainly that it is functional rather than distinctive — which is often the right trade early, and is always better than us improvising a brand.

08 Will it be secure?

It is built with the things we are usually hired to retrofit: authorization enforced on the server, database policies with tests that assert cross-tenant access fails, secrets that never reach the client bundle, validated input on every write, and rate limiting where it matters. What we do not do is issue a security certificate or run a penetration test — those are a different discipline, and if you need one for a customer or an auditor you should engage a specialist firm.

09 What happens after launch?

You get a written handover covering the architecture, the decisions behind it, how deploys and rollbacks work, and what the monitoring will tell you. From there you can run it yourself, hand it to your own team, or take a care retainer for monitoring, dependency updates and small changes. Plenty of projects need no retainer at all.

10 Can you rebuild an app we outgrew on a no-code platform?

Yes, and it is a common reason people come to us. The work is usually less about the application code than about the data: getting it out cleanly, modelling it properly, and moving customers across without a gap. We would scope that migration explicitly rather than folding it into a build estimate, because it is frequently the larger half.

11Also

The other services

Rescue & Hardening

Your AI-built app made safe to launch: access control, payments, deploys and monitoring.

Mobile & Store Launch

Your app packaged, compliant and submitted — through review, not just uploaded.

App development

Mobile apps built to ship — iOS and Android, through review and into the stores.

Tell us what you want built.

A scoping call costs nothing and ends with a written scope and a fixed price. If what you need is outside what we do, we will say so on the call.

Prefer to write? Send your requirements

What do you need?

What it should do, who will use it, the must-haves, and any links. A few sentences is plenty.

Budget, if you have one in mind
When would you like to start?