Teams don’t need another dashboard that looks clever in a demo. They need Tuesday to hurt less. We measure delivery by what disappears: duplicate entry, waiting on a person who already left, screens that ask the same question twice.
Friction we tracked on one rollout
Numbers below are from a mid-market ops tool — anonymized, but directionally honest. The win wasn’t a new feature page. It was fewer handoffs.
- −41% — manual re-entry (week 6 vs baseline)
- 18 min — median ticket age ↓ (support queue)
- 3→1 — systems touched / task (core path only)
Architecture that stays boring
Integrations, ownership, and reliability are the quiet part. Fancy graphs don’t make Friday lighter — clear ownership of the write path does.
Slice plan for a typical integration
| Slice | Scope | Done when |
|---|---|---|
| 01 Read | Pull source of truth | Staging parity check |
| 02 Write | One happy-path create | Idempotent retry |
| 03 Edge | Conflicts + audit | Ops can explain failures |
| 04 Cutover | Shadow → live | Rollback rehearsed |
A contract the UI can trust
We prefer explicit result types over silent nulls. The frontend shouldn’t guess whether a sync failed or is still running.
// sync.ts
type SyncResult =
| { status: "ok"; id: string; at: string }
| { status: "queued"; jobId: string }
| { status: "error"; code: string; retryable: boolean };
export async function syncOrder(id: string): Promise<SyncResult> {
const res = await api.post(`/orders/${id}/sync`);
if (!res.ok) {
return { status: "error", code: res.code, retryable: res.retryable };
}
return res.body.queued
? { status: "queued", jobId: res.body.jobId }
: { status: "ok", id: res.body.id, at: res.body.at };
}
Ship in slices. Use early. Tighten fast. Leave theatre for the stage.
“If it only impresses and doesn’t relieve — it was the wrong build.”