Send notices as the workspace user via Outlook + thread inbound replies through Microsoft Graph. v1 ships the configuration surface only; the OAuth callback returns 501 until the live wire-up lands.
email_outbox dispatcher (ACS driver in staging / prod). This page documents the M365 handoff so the Azure AD app registration can be pre-staged. Once the callback ships, the dispatcher will prefer the Outlook driver for any tenant with an active connection and fall back to ACS otherwise.not_connected Workspace owner runs the OAuth dance — same pattern as Xero and the Procore Custom App.
Run setup wizardNotices currently route via the worker dispatcher's active driver — driver selection lives at /admin/integrations/email. Once M365 is connected, the dispatcher prefers Outlook for tenants with a stored token.
Add this exact URL to the app registration's Web → Redirect URIs. The callback path is hard-coded; only the host changes per environment.
https://staging.neom.idcconstruct.com.au/api/v1/integrations/m365/callbackRequired delegated scopes: openid profile offline_access Mail.Send Mail.ReadWrite User.Read
v1 callers should keep using sendNoticeViaEmail from @neom/notices — it queues an email_outbox row and the worker dispatcher picks the active driver.
Same handoff shape via Google OAuth + Gmail API. Will land behind the same connection surface once M365 is wired and there is an operator request. Until then Gmail users receive notices via ACS (no thread linking).