Skip to content

Rethinking how internal requests found the right person

TL;DR

Diagnosis

The inherited concept already had “tasks”. What it lacked was the part that mattered: routing. The person reporting a lost package doesn’t know — and shouldn’t have to know — which team or person handles it; they just need to say what’s wrong. Direct messaging scales badly: you ping people in sequence until someone picks it up, and the time it eats grows exponentially. So the win wasn’t a fancier task list — it was a workflow layer that let you route a problem by type and let the right team pick it up. And it lived inside the platform where the order already was, so nobody had to switch tools.

flowchart TD
    subgraph Before["Before"]
        A1["Reporter messages person 1"] --> A2{"Reply?"}
        A2 -->|"no"| A3["Messages person 2, 3..."]
        A3 --> A2
        A2 -->|"yes"| A4["Someone finally picks it up"]
    end
    subgraph After["After"]
        B1["Report: problem type"] --> B2["Automatic routing to team"]
        B2 --> B3["Right team picks up the task"]
    end

    classDef good    fill:#e6f2ea,stroke:none,color:#1f4d33,rx:14,ry:14
    classDef bad     fill:#faeaea,stroke:none,color:#5f2626,rx:14,ry:14
    classDef accent  fill:#27272a,stroke:#3f3f46,stroke-width:1px,color:#fafafa,rx:14,ry:14
    class A1,A2,A3,A4 bad
    class B1,B2 good
    class B3 accent
    style Before fill:transparent,stroke:#a1a1aa,stroke-width:1px,rx:14,ry:14
    style After fill:transparent,stroke:#a1a1aa,stroke-width:1px,rx:14,ry:14
    linkStyle default stroke:#a8a8b3,stroke-width:1.5px

What I did

Results

#WorkflowStatus
1Lost packagelive
2Invoice correctionlive
3Refundlive
4Shipping statuslive
5–10+other request typeslive

The problem

Why were internal requests so slow?

A custom-order business runs as a chain — spec, quote, production, shipping, invoicing — and any link can break. When something went wrong (a lost package, a wrong invoice), the person who spotted it, often customer service, had to message colleagues one by one until someone picked it up. They didn’t know who would handle it; there was no system. That kind of direct communication doesn’t scale — the time it eats grows exponentially, and there’s zero visibility into what’s open or who’s on it.

Why not just buy a ticketing tool?

Because the work already lives in the order-management platform. Sending people to a separate tool means context switching — another login, another place to look, another thing that drifts out of sync. The system had to be minimal and live where the order was.

My role / scope

Process

Key decisions & trade-offs

flowchart LR
    O["Order view<br/>existing platform"] --> T["Task system + routing<br/>built in"]
    Alt["Separate ticketing system"] -->|"another login, context switching"| O

    classDef good    fill:#e6f2ea,stroke:none,color:#1f4d33,rx:14,ry:14
    classDef bad     fill:#faeaea,stroke:none,color:#5f2626,rx:14,ry:14
    classDef accent  fill:#27272a,stroke:#3f3f46,stroke-width:1px,color:#fafafa,rx:14,ry:14
    class O good
    class T accent
    class Alt bad
    linkStyle default stroke:#a8a8b3,stroke-width:1.5px

How it turned out

The system shipped and got adopted fast — ~10+ workflows and ~300 tasks a month within the first three months — and it unlocked handling-time monitoring per process, which direct messaging never could. The clearest signal from the teams: open cases were easy to monitor, and delegation during unplanned absences (sick leave) became trivial, because a task routed by type was no longer hostage to one person’s inbox. I left before the planned command palette and auto-assignment — so I’ll claim the shipped core and its adoption, not the features that came after.

What I took away