Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions changelog.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,21 @@ description: "New features, improvements, and fixes across the Sendmux platform.
rss: true
---

<Update label="5 August 2026" tags={["Improvements", "Bug fixes"]} rss={{ title: "Connected account authorisation and navigation counts now stay accurate" }}>
## Connected account authorisation

Google and Microsoft connected accounts now request sending-only mailbox access. Sendmux no longer asks to read, change, or delete mailbox content, and the sender address always matches the mailbox that completed authorisation.

Large account pools can now complete each mailbox authorisation without a shared attempt limit interrupting the batch. Imported accounts that need a connection show **Authorise** directly from their pending row.

See [Connect Google and Microsoft accounts](/guides/connect-google-microsoft-accounts) for administrator preparation, permissions, and large account pools.

## Navigation freshness

Your balance, notification count, and inbox unread count now refresh after you return to an inactive browser tab. The inbox count stays current without requiring you to open **Inboxes** first.

</Update>

<Update label="4 August 2026" tags={["Bug fixes"]} rss={{ title: "Domain deletion now recovers safely from interruptions" }}>
## Bug fixes

Expand Down
1 change: 1 addition & 0 deletions docs.json
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
"guides/sending-via-http",
"guides/sending-via-smtp",
"guides/sending-accounts",
"guides/connect-google-microsoft-accounts",
"guides/delivery-groups",
"guides/http-provider",
"guides/attachments",
Expand Down
220 changes: 220 additions & 0 deletions guides/connect-google-microsoft-accounts.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,220 @@
---
title: "Connect Google and Microsoft accounts"
description: "Prepare your organisation, import accounts, and authorise Google Workspace or Microsoft 365 mailboxes for sending."
keywords:
[
"Google Workspace",
"Microsoft 365",
"Gmail OAuth",
"Outlook OAuth",
"bulk account authorisation",
"sending accounts",
]
---

Use this guide to connect Gmail, Google Workspace, Outlook, or Microsoft 365 accounts that Sendmux will use for sending. For a large account pool, import the account list first, then authorise each pending account from its row.

<Info>
You need permission to manage sending accounts in Sendmux and sign-in access
to every account you connect. If your organisation blocks third-party apps,
ask a Google Workspace or Microsoft Entra administrator to complete the
relevant preparation step below.
</Info>

## Permissions Sendmux requests

Sendmux requests only the permissions needed to identify the account, keep the connection active, and send email.

| Provider | Sending permission | What it allows |
| --- | --- | --- |
| Google | `gmail.send` | Send email on behalf of the connected account. |
| Microsoft | Microsoft Graph delegated `Mail.Send` | Send email as the signed-in account. |

The connection also requests basic identity scopes so Sendmux can confirm which account completed the flow. Microsoft includes `offline_access` so the account can remain connected without an interactive sign-in for every send.

Connected accounts always send from the mailbox address that completed authorisation. You can set a sender display name and reply-to address, but a different **From Email** address requires a separately authorised account.

<Warning>
Sendmux does not need permission to read, change, or delete mailbox content.
Cancel the flow and contact Sendmux support if a provider prompt asks for
`Mail.Read`, `Mail.ReadWrite`, IMAP access, or permission to read and
permanently delete Gmail messages.
</Warning>

## Prepare Google Workspace

Most organisations can skip this section. Complete it only when a Workspace policy blocks third-party apps or requires an administrator to configure them first.

<Steps>
<Step title="Open Google app access controls">
In the Google Admin console, open **Security** > **Access and data control** > **API controls**, then select **Manage App Access**.
</Step>
<Step title="Configure Sendmux">
Select **Configure new app**, search for `Sendmux`, and choose the Sendmux
OAuth app. Select the organisational units whose accounts will connect.
</Step>
<Step title="Limit access to the required Google data">
Choose **Specific Google data**. Allow the Google sign-in scopes and the
Gmail scope described as **Send email on your behalf**. Finish and review
the configuration before continuing.
</Step>
</Steps>

Google says changes can take up to 24 hours, though they often apply sooner. See <a href="https://knowledge.workspace.google.com/admin/apps/control-which-apps-access-google-workspace-data" rel="nofollow noopener noreferrer" target="_blank">Google's app access guide</a> for current administrator roles and controls.

<Note>
Administrator configuration allows the Sendmux app to request the approved
scopes. It does not connect every mailbox or give Sendmux domain-wide access.
Each account owner still completes the Sendmux authorisation flow.
</Note>

## Prepare Microsoft 365

Most Microsoft 365 organisations allow the delegated `Mail.Send` permission without a separate administrator step. If your tenant blocks user consent, approve Sendmux once before connecting the account pool.

<Steps>
<Step title="Open Microsoft account setup in Sendmux">
Open **Accounts**, select **Add Account**, then choose **Outlook / Microsoft
365**.
</Step>
<Step title="Open the administrator flow">
Expand **Organisation requires admin approval?** and select **Open Admin
Consent Page**.
</Step>
<Step title="Review and approve">
An authorised Microsoft Entra administrator signs in and reviews the
delegated permissions. The sending permission must be Microsoft Graph
`Mail.Send`. Approve only if the prompt matches the permissions described
on this page.
</Step>
<Step title="Return to the account list">
Close the administrator tab after approval. Each account can now complete
its own **Authorise** flow.
</Step>
</Steps>

Tenant-wide consent allows users in the organisation to connect Sendmux. It does not connect their mailboxes automatically. See <a href="https://learn.microsoft.com/en-us/entra/identity/enterprise-apps/grant-admin-consent" rel="nofollow noopener noreferrer" target="_blank">Microsoft's tenant-wide consent guide</a> for current administrator roles and consent controls.

## Connect one account

<Steps>
<Step title="Choose the account type">
Open **Accounts**, select **Add Account**, then choose **Gmail** or **Outlook
/ Microsoft 365**. For Microsoft, keep **Global (Commercial)** selected.
</Step>
<Step title="Start the provider flow">
Select **Connect Account**. Sign in to the exact account you intend to add.
</Step>
<Step title="Review the permission">
Confirm the account address and the sending-only permission, then approve
the connection. New Google Workspace accounts may first show Google's
welcome page. Complete that page, then restart the connection from Sendmux.
</Step>
<Step title="Confirm the result">
Sendmux returns to **Accounts**. The account should show **Active**. If the
provider rejected or cancelled the flow, use **Authorise** or
**Re-authorise** beside the account to try again.
</Step>
</Steps>

## Connect a large account pool

Importing creates the account records in one operation. Provider sign-in still happens once per account because each mailbox receives its own revocable OAuth credential.

<Steps>
<Step title="Prepare the import file">
Open **Accounts** > **Accounts** > **Import Accounts**, then select
**Download template**. Keep the header row unchanged.

Fill at least these columns for each connected account:

| Column | Value |
| --- | --- |
| `name` | A unique account name. |
| `type` | `gmail_api` or `outlook_api`. |
| `oauth_user_email` | The account that must complete authorisation. |

You can also set its delivery group, sender display name, reply-to details,
quotas, and routing weight in the same file. Sendmux ignores `from_email`
for connected accounts and uses `oauth_user_email` as the sender address.
</Step>
<Step title="Import the accounts">
Upload the file, review accepted and rejected rows, then select **Import**.
New Google and Microsoft accounts appear as **Pending** because imported
files never contain connected-account credentials.
</Step>
<Step title="Work through pending accounts">
Filter the account list by **Pending**. Select **Authorise** beside the first
account, verify the email address at Google or Microsoft, and complete the
provider flow. Repeat for the remaining accounts.
</Step>
<Step title="Check the pool">
Remove the **Pending** filter and confirm every connected account is
**Active**. Review any **Error** row and use **Re-authorise** after correcting
the provider-side issue.
</Step>
</Steps>

<Tip>
Prepare Google or Microsoft administrator consent before starting a large
batch. This removes organisation-policy interruptions, while keeping each
mailbox connection separate and revocable.
</Tip>

## Troubleshooting

<AccordionGroup>
<Accordion title="An imported account stays Pending">
Pending is expected until that account completes OAuth. Select
**Authorise** beside the account. If the action is not visible, confirm that
your Sendmux role can manage sending accounts, then refresh the page.
</Accordion>

<Accordion title="Google says the app is unverified or asks to read and delete mail">
Do not continue through **Advanced**. The expected Gmail permission is
**Send email on your behalf**. Cancel the flow and contact Sendmux support
with the team, account address, and time of the attempt.
</Accordion>

<Accordion title="Microsoft says an administrator must approve the app">
Use **Add Account** > **Outlook / Microsoft 365** > **Organisation requires
admin approval?** > **Open Admin Consent Page**. After an authorised Entra
administrator approves delegated `Mail.Send`, restart **Authorise** for the
affected account.
</Accordion>

<Accordion title="The wrong Google or Microsoft account appears">
Cancel the provider flow. Return to the matching account row and select
**Authorise** again. Check the address shown by the provider before you
approve access, especially when several accounts are signed in in the same
browser.
</Accordion>

<Accordion title="Sendmux reports too many authorisation attempts">
Stop repeating the flow. Refresh **Accounts** and retry once from the
account's own **Authorise** or **Re-authorise** action. If the message
returns, contact Sendmux support with the team, account address, and
timestamp. This message is not a sending-account capacity limit.
</Accordion>
</AccordionGroup>

## Related guides

<Columns cols={2}>
<Card title="Sending accounts" icon="mail" href="/guides/sending-accounts">
Import, configure, monitor, and route sending accounts.
</Card>
<Card title="Delivery groups" icon="route" href="/guides/delivery-groups">
Route sending keys through a selected account pool.
</Card>
<Card
title="Cold email outreach"
icon="bullseye"
href="/use-cases/cold-email-outreach"
>
Build a GTM sending pool with per-account caps.
</Card>
<Card title="Teams and access" icon="users" href="/guides/teams-access">
Give operators the role they need to manage accounts.
</Card>
</Columns>
16 changes: 13 additions & 3 deletions guides/sending-accounts.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,9 @@ Use your own provider when you need higher volume, a specific sender policy, or
<Step title="Complete setup">
SMTP accounts need server address, port, protocol, username, password, and
optional sender defaults. Connected accounts send you through the provider's
sign-in flow.
sign-in flow. See
[Connect Google and Microsoft accounts](/guides/connect-google-microsoft-accounts)
for administrator preparation, permissions, and large account pools.
</Step>
<Step title="Test the provider">
For SMTP accounts, use **Test Connection** after saving. Fix any credential
Expand Down Expand Up @@ -98,7 +100,8 @@ formatting.
JSON configuration files never contain or accept passwords or connected-account
credentials. Use them to update matched accounts. To create a new SMTP account,
use **Add Account** or a CSV with its password. Use **Add Account** to authorise
a new Gmail or Outlook account.
a new Gmail or Outlook account, or import its account record and select
**Authorise** from the pending account row.
</Warning>

<AccordionGroup>
Expand All @@ -121,7 +124,7 @@ formatting.
| `password` or `smtp_password` | New SMTP account | SMTP password. Exports leave this blank. A blank value on update keeps the current password. |
| `status` | No | `active` or `inactive`. New SMTP accounts default to `active`. |
| `oauth_user_email` | New Gmail or Outlook account | Email address used to match the account. A new imported account remains pending. |
| `from_email`, `from_name` | No | Default sender address and display name. |
| `from_email`, `from_name` | No | Default sender address and display name. `from_email` applies only to SMTP accounts; connected accounts use `oauth_user_email`. |
| `reply_to_email`, `reply_to_name` | No | Default reply-to address and display name. |
| `tracking_domain` | No | Custom tracking hostname. |
| `quota_second`, `quota_minute`, `quota_hour`, `quota_day` | No | `0` for unlimited, one number, or a range such as `5-10`, up to `100000000`. |
Expand Down Expand Up @@ -210,6 +213,13 @@ Each team starts with **200 sending accounts** that you add yourself. The manage
## Related guides

<Columns cols={2}>
<Card
title="Connect Google and Microsoft accounts"
icon="key"
href="/guides/connect-google-microsoft-accounts"
>
Prepare administrator access and authorise connected accounts at scale.
</Card>
<Card title="Delivery groups" icon="route" href="/guides/delivery-groups">
Group providers and route selected keys or mailboxes through them.
</Card>
Expand Down
4 changes: 3 additions & 1 deletion openapi-app.json
Original file line number Diff line number Diff line change
Expand Up @@ -5386,6 +5386,7 @@
"additionalProperties": false,
"properties": {
"from_email": {
"description": "Default From email address for an SMTP account.",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Regenerate Postman collection snapshots

This OpenAPI spec edit changes the committed source used to generate the Postman collections, but the commit does not include any postman/*.postman_collection.json updates. In CI, the drift gate regenerates collections from openapi-app.json and compares them with postman/, so spec changes need the generated snapshots committed in the same change to avoid drift failures and stale Run in Postman artifacts.

AGENTS.md reference: AGENTS.md:L17-L19

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

False positive — npm run postman:check regenerated all three collections into a temporary directory and they byte-match the committed postman snapshots; these schema-property description-only changes are not emitted by the current transformer. Docs CI passed the same drift gate.

"example": "sender@example.com",
"format": "email",
"maxLength": 255,
Expand Down Expand Up @@ -5631,7 +5632,7 @@
"type": "string"
},
"from_email": {
"description": "Default From email address.",
"description": "Default From email address. Connected Google and Microsoft accounts always use their authorised account address.",
"type": [
"string",
"null"
Expand Down Expand Up @@ -6140,6 +6141,7 @@
"additionalProperties": false,
"properties": {
"from_email": {
"description": "Default From email address for an SMTP account. Connected Google and Microsoft accounts keep their authorised account address.",
"example": "sender@example.com",
"format": "email",
"maxLength": 255,
Expand Down