Skip to main content
Local Mailer is the development-safe implementation: transactional send and queue calls are logged, and CRM methods always return success without calling a provider. tools.mailer.from is { email, name } for Local (localSchema in apps/shared/src/mailer/schema.ts), same as Brevo and SendGrid in config; Brevo resolves a numeric sender id at runtime — see Brevo.

Why

Use Local for safe development and tests where you want deterministic behavior without outbound email or CRM API traffic.

Setup

  1. Ensure apps/backend/package.json includes:
  1. Run workspace install/build updates:
  1. Configure tools.mailer in apps/backend/src/configuration/development.ts (and test.ts):
  1. No provider env vars are required for Local.
  2. Verify:

Local observability

Local logs all mailer operations through the app logger, so you can inspect queued payloads and CRM method calls in backend logs without any external dashboard.

Adding a new mail list tag

  1. Add the tag in apps/shared/src/mailer/types.ts under MailListTags.
  2. Ensure apps/shared/src/mailer/schema.ts still validates that every tag has a listIdByTag mapping.
  3. Add/update config mappings in apps/backend/src/configuration/development.ts and apps/backend/src/configuration/test.ts.
  4. Add test coverage in apps/shared/__tests__/mailerConfigSchema.spec.ts.
  5. Run:

Gotchas

  • Local CRM methods return success by design and do not persist records.
  • Queue payloads still target email_v1, so queue consumers must stay registered.
  • Missing listIdByTag mappings fail configuration validation even in Local mode.

What’s next?