You ship your product. Then your ops team needs to see customer data. Then support needs to fix account issues. Then finance wants a usage report. You open a new browser tab and start searching for "Retool free tier."
Before you do -- read this.
Retool charges around $10 per user per month at its lowest paid tier. Airtable starts at around $20 per user per month for automations and version history. Both tools require you to build a separate sync from your real database, which means your internal tool is always one step behind your production data.
There is a simpler path if you already have a Next.js codebase.
An internal tool is just a set of protected pages your team uses. It needs:
If you already have a Next.js SaaS boilerplate with auth, a database, and role-based access, you have 80% of this already.
Here is the honest comparison:
Retool or Airtable:
Built in Next.js:
The crossover point is around 3-4 staff users. At that point, Retool starts costing $30-40 per month and the sync complexity starts to irritate. A custom internal page pays for itself in one month.
Create app/(admin)/ alongside your main layout. Add a middleware check that only lets users with role: 'admin' or role: 'staff' through. This is the same JWT you already have -- you are just adding a route guard.
The Next.js SaaS Boilerplate ships an admin panel module with user search and bulk actions already wired up. Use it as the starting point instead of a blank page.
Your modules/user/user.repo.ts already talks to Neon DB through Drizzle ORM. Add a function like findByEmail or listTrialExpiringSoon. Your internal page calls the service, the service calls the repo -- same pattern as the rest of your app.
No sync needed. No API key for a separate tool. The data is always live.
Support tasks like "extend this trial by 7 days" or "reset this user's usage counter" are just service functions. Put them in a POST route under app/(admin)/api/. The admin role check in middleware means only staff can call them.
This is safer than giving your team raw database access, and faster than building a Retool workflow.
The pattern is the same for internal tools as for the rest of your app: read the role from the JWT, redirect to / if they should not be there, render the page if they should.
See the related post on how to build a SaaS admin panel for the exact route structure and role check pattern.
Start with the one page your team opens most often. For most early-stage SaaS teams that is:
Each of these is a single server component that calls a Drizzle query. The first one takes about two hours to build. The second takes another hour once the pattern is familiar.
Your internal tool:
When a customer emails support at 10pm, your team opens a page on your own domain instead of logging into a third-party tool and waiting for the sync to catch up.
The Next.js SaaS Boilerplate gives you auth, the Drizzle database layer, and a working admin panel starting point. You add the specific queries and actions your team needs. Most teams ship a useful first internal page in an afternoon.
Stop paying per seat for tools you do not control. You already have everything you need.