VibeDay

Notifications

Inbox for failed publishes, reauth prompts, content alerts. Configure per-type email delivery from settings.

Status: M8 shipped 2026-05-24. Bell, inbox, preferences all live. First production dispatch hook wired (PLATFORM_DISCONNECTED); more surfaces (scheduler runway, post publish results, generation batch completion) plug in as M9 and M10 land.

The notification framework keeps you informed about everything that happens in your workspace without making you go hunt for it. Two surfaces:

  • Bell menu (top-right of every dashboard page) — quick glance at the last 12 events, unread badge.
  • Inbox at /notifications — full history with All / Unread filters and per-row actions.

Each notification can be delivered to two channels independently:

  • In-app — appears in the bell + inbox; the badge counts unread.
  • Email — sent to your account email via Resend. Email body mirrors the in-app body and includes a button back to the in-app surface.

You control which combinations fire at Settings → Notifications. Each event has a sensible default (high-signal events default-on for email; chatty ones default-on for in-app only).

What you'll see notifications for

Grouped by surface:

Scheduling

  • Schedule queue running low — your predicted runway dropped below the threshold (default 5 days). Default: in-app + email.
  • Schedule out of content — the next slot can't be filled. Default: in-app + email.
  • Schedule auto-paused — VibeDay paused a schedule on your behalf (typically after repeated publish failures). Default: in-app + email.

Posts

  • Post published — confirmation when a scheduled post goes out cleanly. Default: in-app only (high volume).
  • Post failed to publish — the platform rejected it or an error occurred. The notification includes the platform's actual error and a suggested fix. Default: in-app + email.

Generation

  • Generation ready for review — an AI batch finished and there's content waiting for approval. Default: in-app only.

Platform connections

  • Account disconnected — confirmation when a Facebook / Instagram / TikTok account is removed. Default: in-app only.
  • Account needs to reconnect — the platform expired your token (typical: password change on Facebook). Default: in-app + email — because no posts publish until you reconnect.

Workspace

  • Workspace suspended — billing failure or policy violation. Default: in-app + email.
  • New member invited — admin invited someone. Default: in-app only.
  • New member joined — invite was accepted. Default: in-app only.

Bell menu

Click the bell icon (top right). The dropdown shows the last 12 events. Each row:

  • Type label (e.g. "Schedule queue running low") in small caps
  • One-line title
  • Two-line body preview
  • Relative timestamp (just now / 14m / 3h / 2d)
  • An unread dot for items you haven't seen

Click a row to mark it read and navigate to the in-app context. Click Mark all read to clear the badge. Open inbox → opens the full inbox.

Full inbox

/notifications shows your complete history (up to 200 most recent) with two filters: All and Unread. Each row has the same title + body + timestamp, plus two per-row links:

  • Open → jumps to the in-app surface (and marks the row read)
  • Mark as read — clear the unread state without leaving the page

The header Mark all read button clears the entire unread queue at once.

Preferences

/settings/notifications shows every notification type, grouped by surface, with two toggles per row:

  • In app — appears in bell + inbox
  • Email — sends to your account email

Both default to a sensible value; turning either off mutes that channel for that type. Changes save immediately (optimistic — if the server rejects, the toggle reverts and you get a toast).

Email delivery

When the email channel is enabled, VibeDay sends through Resend from hello@vibeday.com. The email:

  • Subject prefixed with the event label, e.g. "Post failed to publish: Lemon ginger morning routine"
  • Workspace name in the header
  • Same body as the in-app notification
  • A blue Open in VibeDay button linking to the in-app context
  • Footer link to manage preferences

Email is best-effort. If Resend can't deliver (rate limit, transient error, invalid address), the in-app row is still written and the failure is logged for triage. We don't retry email automatically. We do not mark emails as sent unless Resend confirms acceptance.

What's NOT live yet

The framework dispatches on these the moment the corresponding feature lands:

  • SCHEDULE_QUEUE_LOW / SCHEDULE_QUEUE_EXHAUSTED — needs the M9 cadence resolver to calculate runway.
  • POST_PUBLISHED / POST_FAILED — needs the M10 Inngest publish runtime to know when a post actually publishes.
  • GENERATION_READY — to be wired into the topic batch flow.
  • PLATFORM_REAUTH_REQUIRED — to be wired into the OAuth retry / refresh paths.
  • Membership notifications — land alongside the multi-member workspace flow in a later sprint.

Currently emitting in production:

  • PLATFORM_DISCONNECTED — when you remove a connected platform account
  • SCHEDULE_QUEUE_LOW — when a schedule's predicted runway drops below its threshold (rate-limited to once per 20 hours per schedule)
  • SCHEDULE_QUEUE_EXHAUSTED — when a schedule has 0 days of runway left
  • POST_PUBLISHED — when a scheduled post publishes successfully (one notification per post; the body lists every target it went to, with a View link if the platform returned a URL)
  • POST_FAILED — when one or more targets fail; title distinguishes full-failure from partial; body lists each failed target's actual error
  • PLATFORM_REAUTH_REQUIRED — when a publish attempt hits an invalid/expired token; the affected account is flipped to NEEDS_REAUTH at the same time

For the technical shape (models, dispatcher, action catalog), see docs/technical/data-model.md and docs/technical/server-actions.md.


Still stuck?

Email support@vibeday.com with what you're trying to do and a screenshot if it helps — we'll write back within one business day.