Notifications are the product’s clock — and users had learned to distrust it. I rebuilt the system end-to-end: a category × channel taxonomy, a rationed popover queue, and reminders the user schedules themselves.

{{ st.l }} {{ st.v }}
↓ scroll
Cubbi notification settings — category and channel control

Product Overview

{{ t }}

Cubbi is a B2B2C workplace meal-benefits service — employers fund benefits from an organization credit balance, employees order lunch delivered into the office fridge, admins run catering and the weekly grocery. Notifications serve both sides: “your lunch is delivered” for employees, low-balance warnings for admins.

This was the second notification system I designed from scratch — sole designer on the taxonomy, the settings model, every surface (web portal, mobile, push, email, SMS), the full content set, and the transactional email templates.

The release was rails, not a launch event: give the existing base flexible control over what arrives, and unblock the features and marketing campaigns that needed a sanctioned way to reach people — including an activity page that can carry promo and special-offer banners.

Project timeline — settings, feed, then measurement
{{ t.t }} {{ t.sub }}
Phase 1 — System Phase 2 — Surfaces Phase 3 — Analysis

Research methods

{{ m.t }}
{{ m.d }}
Research artifacts
01 / 04
Notification lifecycle — employee, admin, city manager and the system engine
One event, four actors

An event enters the engine, gets typed by category, is ranked against the popover budget, then fans out across channels. Each lane is an actor; the bottom lane is the engine — where the ordering rules actually live.

Popover queue — the gate deciding what may interrupt
One interruption per session

Every event lands in a per-account queue, and a gate decides whether it may interrupt: never mid-checkout, never twice a session, always the highest rank first. Whatever the gate refuses still reaches the user in the activity feed.

Trigger events matrix — category, priority, channel and surface per event
Every event, typed and ranked

Each notification the system can raise, with the category that types it, the rank it carries into the queue, the channels it may use, and where it lands. Order reminders are the only row the user schedules directly.

Rating loop — delivery is time-critical, the rating request is queued
Why the rating loop is fragile

Delivery is time-critical and shows at once; the rating request that follows is not — it joins the queue and competes for the single popover a session allows. Everything downstream only turns in the sessions where it wins.

Users

{{ a.name }} {{ a.roleLine }}
When{{ j.w }}
I want to{{ j.i }}
So I can{{ j.so }}
{{ j.note }}
Stage
User action
Emotion
Pain point
Design response
{{ st.num }}{{ st.name }}
{{ st.action }}
{{ st.emotion }}
{{ st.pain }}
{{ st.response }}

Problems

{{ p.n }}
{{ p.descPre }}{{ p.descHl }}{{ p.descPost }}
+
{{ q.label }}

{{ q.text }}

Key Decisions

{{ d.fig }}
{{ d.tPre }}{{ d.tHl }}{{ d.tPost }}
+
{{ d.label }}

{{ d.d }}

Design Solutions

01 / 08
{{ im.el }}
{{ s.t }}

{{ s.d }}

The Outcomes

{{ o.n }}
{{ o.delta }} {{ o.delta2 }}
+
{{ o.t }}

{{ o.dPre }}{{ o.dHl }}{{ o.dPost }}

The Learnings

{{ l.n }}
{{ l.tPre }}{{ l.tHl }}{{ l.tPost }}
+

{{ l.d }}