How to

How to build a report request queue

Every request is urgent, most of them already exist, and the data team is a helpdesk. Here is the model behind a queue that fixes that, the prompts to build it, and what it takes to run it.

The short answer

A report request queue is four parts: a request that captures the decision being made rather than the columns wanted, a check against what already exists, prioritisation against real capacity, and a route from repeated one-off requests into self-serve. The single highest-value field is the decision. People ask for a spreadsheet with six columns, and once you know what they are deciding you can frequently answer it in a sentence or point at a dashboard built last quarter.

report-requests.helix-app.ai

Report requests

19

In the queue

31%

Answered by something existing

4

Topics asked 3+ times

6 days

Median turnaround

What decision will this inform

Whether to fund two more CS headcount in Q4

Asked before the columns, on purpose

What would you do differently

Fund them if churn in the mid-market segment is above 8%

When is the decision made

30 September

Not when you want the report

How will you use it

Once, for the board pack

One-off, monthly, or a dashboard

We may already have this

Churn by segment, updated weekly

Three existing reports match. Close yours if one answers it.

A sketch of the form. The decision field comes first because people request columns, and knowing the decision frequently turns a two-day report into a sentence or a link.

What matters here

  • A report queue is four parts: the decision behind the request, a duplicate check, prioritisation against capacity, and a self-serve route.
  • Ask what decision this informs. People request columns; the decision is what tells you whether a sentence would do.
  • A large share of requests already have an answer. Search existing reports at submission, not after the work starts.
  • Ask when the decision is made, not when the requester wants it. Those are different dates and only one is real.
  • Track which requests repeat. Three of the same is a dashboard, and that is how a data team stops being a helpdesk.
  • Record whether the answer changed the decision. It is uncomfortable and it is the only measure of whether the work mattered.

Who this is for

You run a data or analytics team that has become a request queue. What you want is fewer requests, better ones, and an argument for headcount that is not just a list of tickets.

How it works in practice

What happens between somebody wanting a number and the data team doing anything.

  1. 1

    The form asks what decision this informs

    Before it asks for columns. People request a spreadsheet; the decision underneath is usually smaller than the request.

  2. 2

    It searches what already exists

    Against registered dashboards and open requests, at submission, so a third of these close before anyone starts work.

  3. 3

    It asks when the decision is made

    Not when the report is wanted. Those are different dates and only the first one is real.

  4. 4

    It gets scored and ranked against capacity

    With the line drawn visibly, so the conversation is about how much the team can do rather than about individual requests.

  5. 5

    Waiting-on-the-requester is timed separately

    Because a meaningful share of what looks like data team delay is a clarification nobody answered.

  6. 6

    Repeats get promoted to self-serve

    Three requests on one topic becomes a dashboard, and everyone who ever asked is told it now exists.

What a report queue is made of

A report queue is not a ticket form pointed at the data team. It is four parts, and the first one changes what gets asked.

The decision, not the columns

What are you deciding, when do you decide it, and what would change depending on the answer. Requests arrive as column lists, and the decision underneath is usually smaller than the request.

A check against what exists

Search existing reports and dashboards at submission. A large share of requests are for something built last quarter that nobody could find.

Prioritisation against capacity

Scored on the size of the decision and its real deadline, ranked against how much the team can actually do, with the line drawn visibly.

A route to self-serve

Repeated requests become a dashboard or a documented query. This is the only mechanism that reduces the queue rather than working through it faster.

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. Ask what they are deciding

    The one field that changes the whole conversation.

    In this Helix project, build me a report request queue for our data team.
    
    The form asks for the usual things: requester, team, what they want, and
    any filters or breakdowns.
    
    But lead with a different question, and make it required: what decision
    will this inform, and what would you do differently depending on the
    answer.
    
    People ask for a spreadsheet with six columns. Once you know they are
    deciding whether to renew a contract, you can often answer it in a
    sentence, or point at a dashboard built last quarter, or realise the
    six columns would not actually have told them.
    
    Then ask for the date the decision is made, not the date they want the
    report. Those are different, and only the first one is real. Ask for the
    difference explicitly if the two dates are far apart.
    
    And ask how they will use it: a one-off answer, something they need
    monthly, or something they want to look at whenever. That answer decides
    whether this is a query or a dashboard, and it is much cheaper to know now.
    
    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. The decision field is the highest-value question in this app. It repeatedly turns a two-day report into a two-minute answer.

  2. Check whether it already exists

    Because a lot of the queue is search failure.

    Before anything is triaged, search what we already have.
    
    Let me register existing reports and dashboards with their name,
    description, what questions they answer, the owner and a link. Then on
    submission, search those against the request text and the decision, and
    show the requester likely matches immediately.
    
    Let them close their own request by saying one of those answered it, and
    record that. That count is the size of the search problem, and it is
    usually large enough to be worth fixing separately.
    
    Also check open requests, so two people asking for the same thing in the
    same week become one piece of work with two people notified.
  3. Prioritise against what the team can do

    And show the line.

    Score each request on the size of the decision it informs, the real
    deadline, and the estimated effort, with the weights in a config file I
    can edit. Effort is estimated by the team, not the requester.
    
    Then rank against capacity: who is available, for how long, and what they
    are already committed to. Draw a line where capacity runs out and show
    what falls below it.
    
    Do not hide the below-the-line list. A queue with no capacity model just
    re-sorts a list longer than the team can deliver, and everybody stays
    disappointed without understanding why.
    
    Let a leader override the order with a reason, and log every override.
    
    Track time in each status, and report time waiting on the requester
    separately. A meaningful share of what looks like data team delay is a
    request sitting with the person who raised it waiting for a clarification.
  4. Turn repeats into self-serve

    The only thing that actually shrinks the queue.

    Tag every request with a topic, and report which topics recur.
    
    Three requests for the same thing is a dashboard. Make that an explicit
    action: promote a repeated request into a self-serve report, register it
    in the existing-reports list, and notify everyone who has ever asked for
    that topic that it now exists.
    
    This is the only mechanism that reduces the queue rather than processing
    it faster, and without it a data team stays a helpdesk regardless of how
    efficient it gets.
    
    Then two reports. One for the team: requests by topic, by requesting team,
    turnaround, and the proportion answered by pointing at something that
    already existed. And one that is uncomfortable: for delivered requests,
    did the answer change the decision. Ask the requester a fortnight later.
    A high proportion of no is the most useful thing this app will ever tell
    you.

    Worth knowing. The did-it-change-the-decision question is awkward to ask and it is the only honest measure of whether the work mattered.

  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.
    
    <Looker>. Read the existing reports and dashboards, so a submission can be
    matched against them immediately.
    
    <Okta>. Resolve requesters, their teams and the analyst group you assign
    to, so none of it depends on a list somebody maintains.
    
    <Slack>. Tell everyone who ever asked for a topic when it becomes a self-
    serve dashboard.
    
    <Jira>. Push accepted requests to wherever the team actually works, rather
    than a second queue.
    
    <Snowflake>. Check whether the data a request needs actually exists before
    it is scheduled.
    
    <Google Sheets>. Deliver one-off answers where requesters will actually
    use them.
    
    <Notion>. Publish the self-serve reports so a repeated request becomes a
    link.
    
    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. Requests reference commercially sensitive decisions, so set Access Control before sharing: requesters see their own, the data team sees the queue.

What it connects to

Half the value is telling somebody the answer already exists, which means seeing what already exists.

  • Looker

    Read the existing reports and dashboards, so a submission can be matched against them immediately.

  • Okta

    Resolve requesters, their teams and the analyst group you assign to, so none of it depends on a list somebody maintains.

  • Slack

    Tell everyone who ever asked for a topic when it becomes a self-serve dashboard.

  • Jira

    Push accepted requests to wherever the team actually works, rather than a second queue.

  • Snowflake

    Check whether the data a request needs actually exists before it is scheduled.

  • Google Sheets

    Deliver one-off answers where requesters will actually use them.

  • Notion

    Publish the self-serve reports so a repeated request becomes a link.

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 queue. It holds context about decisions being made across the business, so it needs to be run properly.

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

Requests describe decisions in flight, which is commercially sensitive before it is public. SSO means people sign in with their existing account, and access is scoped so requesters see their own.

App Security

Connect the system of record with managed credentials

Registering existing dashboards and checking what already exists needs read access to your BI tool. Granting it to the app rather than pasting a key into it means it can be rotated or revoked without a redeploy.

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 a report request queue?

A front door for analytics requests that asks what decision the request informs, checks whether the answer already exists, prioritises against real team capacity, and routes repeated requests into self-serve reporting.

What is the most useful question on the form?

What decision will this inform, and what would you do differently depending on the answer. People request columns. Knowing the decision frequently turns a two-day report into a sentence, or a pointer at a dashboard built last quarter.

Why ask when the decision is made rather than when they want it?

Because those are different dates and only the first is real. Most requested deadlines are preferences, and asking for the decision date surfaces the ones that genuinely cannot move.

How do I stop a data team being a helpdesk?

Tag requests by topic and promote anything that recurs three times into a self-serve dashboard, then tell everyone who ever asked that it exists. That is the only mechanism that shrinks the queue rather than working through it faster.

How do I know whether the work mattered?

Ask the requester a fortnight after delivery whether the answer changed the decision. It is an uncomfortable question and a high proportion of no is the most useful finding the app will produce.

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 your scoring weights and your capacity model.

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.