Connect by JBRH Open Connect

Connecting Gmail, end to end

You start the connection from the Mailboxes screen, consent at Google, and come back to a mailbox row that holds sealed tokens rather than a password. The first sync then proves the connection is real. Connecting a mailbox is a separate consent from signing in to Connect, and revoking one does not revoke the other.

Status
Available What this means
Audience
both
Channels
email
In the app
#/mailboxes, #/inbox
Last verified
Product version
6.3.2

What is stored, and what is not#

Connect stores a grant from Google, not your password. The grant lives in the mailbox's config, which settings_store seals on every save and never echoes back to a screen — reading the connection form back shows you that a credential is present, not what it is.

config is a real setter rather than a read-only view, and that detail is load-bearing: oauth.store_tokens rebuilds the whole dictionary and assigns it back each time Google issues a fresh access token. A read-only property would have quietly dropped every refresh, and the mailbox would have worked until the first token expired and then stopped for no visible reason.

StageWhat you seeWhat changesWhat can fail
StartGoogle's consent screenNothing on the Connect side yetA blocked pop-up, or an account chooser landing on the wrong Google identity
ConsentThe scopes Google is asking you to grantNothing yetDeclining one scope, which leaves a grant that cannot do the work
CallbackThe Mailboxes screen with a new rowA mailbox row with sealed credentials in configA session that expired while you were at Google
Uniqueness checkOne row, not two, for one inboxNothing, when the identity is already connectedA row with an empty workspace stamp — invisible to an ordinary list, so a reconnection would have written a second row for one real inbox
First syncThreads on Conversationstenant_* rows, then canonical threads, then the cursorA scope that was declined, or a grant revoked at Google between consent and sync
HealthA verdict beyond 'connected'Health verdicts on the rowA mailbox that authenticates and returns nothing — a quiet mailbox, which is a signal rather than an error

Two consents that are easy to confuse#

Google OAuth is the only way to sign in to Connect — there is no password login. That makes it easy to assume signing in also connected your mail. It did not. Signing in proves who you are; connecting a mailbox grants Connect the ability to read and send as that mailbox, and the two grants are separate, revocable separately, and visible separately in your Google account.

The practical consequence is worth remembering during an incident: revoking Connect's access at Google stops mail flowing while you can still sign in perfectly well, which reads on screen as a broken mailbox rather than a deliberate revocation. Reconnect required covers the way back.

Proving the connection rather than assuming it#

  1. Press Sync on the new row and wait for the last-sync time to move.

    Result The read path is proved: a grant that cannot read never updates that time.

  2. Open Conversations and find a thread you recognise from the last day.

    Result The bridge is proved too — a fetch that filled tenant_* and never reached the canonical tables looks identical on the mailbox row.

  3. Give the mailbox a role and a signature before the first reply goes out.

    Result The role decides which mailbox answers which thread, so setting it later means some replies already went from a mailbox you did not intend.

  4. Send one reply, or approve one held reply, from this mailbox.

    Result The send path is proved, with the provider's acknowledgement recorded against the message.

Questions#

Can one workspace connect several Google mailboxes?

Yes — several mailboxes per workspace is the normal case, each with its own role, signature, autonomy and health. The uniqueness check exists to stop the *same* identity being connected twice, which used to be possible when a row carried an empty workspace stamp.

What happens to mail that arrived before I connected?

The first sync starts from an empty cursor and fetches history from the provider; how far back that reaches is the provider's decision rather than Connect's. Catching up after a Gmail history gap covers the case where the provider cannot serve the range asked for.

Does Connect need to write to my Gmail?

Only to mark read state and apply labels, and that write-back is deliberately allowed to fail without blocking a reply. A missing label means the write-back failed, not that the reply did.