# X_NOTIFY_STORE_MISSING

## Means

a channel needs a store nothing installed

## Typical cause

an in-app channel with no inbox store, a digest window with no digest store, or — in staging and production only — a delivery claim with no ledger. The ledger's memory default is one process's heap, so outside development and test it refuses rather than let a replay on another replica, or after a restart, send twice; the cli boot installs a Postgres ledger (`x_notify_deliveries`) when the app has a database, so this fires only for an app with none and no `notifyStores.ledger`. An inbox and a digest window have no default at all: there is nowhere to put the row, so they refuse rather than skip. Never an optional chain at the call site, because a silently skipped inbox write is a notification the user never sees and nobody logs. `cause` and `meta.store` name which store is absent

## Fix

`export const runtime = { notifyStores: { inbox: memoryInboxStore(), digest: memoryDigestStore() } }` in `apps/<app>/runtime.ts` — **one object**, naming every store this app wants: it is whole-object replacement and never a merge. `postgresInboxStore({ executor })` shares the inbox across replicas

[Notifications](/error-codes#notifications)
