// Staff-level judgmentWorked on 2022–now

Self-serve platforms: turn your team from a queue into a product

If every request to your team becomes a ticket, your team is the bottleneck. How to find the requests worth automating, build guardrails so non-experts can run them safely, and measure whether self-serve actually worked.

#platformengineering#devops#developerexperience#leadership

Platform and infrastructure teams often end up as a queue. Other teams need an environment, a database, a migration, an access change; they file a ticket; someone on the platform team does it by hand. As the company grows, the queue grows faster than the team, and the platform team becomes the bottleneck for everyone — however hard it works.

I’ve built self-serve tooling that let a team handle a multiple of its previous request volume without adding people. The tooling itself wasn’t the hard part. Choosing what to automate, making it safe for non-experts, and proving it worked were.

1. Find the requests worth automating

Export the last three months of tickets and group them. You’re looking for requests that are:

  • Frequent: weekly or more.
  • Repetitive: the same steps each time, with a few parameters.
  • Well understood: you have a runbook, or could write one in an afternoon.
  • Waiting-heavy: the requester waits days for a task that takes minutes of actual work.

The top two or three categories usually account for a large share of the queue. Start there. Don’t automate the rare, gnarly requests first; they’re where human judgment still pays.

2. Turn the runbook into steps

Before building any UI, turn the manual runbook into explicit steps, each with:

  1. A precondition check: is it safe to start? (Quota available, target healthy, no conflicting operation running.)
  2. An action, made idempotent so it can be retried.
  3. A verification: did it actually work?
  4. A rollback: how to undo it if a later step fails.

This is the core of the product. The interface — CLI, web form, API, chat command — is a thin layer on top, and you may end up offering more than one. For long-running, multi-step operations, a durable workflow engine is a natural backbone (see Durable workflows vs. a queue and a cron job).

3. Guardrails let non-experts press the button

The reason requests come to experts is that experts know what not to do. Self-serve needs that knowledge encoded:

Guardrail Example
Validation Reject a request with an unsupported size or region before anything runs
Pre-flight checks Refuse to start if the target is unhealthy or a conflicting job is running
Dry run Show exactly what will change before it changes
Limits Cap how much one request can do (number of resources, data volume)
Approvals for risky cases Routine requests run immediately; unusual ones route to a human
Rollback One clear action to undo, available to the requester

The approval row matters most. You don’t have to make every case self-serve. Making the routine 80% instant, and routing the risky 20% to an expert with all the context already collected, is a huge improvement on 100% manual.

4. Status people can see without asking

Half of the messages a platform team receives are “is my request done yet?”. Every self-serve operation should have a status page (or command) showing: current step, what’s done, what’s next, and — if it failed — why, in plain language, with the next action. If the requester has to ask you to interpret an error, that error message is a bug.

5. Measure whether it worked

Pick a few numbers and track them from before you start:

  • Self-serve rate: % of requests of this type completed without a platform engineer touching them.
  • Lead time: request to done, before vs. after.
  • Failure and rollback rate: are guardrails catching problems, or are people stuck?
  • Platform team time: hours per week spent on this request type.

The self-serve rate is the honest one. A tool that still needs a Slack message to the platform team to work isn’t self-serve; it’s a ticket with a nicer form.

6. Treat it as a product

  • Talk to users: the teams filing requests know where the tool confuses them.
  • Write docs for the requester’s task (“how to get a new environment”), not for your internals.
  • Version and announce changes, as you would for any API.
  • Retire the old manual path, so there’s one way to do it.

Takeaways

  • Automate the frequent, repetitive, well-understood requests first.
  • Build each operation from precondition, action, verification, rollback steps.
  • Guardrails and approvals are what let non-experts run it safely.
  • Give requesters visible status and readable errors.
  • Measure the self-serve rate; it’s the number that tells you whether you’re still a queue.
// TL;DR, in one picture
SELF-SERVE PLATFORMnew envdatabaseaccessdeployDNSbucketsecretqueueNOWSERVING#4512est. wait2 sprintsJIRAfill in 14fieldsthere is aperson inside→Self-serve, as experienced by every other team.ayushwing.com