D
E
L
T
A
C
O
D
E
S
Back to journal

Scaling Beyond Retool: When Off-the-Shelf Internal Dashboards Fail B2B Ops

Retool earns its price for years. Then you point it at customers. Where seat licensing, the 5,000-run workflow cap, and direct queries against your primary database actually start to bite.

PUBLISHED:JUL 16, 2026AUTHOR:ADITYA SUMANREAD:7 MIN
A row of identical prefabricated modular units, pristine at the near end and visibly improvised and strained further down the rowFIG/01

/KEY TAKEAWAYS

The short version

  • 01Retool is not the problem. Quietly promoting an internal tool into customer-facing infrastructure is the problem, and it usually happens by accident.
  • 02For internal ops, Retool is cheap. Eight builders and sixty staff on the Business plan runs about 1,300 dollars a month at published rates. Nobody should migrate over that.
  • 03The economics turn at the external-user boundary. Retool's volume tiers put a 900-user customer portal near 4,700 dollars a month.
  • 04Your database complains before your finance team does. Every Retool component is its own query against your primary, on its own schedule.
  • 05Team and Business both cap workflow runs at 5,000 a month. A sync running every fifteen minutes burns 2,880 of those before a human touches anything.

Retool does not fail. That is what makes this one hard to see coming.

For two or three years it does exactly what it said on the tin. Your ops lead gets an admin panel in an afternoon, which is genuinely remarkable if you remember what building one used to cost. Support can refund an order without opening a ticket against the engineering backlog. And nobody, anywhere, has to maintain a React app that eleven people will ever open. It is a good trade. We tell clients to make it.

Then something shifts, and it is rarely the thing founders brace for.

At what scale do Retool seat-licensing fees become unsustainable?

Later than the internet would have you believe, as long as you are pointing it inward.

Run Retool's own published numbers. On the Business plan a builder costs 50 dollars a month, and an internal user who only opens apps costs 15. Give yourself eight builders and sixty ops staff. That is 400 plus 900, so 1,300 a month, call it 15,600 a year.

That is a fraction of one engineer. Anyone urging you to migrate at that number is selling you a migration.

The economics turn when the people logging in stop being your staff. External users bill on a volume tier: the first fifty free, then 8 dollars each up to 250, 6 dollars up to 500, and 4 dollars past that. Put 900 customers on a portal and read those tiers as marginal. Fifty free, 200 at eight, 250 at six, 400 at four. That is 4,700 dollars a month, or 56,400 a year, for a codebase you cannot fork and cannot hand to a procurement team.

Isometric schematic contrasting dozens of tangled redundant query paths against a single composed query reaching the same databaseFIG/02
Left: a dashboard where every component fetches for itself, fifty-one round trips for a fifty-row table. Right: the same screen, one composed query. Same data, same database, two very different Mondays.

What breaks before the bill does?

The database. It is nearly always the database.

Retool is a user interface sitting on top of your production Postgres. Every component that displays data owns its own query and fires it on its own schedule, through a connection pool you do not control. At 200 rows this is invisible. At 200,000 it is a different product.

A table showing fifty rows, each with a per-row status lookup, is fifty-one round trips to your primary every single time somebody opens that tab. Twelve ops staff hitting refresh through a busy Monday morning becomes hundreds of queries a minute against the same box your customers are waiting on.

There is a quieter ceiling. Team and Business both cap workflow runs at 5,000 a month, and ops automation is precisely the thing that eats that allowance while nobody is watching. One sync on a fifteen-minute schedule is 2,880 runs before a single human has done anything at all.

portal/queries.sqlsql
-- What a dashboard component does when left to its own devices.
-- First, one query for the page of rows...
SELECT id, customer_id, total, created_at
FROM orders
WHERE org_id = 4821
ORDER BY created_at DESC
OFFSET 10000 LIMIT 50;

-- ...then fifty more, one per row, to resolve the status column.
SELECT status FROM fulfilments WHERE order_id = $1;   -- x50

-- Two problems stacked on each other.
-- OFFSET 10000 makes Postgres walk 10,000 rows and throw them away.
-- It gets linearly worse the deeper anyone scrolls.
--   Limit  (cost=1284.17..1290.59 rows=50 width=28)
--     ->  Sort  (cost=0.00..1284.17 rows=10050 ...)
--   10,050 rows read to return 50. Plus 50 round trips for status.

-- One composed query instead. Keyset, not offset.
SELECT o.id, o.customer_id, o.total, o.created_at, f.status
FROM orders o
LEFT JOIN LATERAL (
  SELECT status FROM fulfilments
  WHERE order_id = o.id
  ORDER BY updated_at DESC
  LIMIT 1
) f ON true
WHERE o.org_id = 4821
  AND (o.created_at, o.id) < ($1, $2)   -- cursor from the previous page
ORDER BY o.created_at DESC, o.id DESC
LIMIT 50;

-- The index that answers the whole screen without touching the heap.
CREATE INDEX orders_org_created_idx
  ON orders (org_id, created_at DESC, id DESC)
  INCLUDE (customer_id, total);

-- Index Only Scan. 50 rows read to return 50. One round trip.
-- Page 200 now costs exactly what page 1 costs.

Same screen, same data. The top version gets slower every month your order table grows. The bottom one does not care how deep the customer scrolls.

How do you optimize custom customer portals for sub-second database queries?

Stop querying the primary. That one decision outperforms everything else on this list.

A customer portal is read-heavy and latency-sensitive. It has no business competing for connections with your write path. Point it at a read replica and let your internal tooling keep hammering the primary, because your ops team will forgive 400 milliseconds and your customers will not.

Then take out the offset pagination. OFFSET 10000 LIMIT 50 asks Postgres to walk ten thousand rows and discard every one of them, and the deeper someone scrolls the worse it gets. Keyset pagination reads fifty rows at page two hundred, and fifty rows at page one.

Index for the query you actually run rather than the column you happen to filter on. A covering index on org_id and created_at that also carries the columns your table displays will answer the entire screen from the index and never touch the heap.

Then render it on the server. React Server Components put the query and the render in the same place, so the browser receives HTML rather than a spinner and a waterfall of fetches it has to unwind on a phone.

A datacenter row where one rack burns hot under load while every identical rack beside it sits dark and idleFIG/03
Every dashboard in the building pointed at one box. The replicas beside it are powered on, indexed, and idle. This is the cheapest performance win most B2B teams are sitting on.

/TRADE-OFFS

Internal ops tool vs customer-facing portal

Same data, same database, two sets of requirements pulling in opposite directions. This is why one tool struggles to serve both surfaces past a certain point.

CriterionRetool (internal ops)Custom portal (external users)
Who logs inYour staff. Trained, trusted, forgiving of rough edges.Your customers. Untrained, unforgiving, quietly comparing you to their bank.
Acceptable load time400ms is fine. Nobody churns over an admin panel.Sub-second, or they assume the product is broken.
Cost at 900 usersVolume-tiered external seats. Near 4,700 dollars a month at published rates.Your hosting bill, which barely moves as users grow.
Database pathStraight at the primary, one query per component.Read replica, composed queries, keyset pagination.
Whose brand is itNobody's. It is an admin panel and that is fine.Yours. As far as the customer is concerned, this screen is the product.
Release scheduleThe vendor's.Yours.
Enterprise security reviewYou are explaining an architecture you did not write.You hand over the repo and the audit table.
Speed of changeHours. This is the real superpower and it is worth protecting.Days. You are writing actual software now.

When should you not leave Retool?

Most of the time. That is not a rhetorical concession before the sales pitch.

If Retool runs your internal ops and the bill is fifteen thousand a year, leaving is a bad trade. You would spend six figures of engineering time to save the monthly cost of a decent laptop, and you would take on a maintenance burden that is currently somebody else's job. Keep it. Keep it for years.

The answer changes when one of these becomes true.

  • The people logging in are your customers rather than your staff.
  • Retool's query volume is measurably hurting the database your product runs on.
  • An enterprise buyer wants a security review of a customer-facing system you did not write.
  • The portal needs to behave like your product rather than like an admin tool.

Even then the move is incremental. Strangler pattern: build the customer-facing surface on your own stack against a read replica, while Retool carries on running internal ops untouched. There is no cutover weekend. If the new portal turns out worse, the old one is still sitting there.

/FAQ

Questions ops leaders actually ask

Is Retool actually expensive?

For internal tooling, no, and the internet is wrong about this. Eight builders and sixty ops users on the Business plan comes to roughly 1,300 dollars a month at Retool's published rates, a fraction of one engineer's salary. It becomes expensive when external users log in, because those bill on a volume tier that reaches engineer-salary territory somewhere in the high hundreds.

Can we keep Retool for internal ops and build only the customer portal?

Yes, and that is usually the right shape. The two surfaces want different things. Internal ops wants speed of change and tolerates 400 milliseconds. A customer portal wants sub-second loads, your branding, and an answer when a buyer asks who wrote the code. Run both, and stop treating it as one decision.

At what point does Retool start hurting our production database?

Earlier than it hurts your budget. Retool queries your primary directly and every component owns its query, so a fifty-row table with a per-row lookup is fifty-one round trips per view. If your ops team refreshes dashboards through business hours against the same database serving customers, you are already paying for it in customer-facing latency. You have just not attributed it yet.

How long does it take to move a customer portal off Retool?

That depends on surface area, and anyone quoting a number before reading your schema is guessing. The honest shape of it: the portal is rarely the hard part. The hard part is that Retool has been reading your production schema directly for two years, so the read model a portal needs has never actually been designed. Budget most of the work there, not in React.

Will a custom portal actually be faster than Retool?

Only if you change the data path. A React app making the same fifty-one round trips to the same primary will be exactly as slow, and you will have paid to rebuild it for nothing. The speed comes from the read replica, keyset pagination, covering indexes, and server rendering. Rebuild the interface without rebuilding the query layer and you have bought a coat of paint.

Does Retool create a problem for SOC2 or data privacy?

Not on the vendor's side. Retool publishes SOC 2 Type II and ISO 27001 certification and will hand you the reports through its trust centre. The question enterprise buyers actually raise is a different one: your ops staff query live customer data through a third-party interface, and your access control lives in that vendor's permission model rather than in your own schema. That is answerable. Have the answer written down before the review rather than during it.

/END OF ENTRY

Have a build worth writing about?