How to

How to build an internal admin dashboard

A customer rings, support cannot see their account, so it becomes an engineering ticket that takes two days. Here is the model behind the tool that ends that, the prompts to build it, and what it takes to run it.

The short answer

An internal admin dashboard lets support look a customer up and fix their problem without asking engineering. It is four parts: search that matches how an enquiry actually arrives, a record view that assembles everything about that customer in one place, a set of named actions they can take, and a log of every action taken. The one design decision that matters is the third: give operators a finite list of named actions rather than the ability to edit any field. A named action can be previewed, limited, logged and usually undone. An arbitrary edit is none of those, and it is how production data gets quietly corrupted.

support-console.helix-app.ai

Support console

Pro, annual

Plan

288 of 300

Seats in use

41 days

To renewal

2

Open tickets

Halden Foods

Customer since March 2024 · account manager R. Iyer

Billing
Paid, current
Last sign-in
11 minutes ago
Open tickets
2
Flags
None
Contract value
410,000

What has happened to this account

  • 11 min ago Sign-in link sent to j.ortiz@halden.example
  • Yesterday Trial extended, 14 days M. Sandoval · reason: migration slipped
  • 3 days ago Credit applied, 420 R. Iyer · reason: outage on 28 Aug
  • 3 days ago Refund refused T. Okafor · over the role limit for an agent
  • Last week Seat added by the customer's own administrator
A sketch of one customer, open. The history is the second half of the screen rather than a separate report, because most confusing account states turn out to be something a colleague did last week.

What matters here

  • An admin dashboard is four parts: search, a unified record view, defined actions, and an audit log.
  • Give operators actions, not field editing. A named action can be reviewed, logged and reversed; an arbitrary field edit cannot.
  • Search must match how support actually receives an enquiry: an email address, an order number, a partial name.
  • Every action needs an actor, a timestamp, a reason and a before-and-after snapshot.
  • Make destructive actions look destructive, require a typed confirmation, and prefer reversible over irreversible.
  • An admin dashboard operates on production customer data, so scoped access and managed credentials are the core of the design.

Who this is for

You run support, operations or the engineering team fielding their requests. What you want is for routine account questions to stop becoming engineering tickets, without handing anyone a database client.

How it works in practice

What an agent does while a customer is still on the phone.

  1. 1

    Find them by whatever they gave you

    An email address, an order number, a partial company name, a ticket reference. Support almost never has the customer id, so search has to match the way an enquiry actually arrives.

  2. 2

    See the whole account on one screen

    Plan, billing status, recent orders, recent activity, open tickets and any flags, assembled from wherever those things live. No second tab, no second login.

  3. 3

    Read what already happened to them

    The history sits on the record, not in a separate report. Most confusing account states are explained by something a colleague did last week.

  4. 4

    Take a named action, not an edit

    Send a sign-in link, extend a trial, apply a credit, resend a receipt, merge duplicates. Each one has preconditions, a role, and a preview of what will change.

  5. 5

    The action is logged as it happens

    Actor, timestamp, reason, and a before and after. Refusals are logged too, and those are frequently the more interesting entries.

  6. 6

    Anything bulk goes down a different path

    Higher role, full preview of every affected record, a typed confirmation. Safe on one record says nothing about safe on four thousand.

What an admin dashboard is made of

Four parts, and the third is the one that decides whether this is a support tool or a way to corrupt production data by accident.

Search

Finding a record the way an enquiry arrives: an email address, an account name, an order or invoice number, a partial phone number, a support ticket reference.

A unified record view

Everything about one customer or account on one page, assembled from whichever systems hold it, so an operator does not need four tabs and three logins.

Defined actions

A finite list of named operations with clear preconditions: reset a password, extend a trial, resend a receipt, cancel an order, merge duplicates. Not arbitrary field editing.

An audit log

Every action with the actor, the timestamp, the reason, and a before-and-after snapshot. Both a control and the fastest way to explain a strange account state later.

These prompts start from a Helix project, which is what handles sign-in, credentials and hosting. Start with Helix

The prompts

Paste these into Claude Code, Codex or Cursor in order. Each one leaves you with something that runs, so you can stop after any step.

  1. Find the record, then see all of it

    Search the way support actually looks things up.

    In this Helix project, build me an internal admin dashboard for our support
    team.
    
    Start with search. One box that matches on the identifiers an enquiry
    actually arrives with: email address, account name, customer id, order or
    invoice number, phone number, support ticket reference. Partial matches on
    names and emails, exact on identifiers.
    
    Show enough in the results to tell two candidates apart: name, email,
    status, created date, plan. Support very often has two and needs to pick.
    
    Then a record page that assembles everything about one customer in one
    place: profile, plan and billing status, recent orders or transactions,
    recent activity, open tickets, and any flags.
    
    Pull each section from its own module, and render a section that fails to
    load as unavailable with a retry rather than failing the whole page. One
    slow system should not make the dashboard useless, and a partial outage is
    exactly when support needs it most. Show the last refresh time per
    section.
    
    I sign in through Helix, so do not build a login page. Read the signed-in
    user from the runtime. And do not put any key or connection string in the
    code: if this needs to reach another system, tell me and I will create the
    connection in my workspace.

    Worth knowing. Degrading section by section is what makes an admin tool usable on a bad day, which is the only kind of day it gets used hard.

  2. Actions, never a field editor

    The decision that keeps this from becoming a liability.

    Now the important part. Define every operation as a named action rather than
    exposing raw field editing.
    
    For each one specify: a name, what it does, the preconditions, the role
    required, whether a reason is mandatory, and whether it is reversible.
    
    Start with these and let me add more in a config file: send a sign-in link
    or reset a password, extend a trial by a set number of days, apply a
    credit or refund up to a role-dependent limit, resend a receipt or
    notification, cancel or reschedule an order, merge duplicate records,
    suspend or reinstate an account, add an internal note.
    
    Rules for all of them. Show a preview of what will change before it
    happens. Require a typed confirmation for anything destructive or
    irreversible. Enforce the role server side, not just by hiding a button.
    And refuse cleanly rather than partially applying when a precondition
    fails.
    
    Do not build a generic field editor. If an agent needs to change something
    not on this list, that should become a new named action.

    Worth knowing. A named action can be reviewed, rate limited, logged meaningfully and usually reversed. An arbitrary edit is how production data gets quietly corrupted.

  3. The audit log, visible where it helps

    On the record, not buried in a separate report.

    Add an append-only audit log: actor, action, target record, timestamp,
    reason, parameters, a before and after snapshot, and the outcome. Never
    edited, never deleted.
    
    Log every action including failed attempts and refusals. A blocked attempt
    is frequently the more interesting entry.
    
    If the data warrants it, log views of sensitive records too, as a separate
    lower-volume entry type.
    
    Make the audit searchable by actor, action, target and date range, and put
    it on the record page itself so an agent can see what was already done to
    this account before acting. Most confusing account states turn out to be
    something a colleague did last week.
    
    Then report actions per operator per week, the most used actions, and
    refusals by reason. A frequently refused action is usually a precondition
    that does not match reality.
  4. Make the blast radius small on purpose

    Roles, limits, and a separate path for bulk.

    Put roles in a config file, each listing the actions it may perform and any
    limits such as a maximum refund. Enforce server side.
    
    Include a read-only role. It will cover most requests for access, because
    most people asking for an admin dashboard only need to look something up,
    and giving them a role that cannot change anything removes most of the
    risk of saying yes.
    
    Rate limit each action per operator, so a mistake or a compromised account
    cannot touch a thousand records before anyone notices.
    
    Give bulk actions their own path: a higher role, the full list of affected
    records shown first, a typed confirmation, and one audit entry per record
    rather than one for the batch.
    
    If I ask for a view-as feature, make it strictly read-only, time limited,
    loudly indicated in the interface throughout, and audited on entry and
    exit.
    
    And add a test mode against sample data so new agents can learn the tool
    without touching a real account.
  5. Connect it to real systems

    The step that turns a working prototype into something with your data in it.

    Now connect it to the systems we actually run, so it works on real data
    rather than the rows you seeded.
    
    Anything in angle brackets is a placeholder. Swap it for whatever we use
    instead, and have the app name the connection it wants rather than assume
    a vendor, so changing my mind later is a config change and not a rewrite.
    
    <your product database>. Read the customer record and perform the named
    actions. Scope this to the actions you defined, not to everything.
    
    <Stripe>. Read plan and payment status, and apply the credits and refunds
    your roles allow.
    
    <Zendesk>. Show open tickets on the record, so support is not holding two
    tabs.
    
    <Okta>. Authenticate the operator and read their group, so every action in
    the audit log has a verified name and a role behind it.
    
    <Salesforce>. Show the account and its owner, so an agent knows who to
    hand a commercial question to.
    
    <Snowflake>. Read usage history for the account, which the production
    database should not be queried for.
    
    <Slack>. Post high-privilege actions to a channel security can watch, in
    addition to the audit log.
    
    <Gmail>. Resend receipts and notifications, which is a large share of what
    support is asked for.
    
    Only write where I have said to write. Everything else is read only.
    
    Do not write a key, a token or a connection string anywhere in the code,
    and do not ask me to paste one. Tell me which connections you need and I
    will create each as an authentication in my Helix workspace. Reference
    them by alias.

    Worth knowing. Every name in angle brackets is a placeholder for whatever you run. Helix holds the credential as a workspace authentication, so the app references an alias and never the secret itself.

  6. Ship it

    The last step of every build: a URL, and the right people on it.

    Deploy my app.

    Worth knowing. Your assistant runs helix deploy underneath and the app comes back as a URL. This tool acts on production customer data, so set Access Control before sharing and scope operators to the actions their role warrants.

What it connects to

This is the app with the widest reach in the library, and every connection is a decision about blast radius.

  • Your product database

    Read the customer record and perform the named actions. Scope this to the actions you defined, not to everything.

  • Stripe

    Read plan and payment status, and apply the credits and refunds your roles allow.

  • Zendesk

    Show open tickets on the record, so support is not holding two tabs.

  • Okta

    Authenticate the operator and read their group, so every action in the audit log has a verified name and a role behind it.

  • Salesforce

    Show the account and its owner, so an agent knows who to hand a commercial question to.

  • Snowflake

    Read usage history for the account, which the production database should not be queried for.

  • Slack

    Post high-privilege actions to a channel security can watch, in addition to the audit log.

  • Gmail

    Resend receipts and notifications, which is a large share of what support is asked for.

Each line says whether the app reads, writes or both. Anything not described as writing should be read only.

Named systems are the ones most teams actually run, not a list of the only ones that work. Swap in whatever you use.

Each connection is an authentication in your Helix workspace, referenced by alias. The app names the connection it wants and never holds the credential, so nothing here ends up in your code and any of it can be rotated or revoked without a redeploy.

Running it for real

The build gets you a working dashboard. It reads and writes production data on behalf of staff, which makes how it is run the more important half.

AI Deployment

Get it to a URL people can open

One command takes the app from your assistant to a live address, so the people who need it get a link rather than instructions for running it locally.

App Security

Put your identity provider in front of it

This tool acts on production customer data. SSO means every action is attributable to a verified person, and access is scoped so operators hold only the actions their role warrants.

App Security

Connect the system of record with managed credentials

Reading and writing across production systems needs real credentials. Granting them to the app rather than embedding them means they can be rotated or revoked without a redeploy, and the app's reach is something you can see.

App Registry

Put a name on it

Every app carries a named owner and an entry IT can see, so the tool does not become nobody's problem when the person who built it changes role.

Cost Management

Know what it costs to run

Per-app spend visibility, with budgets and caps, so an internal tool cannot quietly become a line item nobody can explain.

Questions people ask

What is an internal admin dashboard?

A tool that lets support and operations staff find a customer record, see everything about it in one place, and perform a defined set of actions against it, with every action logged. It exists so routine account questions stop becoming engineering tickets.

Should an admin dashboard allow editing any field?

No. Define named actions with preconditions, role requirements and reasons instead. A named action can be reviewed, logged, rate limited and often reversed. An arbitrary field edit is how production data gets corrupted in ways nobody can trace.

What should the audit log capture?

The actor, the action, the target, the timestamp, the reason, and a before-and-after snapshot, appended and never edited. Log refused and failed attempts too, since those are frequently the more interesting entries.

How should bulk actions be handled?

On a separate path with a higher role, a full preview of affected records, a typed confirmation, and one audit entry per record rather than one for the batch. An action being safe on a single record says nothing about it applied to four thousand.

Is a read-only role worth building?

Yes, and it will cover most requests for access. Many people asking for an admin dashboard only need to look something up, and giving them a role that cannot change anything removes most of the risk of granting it.

Can I build this without an engineering team?

Yes. The prompts here are written for Claude Code, Codex or Cursor and stage the build. The judgement calls are which actions to define and which roles may perform them, and those are operational decisions rather than technical ones.

Last reviewed September 2026.

Build it, then run it properly

Helix is the governed runtime for AI-built apps. Deploy what you build, put SSO in front of it, connect it to your systems with managed credentials, and give it a named owner.