Notifications
Per-user email preferences for the active workspace, and what's always sent.
Each user can pick which emails they receive about workspace activity. Preferences are scoped to a single organization, so the same person can have a different mix per workspace they belong to.
Manage your preferences at /dashboard/settings/notifications.
What's user-overridable
Each toggle below is on or off per user, per workspace. Defaults are picked so a brand-new admin is notified about the things they'd want to know without being buried.
| Event | Default | Sent to |
|---|---|---|
| New affiliate application | On | Owner, Admin, Manager |
| Team member joined | On | Owner, Admin |
| Broadcast send completed | Off | Owner, Admin, Manager |
| API key created | On | Owner |
| Commissions due reminder | On | Owner, Admin |
What's always sent (transactional)
These emails are tied to the legal, financial, or operational state of your account and cannot be disabled. They show in the settings UI with an "Always on" badge so you know what to expect in your inbox.
| Event | Sent to |
|---|---|
| Trial started | Billing contact |
| Trial ending soon | Billing contact |
| Trial expired | Billing contact |
| Payment receipt | Billing contact |
| Payment failed | Billing contact |
| Plan changed | Billing contact |
| Subscription cancelled | Billing contact |
| Migration import failed | Owner, Admin |
| Payout failed | Owner, Admin |
Billing & subscription notices (trials, payments, plan changes, cancellation) go to the workspace billing contact — the BillingEmail on the organization — independent of which users are members. Operational alerts (migration import failed, payout failed) fan out to the workspace Owners and Admins instead, since they're the ones who act on them.
How it works under the hood
- Preferences live in the
notification_preferencestable:(user_id, organization_id, event_key, is_enabled). Absence of a row means "use the event's default." - The dispatcher resolves recipients per event by querying workspace members with the right role, then filters each through
INotificationPreferenceService.IsEnabledAsync()before calling the email sender. - Non-overridable events bypass the table entirely; even if a row says
is_enabled = false, the dispatcher ignores it for legal/transactional events.
Adding new notifications
When a new event is added to the catalog it appears in this list automatically. The catalog in src/Rekomi.Core/Domain/NotificationPreferences.cs is the single source of truth; every entry renders as either a toggle or an "Always on" badge in the settings UI, and the settings page above always reflects exactly what's wired.