Grid
Scheduled Sep 29, 2026A relational database your operations team can build in.
Replaces
- Airtable · Formagrid, Inc. — $45 per seat per month (Business), about $216,000/yr at 400 seats
- Smartsheet · Smartsheet Inc. — $24 per seat per month (Business), about $115,200/yr at 400 seats
Rented, per year
$216,000
Airtable list price at 400 seats.
Owned, per year
$13,080
AWS infrastructure only. Azure is $14,160.
Build
12 weeks
3 engineers. To parity on the core features above, including import of existing Airtable and Smartsheet bases with links, views and automations reconstructed rather than flattened to CSV.
Difficulty
4/5
Substantial. Compliance or realtime depth involved.
Reference organisation: 600 seats plus 1,500 free form and read-only users, 220 bases, 14M records, 600 GB of attachments, single region, prod + non-prod. 3-year Compute Savings Plan on Fargate / 3-year reservation on Container Apps. Aurora minimum 1 ACU in prod, 0.5 in non-prod. Attachments on S3 Standard-IA / Blob cool with lifecycle. Redis sized for view materialisations rather than for cache-only use. Excludes LLM gateway token cost for AI fields and vendor support plans. Figures are infrastructure only and exclude the build.
What it is
Grid is a low-code relational database: tables with typed fields and real foreign keys, grid, kanban, calendar and gallery views, automations, and interfaces you can hand to people who will never see the underlying tables. It is aimed at organisations where two hundred departmental bases have quietly become production systems — the vendor onboarding tracker, the content calendar, the equipment register — and where per-seat pricing now bills you for every person who touches any of them. Grid is Postgres underneath, so when one of those bases outgrows the tool, it becomes a schema rather than a migration project.
Why this one stops making sense
- Airtable Business lists at $45 per seat per month billed annually. Six hundred seats is $324,000 a year for what is, in the end, a database with a good grid.
- Smartsheet Business is $24 per member per month, and the collaborator model means the boundary between a member and a contributor becomes an argument about licensing rather than about work.
- These bases become production systems without ever being reviewed. There is no schema migration, no staging environment and no code review on the thing that now tracks your supplier payments.
- The exit path is the problem. A base exports as CSVs, which loses the links, the views, the automations and the interfaces — that is, everything except the raw cells.
- Per-seat pricing across dozens of small bases means you pay full price for someone who updates one record a month, which pushes teams back into spreadsheets emailed around.
What ships
- Tables with typed fields: text, number, date, select, user, attachment, formula, rollup, link
- Real relational links between tables, with referential integrity and cascade rules
- Grid, kanban, calendar, gallery and timeline views with per-view filters, sorts and field visibility
- Interfaces: forms, record detail pages and dashboards published to people who never see the tables
- Automations with triggers, conditions, actions and a run history you can inspect and replay
- Per-base, per-table and per-field permissions, including read-only and record-level rules
- Revision history per record and per field, with restore
- Import from CSV, Airtable and Smartsheet exports, preserving links where they can be resolved
- REST API and webhooks per base, with no rate tier
- A read-only SQL view of every base for BI tools, so Lens can query a base directly
Data model
Stack
- frontend
- Next.js 15 App Router + Tailwind + a virtualised grid with keyboard-first editing
- backend
- NestJS on Node 22 — REST plus a WebSocket gateway for collaborative editing
- database
- PostgreSQL 16 with a typed cell store, JSONB for variable payloads and lazily created expression indexes
- cache
- Redis 7 for view materialisations, presence, automation locks and rate limiting
- queue
- BullMQ for automation execution, index creation, import and webhook delivery
- auth
- OIDC against the customer IdP; SCIM 2.0 for provisioning
- search
- PostgreSQL tsvector per base, scoped by the same permission rules as the views
- ai
- Optional AI fields and record summarisation through a pluggable LLM gateway
Parity, honestly
What we match, and what we do not.
The rows marked No are the important ones. If one of them is the reason you bought Airtable, keep buying it — and we will tell you that on the first call rather than the fifth month.
| Capability | Airtable | Ours | Note |
|---|---|---|---|
| Typed fields, linked records and rollups | Yes | Yes | Links are real foreign keys, so a deleted parent behaves predictably. |
| Grid, kanban, calendar, gallery and timeline views | Yes | Yes | — |
| Forms and published interfaces | Yes | Yes | — |
| Automations with run history | Yes | Yes | Ours are versioned and replayable against a past trigger payload. |
| Free unlimited read-only and form-only users | No | Yes | The person who fills in a form once a month should not be a licence. |
| SQL access to base data | No | Yes | A read-only view per base. Your BI tool connects to it directly rather than through a sync. |
| Airtable's extension and template marketplace | Yes | No | Airtable's marketplace of extensions, scripting blocks and hundreds of templates is a real part of what teams buy. We ship the extensions you name during discovery and no gallery. |
| Smartsheet Control Center, Resource Management and portfolio governance | Yes | No | These are whole product lines for programme rollout, blueprint provisioning and resource levelling. Grid is a database with views. If your PMO runs on Control Center, replacing Smartsheet is a different and much larger project. |
| Vendor-run SOC 2, ISO 27001 and FedRAMP | Yes | No | Smartsheet Gov holds a FedRAMP authorisation that cannot be reproduced by self-hosting. Grid inherits your cloud posture. |
| Real-time multiplayer editing with presence | Yes | Yes | — |
| Sync between bases and from external sources | Yes | Partial | Base-to-base sync ships. Airtable's library of prebuilt external sync sources does not; we build the connectors you actually use. |
| AI fields and record generation | Yes | Yes | Through your LLM gateway, with per-field cost visible before you run it across 50,000 records. |
| Mobile applications | Yes | Partial | PWA with offline read and queued writes. No store-listed native application. |
| Scale beyond a few hundred thousand records per table | Partial | Yes | Airtable's per-base record limits are a licence tier. Grid's limit is the one Postgres has, which is considerably further away. |
Reference architecture
Built twice, on purpose.
Every application in Techtons ships with a production architecture for AWS and one for Azure, using the same diagram grammar so you can read them side by side. Your cloud, your account, your bill.
Amazon Web Services
- Compute
- ECS Fargate (api, ws, worker) behind an ALB
- Data
- Aurora Serverless v2 PostgreSQL, ElastiCache Redis
- Storage and edge
- S3 for attachments and exports, CloudFront for the front end and file delivery
- Identity
- Cognito federated to the customer IdP
- Observability
- CloudWatch and OpenTelemetry; index-creation backlog and slow-view queries both tracked
- Infrastructure as code
- Terraform, one module per environment
Services
The decision worth arguing about
The decision that defines this product is what happens in Postgres when a user adds a field. The intuitive answer is a real table per user table and an ALTER TABLE per field, which gives you native types, real indexes and honest planner statistics — and which collapses at scale, because two thousand bases with thirty tables each is sixty thousand tables of catalogue, every schema migration becomes a distributed operation, and a user renaming a column takes a lock on production. So Grid stores records in a shared cell store: typed columns for the common scalar types, JSONB for everything else, and one row per cell rather than per record, which is what makes adding and reordering fields free. The cost is that Postgres no longer holds meaningful statistics for a user's column, so the planner cannot tell a field with three distinct values from one with three million and will happily choose a sequential scan on a view that filters by it. Two mechanisms pay that back. Any field that a view actually filters or sorts on gets a partial expression index created lazily by a background worker the first time it is used — indexes follow real usage rather than every field a user creates. And any view over roughly 100,000 records gets a materialised projection refreshed on write through the queue, so the grid reads a narrow purpose-built table instead of assembling cells at query time. The honest limitation: a base that behaves like a warehouse rather than a workspace should not live here at all, and Grid tells you so by exposing per-view query time in the interface rather than letting it degrade quietly.
Microsoft Azure
- Compute
- Container Apps (api, ws, worker), the WebSocket app pinned to a minimum of two replicas
- Data
- PostgreSQL Flexible Server with the built-in PgBouncer enabled, Azure Cache for Redis
- Storage and edge
- Blob Storage for attachments and exports, Front Door Standard for edge and WAF
- Identity
- Microsoft Entra ID directly
- Observability
- Azure Monitor and Application Insights, with connection-pool saturation alerted
- Infrastructure as code
- Bicep, azd-compatible layout
Services
The decision worth arguing about
Azure Database for PostgreSQL Flexible Server ties its maximum connection count to the compute SKU, and this workload opens a lot of short-lived connections — every automation run, every webhook, every view refresh — so the built-in PgBouncer goes on early rather than after the first outage. Enabling it in transaction pooling mode is where the non-obvious consequence lands: transaction pooling breaks every session-scoped Postgres feature, and the automation engine was built on two of them. Advisory locks, which are the elegant way to guarantee that one automation does not run twice concurrently on the same record, do not survive a pooled connection because the next statement may arrive on a different backend. LISTEN and NOTIFY, which is how the WebSocket gateway learned about changes on AWS, does not work at all through a transaction pooler. So on Azure the automation lock moves into Redis as a fenced lease with an expiry, and change notification moves onto Service Bus topics with the gateway subscribing per base. Both are more code and more moving parts than the Postgres primitives they replace, and the Redis lease in particular has a failure mode the advisory lock did not — a worker that stalls past its lease expiry can be joined by a second worker on the same record, which is why every automation action is written to be idempotent on a run identifier. We use the same Redis and Service Bus shape on AWS for consistency, but on Azure it is not optional.
Sources
Every price on this page, with the page we read it from and the date we read it.
| Product | Plan | List price | Checked | Source |
|---|---|---|---|---|
| Airtable | Business | $45 / seat/month | 2026-09-05 | www.airtable.com/pricing Billed annually. Team lists at $20 per seat per month; Enterprise Scale is quoted by sales. |
| Smartsheet | Business | $24 / seat/month | 2026-09-05 | www.smartsheet.com/pricing The published monthly-billing rate per member, with a three-member minimum. Smartsheet's pricing card also shows a lower annual-commitment rate; the page renders both figures adjacent and we quote only the one we could read unambiguously. Enterprise is quoted by sales. |
Should you still be paying for Airtable?
Two weeks, fixed price. We audit what you actually use, map it against Grid, cost the replacement on your own AWS or Azure account, and give you a delivery plan. If the honest answer is to keep the licence, that is what the report will say.