Gmail
Read threads, draft replies, watch labels. Sends on your behalf with your permission.
gmailAn integration is a connected identity plus the tools it unlocks — Gmail to read a thread, HubSpot to update a deal, Meta Ads to raise a spend cap. Everything filed from an integration carries its pin; anywhere that pin appears, you can trace it back to the account that sourced it.
Tiles sit on a hairline grid — no card shadows, no rounded corners, just the signal rail on the left edge of connected ones. Logo, name, short description, slug chrome. The green signal is the whole "you're linked in" story.
Read threads, draft replies, watch labels. Sends on your behalf with your permission.
gmailDeals, contacts, notes. Two-way sync for pipeline changes and ownership.
hubspotCampaigns, spend caps, creative. Surfaces in inbox when a cap is hit.
meta-adsChannel summaries, DM triage, scheduled nudges.
slackRead pages and databases. Turn a page into a figment, or a database into a board.
notionCustomers, subscriptions, invoices. Read-only unless you grant write scopes.
stripeRail vs. badge. Both ride connected tiles and they're not saying the same thing. The 2px rail is for the eye scanning the grid — the connected subset lights up at a glance, no reading. The badge names the state once you're focused on a tile. Disconnected tiles drop the rail and repurpose the badge as the action prompt (Connect).
Filter chips — All, Connected — pin to the left of search. Provider-type filter (Composio, direct, custom) hides behind the dropdown. Pagination loads more in the same grid; no second page.
One Gmail integration, many Gmail identities — "Work Gmail", "Ops inbox", "Founder@". Identities carry their own name, description, status, and the label the provider hands back (usually the email). Everywhere an item mentions Gmail, it's actually mentioning a specific identity.
Display rules. External label wins when it's present (it's what the provider authoritatively calls this account). Fall back to the user's chosen name. Never show both at equal weight — one leads, one follows.
Most connections are a click: pick a name, sign in, done. Custom OAuth apps, scope granularity, and alternate schemes stay out of the way until asked for. Both states stacked below — the default shape above, the power expansion underneath. Field vocabulary matches §13 Forms.
Requests read on deals, contacts, and notes by default. Need finer control or your own OAuth app? Those live in power mode.
A toolbox is a named set of integrated identities an agent is allowed to use. Boards override at the board level. Platform capabilities (search, memory, timers) are always in hand — a toolbox only adds to that base.
Add Stripe, Ramp, or QuickBooks when you're ready to let agents touch money-flavoured things.
Anything sourced from an integration — an inbox item, a chat quote, an item-view peek — carries a pin back to its origin.
Deal Acme — Q2 Renewal moved from Negotiation to Closed Won.
Status lives on the identity, not the integration. A Gmail with two accounts can have one healthy and one expired — the integration itself is neither.
Nothing connected yet
Connect a tool to give your agents something to do. Start with Gmail or HubSpot.
A provider can host many accounts. Status, names, scopes, and pins all live on the identity. Integrations are the catalogue entry.
Every surface that shows integration data carries a pin back to the identity. No item ever becomes "just data" — you can always trace it.
A first-timer sees one button and a name field. Custom OAuth apps, granular scopes, and connection fields disclose only when asked for.
The user should never click "Connect" and then discover what they just handed over. Chips are in hand, checkable, obvious.
The provider's reason, in one sentence. A single button to fix it. Never "An error occurred" without telling which scope or token failed.
Disconnect empties the keys but keeps the identity — name, history, bindings intact. Reconnect from the same row restores the link in one click. Removing the slot entirely is a separate, explicit step with its own confirmation. Both happen in place, no modal jump.