Information Architecture Detail layer Node page

3.8 Alerts / Activity

The screen that decides whether the product is a source of calm or one more thing that buzzes at you.

Node 3.8Type: pageMVP Cluster 3 Stay Aheadnoindexinvented, not adapted

Specified with the template fixed on the etalon, node 1.1 Welcome. Source: docs/nodes/3-8-alerts.md. Composition from the block bank, type E. Supersedes this node's section of alerts.md.

Purpose and jobs

Close J4, never be surprised by a price change or a failed payment.

The category has no such screen. Subo and Orbit configure reminders per subscription and deliver them outside the app; Rocket Money sells the promise on its landing and exposes nothing behind it. On the craft side the good examples are enterprise audit logs, whose register is the opposite of ours. This node is invented, not adapted, and the bank says why.

JobsJ4 is primary. Feeds J2 and J3: an alert is the shortest path to the charge behind it.
URL/alerts. No breadcrumbs: it is a tab.
Entry, exitIn through GC2, or through the email that announced the alert. Out to node 2.7, 4.9, 6.16.
ComponentsGC1 app variant, GC2 Global Tab Bar, GC5 Alert Item (price-change, payment-failed, trial-ending, upcoming-charge, new-subscription), GC7 Pro Gate on Pro-depth alert types only, never on the two that carry J4.

The channel is email, decided 2026-08-10. This line said "or a push notification" until then. Tendd is a mobile-first responsive web app and a native app is out of scope, and on iOS web push only reaches a site the person has installed to their home screen, so push would have covered a minority of exactly this audience while reading on paper as though it covered everyone. J4 is "never be surprised", and a message that only exists inside the app cannot keep that promise. Push is deferred, not rejected, and it changes no block here when it arrives.

What each GC5 variant can actually know, settled 2026-08-10. Price-change and payment-failed are computed by us and have no field behind them in any bank API; the rules are in docs/bank-connection.md section 6. Trial-ending only fires on a subscription the person entered themselves, because a trial that has not charged produces no transaction, no stream and no date: there is nothing for a bank to report. The bank-side counterpart is the new-subscription variant at the other end of the same event, "the first full charge has landed", which is detectable and is the more useful half anyway.

Content blocks

#BlockCarriesFrom the bank
1App header (GC1)GC1TAKE
2"Needs you", usually empty: a failed payment in desaturated clay, a price change in amberJ4, principle 2, growth zone 3TAKE: exists in no source. A feed sorted by date makes the person scan to find out whether anything is wrong; sorting by whether it needs them answers that before they read
3"Just so you know": charges due in the next seven days, a newly detected subscriptionJ4TAKE
4The alert item (GC5): icon, one plain sentence, the merchant and the amount, when, the source, and one inline actionGC5, J4, principle 3, principle 4TAKE plus TAKE, DIFFERENTLY: an alert with no action is a notification; an alert that cannot say where it came from is a rumour
5Price change alerts show the old price, the new price and the differenceJ4, growth zone 2, D-ConceptTAKE: exists in no source. Every product tells you the new number; the old one beside it turns a surprise into an explanation
6Older, collapsedprinciple 2TAKE: the recent past is the job, the distant past is node 5.12
7What we tell you about, a link into node 6.16J4TAKE, DIFFERENTLY: one place instead of a reminder toggle on every subscription
8Tab bar (GC2)GC2TAKE

Named and not added: unread counts, badges and red dots - D-Concept says status is a quiet gray badge, never red, and a red badge on a money app is an anxiety machine for a person who already avoids opening it. Also not added: search, a filter row and a multi-column audit table (the enterprise register), and a notes field.

States, filters, the one action

NodeStateReads likeTrigger
-defaultBoth groups, "Needs you" usually emptyAnything to report
3.8.1All clear"Nothing needs your attention right now", and what would show up here if it didNothing to report
3.8.2Loading alertsA skeleton of the listFetch in progress
3.8.3Could not load alerts"Nothing is wrong with your money, we just could not reach your alerts"Fetch failed

On 3.8.1: in most products an empty feed reads as a dead end. Here it is the product working, and it is the most reassuring sentence in the app: designed as the best state, not the missing one. On 3.8.3: the error copy separates the two fears on purpose, because the first thought at an error on a money screen is that something happened to the money. Filters and facets: none, a handful of events is not an audit trail.

No primary CTA on the screen; one inside every item. The action belongs to the alert it concerns: "see what changed" to node 2.7, "what to do" for a failed payment, "help me cancel" to node 4.9. An empty screen has no action at all, and that is correct.

Responsive. Mobile: two groups, one column, the older section collapsed. Desktop: the same order at a wider measure; the groups never become columns side by side, because "needs you" must be read first and not scanned in parallel.

Emotional support

No mechanism from the table has this node as its home. E1 through the voice rules of every state, and most of all through the empty state, which says the product is working rather than that something is missing. Nothing else is claimed here.

SEO, locked, open

SEO. noindex, no schema. Private and personal.

Locked: the two groups, the inline action, the old price beside the new one, the empty state as the best state, no red badges. Open ?: which alert types are Free and which are Pro depth. D3 fixes the principle (price change and failed payment are basic, so they are free), but the full list is a pricing decision for the founder.

Done at the wireframe rebuild, 2026-08-05: the July screen was one feed sorted by date and it is now the two groups, every alert names its source and its date, the price change carries the old price beside the new one and the difference, and the empty state says what would appear here if it did.

Grey screen: wireframes/alerts.html. No coloured screen yet: only Home and Subscription Detail were taken into colour at Concept, and the rest arrive at UI + Visual (design/overview.html).