Skip to content
All work

03 / Case study

OnsetOn-call incident app

Mobile · DevOps · Offline-first

  • Mobile UX
  • AI in the loop
  • Design system
Three Onset phones angled on a dark green-lit background: the on-call schedule with an October 2026 calendar, the incident detail for a 5xx spike on /checkout with an AI reading at 82%, and the active incidents feed sorted by severity.

Onset - an on-call incident response app for the moment an engineer is woken by an alert and has to choose, in the dark, whether to take it or hand it on.

Self-initiated concept project · 2026

Role
Product designer - research, IA, UI, design system
Scope
10 screens, 30 frames, 1 design system
Platform
Mobile only (390 × 844)
Timeframe
5 weeks
Tools
Figma, Claude Design
Research
Competitive teardown, heuristic evaluation - no user testing

02 / THE PROBLEM

THE TOOL IS BUILT FOR A DESK.THE INCIDENT ISN'T.

On-call means carrying the pager for a week. Most of that week is quiet. The product only matters in the minutes it isn't.

At 03:40 an alert fires. The engineer is in bed, in the dark, holding the phone in one hand, with maybe a minute of coherent thought. The decision is small and consequential: take it, or escalate to someone who can.

Every incident platform on the market was designed for a browser and given a phone app afterwards. A teardown of five - PagerDuty, Opsgenie, incident.io, Grafana OnCall and Better Stack - showed the same shape in all of them: the mobile app is a viewport onto a web product. Dense text, full-brightness white surfaces, primary actions in the header, and severity communicated by reading rather than by seeing.

None of that is wrong at a desk. All of it is wrong at 03:40.

Onset starts from the opposite end. It assumes the phone is the only device, the room is dark, one hand is occupied, and the user is not yet fully awake.

03 / THE SYSTEM

A PRODUCT USED AT 3AMIS A PRODUCT ABOUT LIGHT.

The design system came before the screens, so it comes first here too: seven foundation pages and 15 documented components, with every state rendered rather than described. Everything in the scenarios below is built from these parts.

Its most specific decision is a second mode. Night Dim is enabled automatically during the user's quiet hours. Pure white appears nowhere; primary text tops out below it. Glass surfaces drop to a third of their opacity. Severity colours desaturate by roughly 20% and were then re-measured, not assumed.

P1 is the single exception. Critical keeps full luminance in both modes. If the building is on fire, the user is allowed to be dazzled.

Four rules held across every screen.

  • Colour is never alone. Severity is always colour plus icon plus text label. Rendered under simulated deuteranopia the three severity hues converge almost completely - and roughly 8% of male engineers are red-green colourblind, and they are on call too.
  • Contrast is measured on the composite. Every ratio is checked against the flattened glass surface the text actually sits on, not against the base background. Two tokens fell short and were restricted rather than repainted: muted text to 24px and above, and the deep violet to fills and meter tracks, never type.
  • Red is spent on one thing. Severity, and nothing else. Offline is neutral. A declined cover request is neutral. Sync failure is neutral. That restraint is what keeps red legible at 3am.
  • The thumb defines the layout. Minimum target 48×48, primary actions 56px and full width, everything critical in the bottom third. Nothing important sits in a header that the hand holding the phone cannot reach.
  • Colour tokens board: base surfaces bg-base, bg-raised and bg-sunken, and the ambient petrol glow kept at a separate hue from the status colours.
  • Colour tokens board: glass fill, glass fill active and glass border tokens, and text tokens with measured contrast of 16.1, 7.0, 3.2 and 17.8 to 1.
  • Colour tokens board: P1 critical, P2 warning, P3 low and resolved severity colours with icons and contrast ratios, the violet AI accent gradient, and utility tokens including the focus ring.
  • Night Dim board: the same P2 incident card in standard and Night Dim modes, and a table of token deltas for text, glass fill, severity and AI accent.
  • Night Dim rules: no pure white, severity desaturated about 20% then verified, the AI gradient flattens, and P1 keeps full luminance as the one exception.
Foundation - colour tokens and the two modes
  • Controls board: segmented pill tabs in two-way and three-way variants, and the primary Acknowledge button in default, pressed, loading and disabled states.
  • Controls board: destructive Escalate button including the Tap again to escalate confirming state, ghost button states, and severity chips combining colour, icon and label.
  • Controls board: toggle switches, sync badges for queued, syncing, sent and failed, and the five-item bottom tab bar.
  • Touch rules board: 48 by 48 minimum tap target next to a 56px full-width primary button, and a reach-zone diagram with primary actions in the bottom third of a 390 by 844 screen.
  • Touch rules board: severity chips as designed and under simulated deuteranopia, and a verified contrast list for every text and severity token in both modes.
  • Touch rules board: interaction rules - pressed not hover, confirm the irreversible, never colour alone - and a Do not list.
Foundation - control states, touch targets, verified contrast

The incident surfaces are where the three layers meet - severity, glass and the AI accent. The AI card is specified at high and low confidence, because the low-confidence state is the one that keeps the high one honest.

  • Design system board: AI summary card collapsed, expanded at 82% confidence with a violet accent, and at low 38% confidence in neutral grey reading no strong match in the last 90 days; plus the AI badge and confidence meter.
  • Design system board: incident list row in unread, acknowledged, in progress and resolved states, and runbook checklist items marked done, running, open and not applicable.
  • Design system board: escalate bottom sheet, the neutral offline banner with 3 actions queued, and the status ring in all quiet, needs attention and P1 active states.
Incident surfaces - AI card at high and low confidence

04 / THE DECISION

ONE TAP TO ACCEPT.BUT NOT BY ACCIDENT.

The first screen is not in the app. It is the lock screen, because unlocking a phone is already too many steps.

The alert card occupies the lower two thirds of the screen - the only part a thumb reaches on a phone held in one hand. Above it, the time and date stay untouched, so the first thing the engineer reads is what hour it actually is.

The card carries four facts and nothing else: how severe, what broke, how long it has been broken, and what the metric did. The chart is there instead of an icon because an illustration answers none of those questions.

Acknowledging is a slide, not a tap.

A tap can be fired by a cheek, a pocket, or a hand swiping at a nightstand. A false acknowledgement tells the system a human is awake and handling the incident when nobody is - and silences the escalation that would have woken someone else. A slide cannot happen by accident. It is the one place in this product where friction is the feature.

  • Lock screen at 3:41 with a P1 critical alert card: Checkout API error rate 47%, a rising error chart crossing the 5% threshold, 1 service down, about 8,400 users hit, and a Slide to acknowledge control.
  • The same lock screen alert with the acknowledge handle dragged halfway across the track, the label changing to Release to acknowledge.
Lock screen alert - at rest and mid-slide

Inside the app, the feed is read by its left edge. Every row carries a 4px severity bar, so the first pass is a vertical rhythm of red, amber and green marks - a shape, not a list. Text is the second pass, for the row that already caught the eye.

Rows are deliberately dense: three lines, ~96px tall, six visible without scrolling. During a bad night an engineer has eight to fourteen open incidents, and a feed that shows three of them at a time has failed at its only job.

  • On call feed: counters for 5 active, 3 acked and 12 resolved in 24 hours, All / Mine / Unacked tabs, and active incidents sorted by severity, each row with a coloured left bar, service name, title, P1 or P2 chip, timer, assignee and a sparkline.
Incident feed - sorted by severity

05 / AI

THE MODEL READS THE DATA.THE ENGINEER OWNS THE CALL.

An incident generates more signal than anyone can read at 03:40: metrics, logs, deploy history, dependency graphs. Correlating them is exactly what a model is good at, and exactly what a half-awake human is bad at.

So Onset puts an AI reading on the incident detail screen. It states a likely cause, a suggested fix, and the signals it was built from.

Three rules hold everywhere it appears.

  • It is labelled and quantified. Every AI surface carries the violet accent, the word AI, and a confidence value written as text. The colour alone never signals provenance - that would fail the product's own accessibility rules.
  • It is traceable. "Built from 3 signals" is a link, not a reassurance. The suggestion can be opened back into the data it came from.
  • It never acts. The model drafts, proposes and summarises. Applying a fix, sending a message, acknowledging an incident and completing a runbook step are all human taps, always.
  • Incident detail for 5xx spike on /checkout, P1 critical: error-rate chart above the 5% threshold, elapsed 00:47:12, 2,140 failed requests, and an expanded AI card at 82% confidence with the likely cause, a suggested fix, a Built from 3 signals link and an Apply fix button.
  • Lower part of incident detail: affected services checkout-service, payment-gateway and cart-service with severity bars and sparklines, similar past incidents with AI 64% badges, and Start runbook, Escalate and Post status actions.
Incident detail - AI reading, blast radius, affected services

Facts and inference are also kept physically apart on the screen. A plain prose block states what is known - thresholds, timings, the deploy four hours earlier - with no interpretation in it. The interpretation sits above, inside a card that announces itself as a model output.

The same card also knows when to step back. When the model has nothing, it says so. Below 50% confidence the card drops the violet entirely - no gradient, no accent border - and reads "no strong match in the last 90 days". The accent is earned by confidence, not granted by category.

A model that is confident about everything is a model nobody checks.

06 / THE RECORD

EVERY DECISIONHAS AN AUTHOR.

Two days after the incident there is a postmortem. Two hours into it, someone new is pulled in and asks the only question that matters: what has already been tried?

The timeline answers both. It is the live "what's been done" during the incident and the record afterwards, and it is the same screen.

Entries come in three visually distinct node types - a system event, a human action, and an AI suggestion. A circle with a monochrome icon, a circle with a face, and a violet rounded square. Scanning the line tells you which decisions a person made and which a machine proposed, before reading a word.

Timestamps are absolute, not relative. And gaps are shown, not smoothed: wherever more than five minutes passed between two entries the line breaks and labels the silence. Empty time is usually the finding.

Above the timeline, a phase bar splits the elapsed time into detect, acknowledge, diagnose and fix, with the longest phase named in a sentence. The postmortem's first question is answered before anyone asks it.

  • Timeline screen: elapsed 00:47:12 with a phase bar of detect 3m, ack 4m, diagnose 26m and fixing 14m, captioned Diagnosis took 26 minutes, the longest phase; below, entries for the alert, the acknowledgement and an AI-suggested cause.
  • Timeline with the runbook entry expanded to 3 of 7 steps, then an auto-recheck, an escalation to Elli Brandt, a status post and an AI-suggested fix marked not applied, with +9, +10 and +7 minute gap labels.
  • End of the timeline with the incident still open at 04:24, followed by open threads: Elli has not responded for 6 minutes, an AI fix awaiting decision, and a status update due in 03:47.
Timeline - phase bar, expanded runbook, open threads

The runbook is the same principle applied to procedure. One step is open at a time; completed steps collapse, upcoming steps stay quiet. Commands can be copied but not executed - running infrastructure commands from an unverified phone at 4am creates the second incident, and the interface says so rather than hiding the capability.

The step that mattered most to design was the one nobody builds: "not applicable".

Runbooks are written for the general case and a real incident rarely matches it. Without an honest way to skip, people either tick a box for work they didn't do or abandon the runbook entirely. In Onset a skip requires one line of reason, renders with a dash rather than a green check, and is routed to the runbook's owner. A skipped step is how a runbook gets fixed.

  • Pool exhaustion runbook at 3 of 7: two steps done, one skipped as not our setup, and step 4 Raise the pool ceiling open with a copyable kubectl command, a note that Onset does not execute commands from a phone, and the expected result.
  • Why skip this step bottom sheet over the runbook, with reasons Already true, Not our setup and Step is outdated, an optional detail field and a Skip and record the reason button.
  • Runbook step 4 with an AI explanation at 74% confidence describing where the pool ceiling lives, linked to the runbook and 2 past incidents and labelled explanation only, above Mark done and Not applicable buttons.
Runbook - current step, skip reason, AI explanation

07 / COMMUNICATION

TWO AUDIENCES.ONE OF THEM CAN'T BE UNTOLD.

Thirty-four colleagues and an unknown number of customers are waiting to hear something. The engineer has about forty seconds and no capacity to compose careful prose.

The composer never starts empty. A draft is generated from the incident data and is plainly editable, with the AI strip visually separated from the text it produced. The model solves the blank page; the engineer owns the words.

The screen's real work is the distinction between the two audiences. Selecting "Public" changes three things at once: a warning rule appears on the destination line, the "estimated users affected" toggle switches itself off, and the send button requires a second tap inside a three-second window.

Before any of that, the preview renders the same source text twice - once as a Slack message, once as a status-page entry - because an update that reads fine internally can read very differently to a customer.

  • Post update composer set to Internal for #incidents, 34 people: stage chips, an AI-drafted message at 91% confidence marked edited, and include toggles.
  • The same composer with Public selected: an amber warning line reads status.company.com, visible to customers, above the stage chips and the drafted message.
  • Preview sheet showing the same update twice, once as an Onset app message in #incidents and once as an Investigating entry on status.company.com, with a Back to editing button.
Status composer - internal, public, preview

The last communication is the one most often skipped. At 09:00 the shift changes, and an unspoken handoff is how a twenty-minute incident becomes a two-hour one.

The handoff sheet is pre-filled from the shift itself - open incidents, services that went unstable, anything deferred - and asks for the one thing the data cannot supply: anything else the next person should know.

  • Schedule tab: You are on call card with 14:22:41 remaining until Friday 09:00, next on call Elli Brandt, 2 open incidents and 1 unstable service, and an October 2026 calendar marking shifts and incidents.
  • Hand off to Elli Brandt sheet, summarised from the shift by AI at 88%: open P1 and P2 incidents, an unstable service, a deferred follow-up, a free-text field for anything else, and a Complete handoff button.
Schedule - current shift and handoff

08 / OFFLINE

THE NETWORK IS THE ONE THINGON-CALL CAN'T ASSUME.

A datacenter basement, a train, a rural house at 3am. Offline is not an edge case in this product - it is a Tuesday.

Most of the app keeps working. Acknowledge, escalate, the cached runbooks for the engineer's own services, timeline notes and the schedule all queue locally and send when the connection returns.

Three decisions make that queue honest rather than reassuring.

  • Actions keep the time they were performed. A postmortem that shows an acknowledgement at 04:02 instead of 03:41 tells a false story about response time, and the engineer is the one who pays for it.
  • Stale data is marked as stale. The chart stops at the last synced point and the remaining width is hatched and labelled. A flat line would read as recovery.
  • The escalation timer keeps running, and the screen says so. The most dangerous offline failure is an engineer who believes they have taken the incident while the system does not know it. A warning card counts down to the moment the secondary on-call is alerted, and offers the one path that needs no data - a phone call.
  • Offline banner with 3 actions queued, two queued actions and one failed note with a Retry button, the line Actions keep the time you performed them, and an amber card: Escalation timer is still running, 01:47, with a Call Elli directly button.
  • Offline incident screen: last synced 03:44, six minutes ago, the error chart stopping at 03:44 with the rest of the width hatched as no data, and a Waiting to send list of queued actions.
Offline - queued actions, escalation countdown, frozen chart

One action is deliberately blocked rather than queued. A public status update that sends minutes later, stamped with the send time, publishes stale information to customers - worse than publishing nothing. Internal actions queue; external ones wait for a human to reconfirm.

  • Available offline list: acknowledge and escalate, runbook checklist cached for 3 services, timeline notes and on-call schedule work offline; post public status update, live metrics and logs and AI analysis need a connection.
  • Back online, syncing 3 actions: one sent, one syncing, one queued, with the note that actions are sent with their original times and a toast: 3 actions sent, acknowledgement recorded at 03:41.
Offline - what works, what waits, and reconnection

09 / RESTING STATE

MOST OF THE WEEKNOTHING IS ON FIRE.

Between incidents the app has two jobs: say truthfully that nothing is wrong, and let the engineer decide what is allowed to wake them.

  • Status screen in P1 active state: a red ring with the number 1, checkout-service is failing, acknowledged 47 minutes ago, with the open P1 row and a collapsed AI card.
  • Status screen in needs attention state: an amber ring with the number 2, two open incidents neither critical, listing two P2 rows.
  • Status screen in all quiet state: a green ring with a zero, 24 services nominal for the last 6 hours, one resolved P3 today and the next handoff to Elli Brandt on Friday 09:00.
Status - one screen, three states

The status screen is the product's resting state, and the only place a glow is permitted. The ring is a dial, not decoration: it carries the count of what is open and takes its colour from the highest severity in it. Green with a zero in the middle is semantically honest - nothing is on fire.

  • Quiet hours settings from 22:00 until 07:00 with the threshold set to P1 only, and a note: over the last 30 days this setting would have silenced 47 alerts and let 3 through.
  • Quiet hours continued: per-service overrides, delivery options for push, phone call and repeat until acknowledged, and the Night Dim toggle with a standard versus dimmed preview.
Quiet hours - threshold, overrides, night dim

Quiet hours are the screen where the trade is made explicit. The engineer is not switching off notifications, they are choosing a threshold - and the interface prints the consequence: over the last 30 days this setting would have silenced 47 alerts and let 3 through. A setting that hides its odds is a setting people turn off entirely.

10 / WHAT WAS TESTED

NO USERS.SAY SO PLAINLY.

This case study has no usability test behind it, and inventing one would be the easiest lie in a portfolio. What it has instead is a teardown of five competitors, a heuristic evaluation against Nielsen's ten, and a set of measured contrast ratios.

Heuristic findings that changed the design

HeuristicFinding and change
Visibility of system statusAn offline acknowledgement looked identical to a confirmed one. Added the escalation countdown card and the "performed at" timestamp on queued actions.
Error preventionTap-to-acknowledge could fire in a pocket. Replaced with a slide gesture.
Match with the real worldThe runbook had no way to say "this step doesn't apply here". Added skip-with-reason as a first-class state, routed to the runbook owner.
User control and freedomA public status update could not be recalled. Added the dual preview and a second-tap confirm.
Aesthetic and minimalistThe first lock-screen build tinted the entire card red. Squinting at it from across the room showed one red rectangle and no hierarchy. Red was cut to an 8% tint plus the severity bar, and the acknowledge control was made the only light element on the card.

Verified contrast · measured on the flattened glass surface

TokenStandardNight Dim
Primary text16.1:111.4:1
Secondary text7.0:14.7:1
P1 critical5.4:15.6:1
P2 warning9.7:19.0:1
P3 low9.5:18.6:1
AI accent (type)6.5:14.9:1

Two tokens land below 4.5:1 and are documented as restricted rather than quietly used: muted text at 3.2:1 is limited to 24px and above and to non-essential marks, and the deep violet at 4.1:1 is limited to fills, borders and meter tracks. Publishing the failures next to the passes is the part that makes the table worth anything.

11 / LIMITS

WHAT THIS IS,AND WHAT IT ISN'T.

This is a self-initiated concept project, not a shipped product. No customer, no production data, no on-call rotation that actually paged anyone.

What that means in practice:

  • Nobody was woken at 3am to test it. Every claim about the 03:40 state comes from public postmortems, competitor teardown and reasoning - not from observation. A real evaluation of this product would have to be run at night, on tired people, and that is the study this case study is missing.
  • One role is designed for. The responder. An incident commander coordinating several people, an engineering manager watching from outside, and the support team fielding customer questions all have a claim on this product and none of them are designed for.
  • Runbook authoring is out of scope. Onset executes runbooks; it does not help anyone write or maintain one - which is where most of the real failure lives.
  • Alert routing and escalation policy are assumed. The rules that decide who gets paged in the first place are configured elsewhere, on a web product this case study does not cover.
  • The system contradicted itself twice, and both are documented. The ambient background used green while the system forbade tinting the base with a status hue; it was resolved by giving the ambient its own deep petrol token at a separate hue, not by ignoring the rule. The status ring glows in three colours while the system permits one glow - resolved by reclassifying it from an empty-state decoration to a status dial. A system that never needs amending was never used.

Next: the incident commander view, and the authoring side of runbooks.

12 / THE FLOW

ALERT. DECIDE.WORK. HAND OVER.

The full flow, in order - every screen from the first alert to the return to quiet.

  • Lock screen at 3:41 with a P1 critical alert card: Checkout API error rate 47%, a rising error chart crossing the 5% threshold, 1 service down, about 8,400 users hit, and a Slide to acknowledge control.
  • The same lock screen alert with the acknowledge handle dragged halfway across the track, the label changing to Release to acknowledge.
  • On call feed: counters for 5 active, 3 acked and 12 resolved in 24 hours, All / Mine / Unacked tabs, and active incidents sorted by severity, each row with a coloured left bar, service name, title, P1 or P2 chip, timer, assignee and a sparkline.
01-02 · Lock screen alert · Slide to acknowledge · Incident feed
  • Incident detail for 5xx spike on /checkout, P1 critical: error-rate chart above the 5% threshold, elapsed 00:47:12, 2,140 failed requests, and an expanded AI card at 82% confidence with the likely cause, a suggested fix, a Built from 3 signals link and an Apply fix button.
  • Lower part of incident detail: affected services checkout-service, payment-gateway and cart-service with severity bars and sparklines, similar past incidents with AI 64% badges, and Start runbook, Escalate and Post status actions.
03 · Incident detail · Affected services
  • Timeline screen: elapsed 00:47:12 with a phase bar of detect 3m, ack 4m, diagnose 26m and fixing 14m, captioned Diagnosis took 26 minutes, the longest phase; below, entries for the alert, the acknowledgement and an AI-suggested cause.
  • Timeline with the runbook entry expanded to 3 of 7 steps, then an auto-recheck, an escalation to Elli Brandt, a status post and an AI-suggested fix marked not applied, with +9, +10 and +7 minute gap labels.
  • End of the timeline with the incident still open at 04:24, followed by open threads: Elli has not responded for 6 minutes, an AI fix awaiting decision, and a status update due in 03:47.
04 · Timeline · Expanded runbook · Open threads
  • Pool exhaustion runbook at 3 of 7: two steps done, one skipped as not our setup, and step 4 Raise the pool ceiling open with a copyable kubectl command, a note that Onset does not execute commands from a phone, and the expected result.
  • Why skip this step bottom sheet over the runbook, with reasons Already true, Not our setup and Step is outdated, an optional detail field and a Skip and record the reason button.
  • Runbook step 4 with an AI explanation at 74% confidence describing where the pool ceiling lives, linked to the runbook and 2 past incidents and labelled explanation only, above Mark done and Not applicable buttons.
05 · Runbook step · Skip reason · AI explanation
  • Post update composer set to Internal for #incidents, 34 people: stage chips, an AI-drafted message at 91% confidence marked edited, and include toggles.
  • The same composer with Public selected: an amber warning line reads status.company.com, visible to customers, above the stage chips and the drafted message.
  • Preview sheet showing the same update twice, once as an Onset app message in #incidents and once as an Investigating entry on status.company.com, with a Back to editing button.
06 · Internal update · Public update · Preview
  • Schedule tab: You are on call card with 14:22:41 remaining until Friday 09:00, next on call Elli Brandt, 2 open incidents and 1 unstable service, and an October 2026 calendar marking shifts and incidents.
  • Hand off to Elli Brandt sheet, summarised from the shift by AI at 88%: open P1 and P2 incidents, an unstable service, a deferred follow-up, a free-text field for anything else, and a Complete handoff button.
07 · Current shift · Handoff
  • Quiet hours settings from 22:00 until 07:00 with the threshold set to P1 only, and a note: over the last 30 days this setting would have silenced 47 alerts and let 3 through.
  • Quiet hours continued: per-service overrides, delivery options for push, phone call and repeat until acknowledged, and the Night Dim toggle with a standard versus dimmed preview.
08 · Quiet hours threshold · Overrides and Night Dim
  • Offline incident screen: last synced 03:44, six minutes ago, the error chart stopping at 03:44 with the rest of the width hatched as no data, and a Waiting to send list of queued actions.
  • Offline banner with 3 actions queued, two queued actions and one failed note with a Retry button, the line Actions keep the time you performed them, and an amber card: Escalation timer is still running, 01:47, with a Call Elli directly button.
09 · Frozen chart · Queue and escalation countdown
  • Available offline list: acknowledge and escalate, runbook checklist cached for 3 services, timeline notes and on-call schedule work offline; post public status update, live metrics and logs and AI analysis need a connection.
  • Back online, syncing 3 actions: one sent, one syncing, one queued, with the note that actions are sent with their original times and a toast: 3 actions sent, acknowledgement recorded at 03:41.
09 · What works offline · Reconnection
  • Status screen in P1 active state: a red ring with the number 1, checkout-service is failing, acknowledged 47 minutes ago, with the open P1 row and a collapsed AI card.
  • Status screen in needs attention state: an amber ring with the number 2, two open incidents neither critical, listing two P2 rows.
  • Status screen in all quiet state: a green ring with a zero, 24 services nominal for the last 6 hours, one resolved P3 today and the next handoff to Elli Brandt on Friday 09:00.
10 · Status - P1 active · Needs attention · All quiet

Next case study

  • 01 / Case study

    Marp B2B revenue analytics

    Responsive · B2B SaaS · Device handoff

    A setup assistant that proposes metrics, segments and a first dashboard — then makes every one of them easy to reject. Configuration you edit is faster than configuration you write, and safer than configuration you inherit.

    Read case study
    Marp on a light blue background: the mobile sign-up screen promising a first dashboard in about 10 minutes, next to the desktop revenue dashboard with a lime Your dashboard is ready card and this month's KPI tiles.
    • Responsive UX
    • AI in the loop
    • Design system