Email notifications — what you'll receive

send-email-notification.worker.ts via emailService.sendNotificationAlert. Per-event email + owner fan-out + per-type unsubscribe link. Ad Fatigue email digest (daily/weekly).

Written By Salvatore Sinigaglia

Last updated About 1 hour ago

send-email-notification.worker.ts via emailService.sendNotificationAlert. Per-event email + owner fan-out + per-type unsubscribe link. Ad Fatigue email digest (daily/weekly).

Email notifications — what you'll receive

Wevion sends most notification emails per event (real-time, not batched). Backed by send-email-notification.worker.ts via emailService.sendNotificationAlert(). Direct user + owner fan-out (if user.owner_id exists). Per-type unsubscribe link in every email points to ${frontendUrl}/settings/personal/notifications?unsubscribe=${notificationType}. Failures non-blocking. One batched exception exists: the Ad Fatigue email digest (daily + weekly), sent by a dedicated cron (creative-fatigue.service.ts sendFatigueDigests(), every 24h, lock ID 100112; weekly only on Mondays UTC).

Who is this for

Anyone wondering what email notifications Wevion sends, when, from whom, and how to manage them.

Per-event delivery (with one digest exception)

Each qualifying notification triggers one email. There is no general email digest that batches all notification types — meaning:

  • No batched daily / weekly email summary of general alerts
  • No "10 events combined into one email"
  • Every alert that passes your preferences → one email

The one exception is the Ad Fatigue email digest: a dedicated daily (and weekly, on Mondays) batched email of creative-fatigue findings, sent by its own cron (creative-fatigue.service.ts sendFatigueDigests()), separate from the per-event path.

For general batched summaries: use Telegram digest (ntf-106).

How delivery works

  1. Notification event triggers in backend (e.g. campaign disapproved)
  2. Policy engine evaluates preferences → if email enabled for this type × user → enqueue
  3. SQS message routed to send-email-notification.worker.ts
  4. Worker calls emailService.sendNotificationAlert()
  5. Email sent via plugin 12.email.ts (typically AWS SES / Mailgun / similar)
  6. If user.owner_id exists: owner also gets email (with implicit "Team: [memberName]" context)

Failure (provider error, invalid address): event recorded; worker doesn't retry indefinitely (typical SQS retry pattern with DLQ).

Email content

Each email includes:

  • Subject: [Wevion] {Notification Type} or similar
  • Body: notification message + severity + context
  • Entity link: entityUrl = ${frontendUrl}/backoffice/${entity_type}s/${entity_id} — click to open the relevant entity in Wevion
  • Unsubscribe link: ${frontendUrl}/settings/personal/notifications?unsubscribe=${notificationType} — clicking unsubscribes from this specific type (not all emails)

Branded HTML template + plain-text fallback.

Owner fan-out

If you're a team member (e.g. mediabuyer) with user.owner_id set to your team owner:

  • Direct notifications go to you (your email)
  • AND to your owner (their email)

This lets owners stay informed of team activity. Owner can disable in their own preferences.

If you're an owner: you receive your team members' notifications by default (per ROLE_DEFAULTS for owner role).

Unsubscribe per type

Each email's unsubscribe link is per-notification-type, not all-emails:

${frontendUrl}/settings/personal/notifications?unsubscribe=${notificationType}

Click → opens Wevion settings → toggles email channel off for that specific notification type.

To unsubscribe from ALL emails: visit /settings/personal/notifications directly → toggle email channel off across all types.

Who sends

  • From address: typically noreply@wevion.ai (varies per deployment)
  • Reply-to: typically not monitored (use support channels for replies)
  • Email domain: workspace's configured domain (apps/backend/src/plugins/external/12.email.ts)

Allowlist noreply@wevion.ai in your email provider's spam filter to ensure delivery.

What notification types email by default

Per ROLE_DEFAULTS matrix in apps/backend/src/lib/notification-defaults.ts:

RoleEmail default for
super_adminMost critical types (account, payment, sync errors)
ownerCritical types + team member actions
adminCritical types relevant to admin scope
managerLimited subset; most types email-off by default
mediabuyerLimited subset; most types in-app only by default
financeBilling-related only
viewerMinimal

Override via /settings → Notifications.

When email is the right channel

Use email forUse other channel
Important events worth archivingReal-time alerts (use push / telegram)
Cross-team async coordinationTeam chat
Compliance / audit trailIn-app inbox
Notifications for users without TelegramTelegram users → use Telegram

Email's strengths: durable, searchable, shareable. Weakness: slower than push / Telegram.

Email vs in-app

ChannelLatencyPersistence
in-app~30s pollingPersisted in notification_inbox_item until acknowledged / archived
emailNear-instantPersisted in your inbox forever (until you delete)

For critical alerts you may want both. For high-frequency types: maybe in-app only to avoid email overload.

Bounces + invalid addresses

If user.email is missing or invalid:

  • Worker skips email send for that user
  • Other channels still attempted (in_app, telegram, push)
  • No bounce-retry mechanism (admin / user fixes email in profile)

Privacy

Email recipients see:

  • Your user.email (the address)
  • The notification content (subject + body)
  • Entity link (opens Wevion — requires login)

Email does NOT include:

  • Other users' notifications
  • Cross-team data
  • Sensitive tokens / secrets (output is sanitized server-side via similar mechanism to Wavo's sanitizeToolOutput)

Common questions

Why am I getting so many emails?

Your role + per-type defaults trigger emails for many notification types. Disable specific types via /settings → Notifications or click unsubscribe in any email.

Why am I getting emails for someone else's actions?

Owner fan-out: you're an owner; team member actions notify you. Disable in your preferences.

Why didn't I get an email I expected?

Check: preferences (email channel enabled for this type?), spam folder, user.email correct, role default doesn't enable email for this type.

Can I get daily / weekly email digest?

Not as a general summary of all notification types — those arrive per event. The one batched email is the Ad Fatigue digest (daily, plus weekly on Mondays), covering creative-fatigue findings only. For a broader batched summary, use the Telegram digest (ntf-106).

Can I forward Wevion emails to my team?

Yes (standard email forward). But beware: forwarded emails leave Wevion's auth scope; the entityUrl link requires Wevion login.

Can I reply to a notification email?

Typically no (noreply@ address). For support: open ticket via Wevion Help Center or via Wavo (create_support_ticket tool).

Common issues

  • No emails received: check user.email, spam folder, allowlist noreply@wevion.ai, verify preferences
  • Too many emails: disable specific types via /settings → Notifications or unsubscribe link in any email
  • Unsubscribe link broken: very rare; report to support; meanwhile manage via /settings → Notifications directly
  • Email with sensitive token / secret visible: should not happen (sanitization). If observed: report immediately as security concern
  • Owner / member separate emails for same event: by design (owner fan-out); owner can disable

FAQ

Who does Wevion send notification emails from?

Wevion sends from noreply@wevion.ai (the exact address varies per deployment), using the workspace's configured email domain via the 12.email.ts plugin. The reply-to is typically unmonitored, so use support channels for replies. To ensure delivery, allowlist noreply@wevion.ai in your email provider's spam filter.

Does unsubscribing stop all Wevion emails?

No. Each email's unsubscribe link is per-notification-type — it points to /settings/personal/notifications?unsubscribe= and toggles the email channel off only for that specific type. To stop every email, visit /settings/personal/notifications directly and turn the email channel off across all notification types.

What happens if my email address is invalid?

If your user.email is missing or invalid, Wevion's send-email-notification.worker.ts skips the email send for you, while other channels (in-app, Telegram, push) are still attempted. There is no bounce-retry mechanism, so you or an admin must correct the email address in your profile to resume email delivery.

Which channel keeps a durable, searchable record of alerts?

Email. Wevion emails are near-instant and persist in your inbox until you delete them, making them ideal for archiving important events, compliance trails, and users without Telegram. In-app notifications persist in notification_inbox_item but rely on ~30s polling; for critical alerts you may want both channels enabled.