Skip to content

Gmail

Your agents send from your own Gmail address, read every reply, and stop on any unsubscribe, with each thread filed to its lead.

Connect
Sign in once, 2 grants
Runs through
Your account
First run
Enroll 25 checked people in your first Sequence, free on your account
Sites
Gmail
Contact.enroll
You, to your agent

Show me the first email my Sequence would send to Rosa at Northgate Rentals from my cold inbox.

curl -X POST "https://api.sb/leaseline.app/contacts/enroll?mode=try" \
  -H "Authorization: Bearer $SB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"contact":"contacts/rosa-northgate","sequence":"sequences/first-touch","from":"dana@tryleaseline.app"}'
npx startup-builder do Contact.enroll --try --data '{"contact":"contacts/rosa-northgate","sequence":"sequences/first-touch","from":"dana@tryleaseline.app"}'
{
  "name": "do",
  "arguments": {
    "mode": "try",
    "code": "return await $.Contact.enroll({ contact: 'contacts/rosa-northgate', sequence: 'sequences/first-touch', from: 'dana@tryleaseline.app' })"
  }
}
import { $ } from 'startup-builder'

const result = await $.try.Contact.enroll({ contact: 'contacts/rosa-northgate', sequence: 'sequences/first-touch', from: 'dana@tryleaseline.app' })
Response
{
  "$type": "Message",
  "mode": "try",
  "stored": false,
  "from": "Dana Okafor <dana@tryleaseline.app>",
  "to": "rosa@northgate-rentals.com",
  "subject": "The rent spreadsheet at Northgate",
  "body": "Saw you are hiring a leasing coordinator. Is the rent spreadsheet part of the job?",
  "sendAt": "2026-10-28T14:10:00Z",
  "mailbox": {
    "warmedDays": 14,
    "perDay": 30,
    "sentToday": 11
  },
  "headers": {
    "List-Unsubscribe": "present",
    "List-Unsubscribe-Post": "List-Unsubscribe=One-Click"
  }
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns

Connect once

  1. Call Integration.connect with system: 'mailboxes' and venue: 'gmail', then open the connectUrl it returns and sign in as the Google account you send from.
  2. Approve the two grants Google lists: send as you, and read the threads your agents start.
  3. Authenticate the sending Domain once with Domain.authenticate, which writes SPF, DKIM and DMARC and checks them before the first send.
GrantWhat it unlocksScope
Send as youEach Sequence step, reply and broadcast leaves from your own address, in your Sent folderhttps://www.googleapis.com/auth/gmail.send
Read repliesEvery reply lands on its thread and its lead within a minute; the platform reads no thread your agents did not starthttps://www.googleapis.com/auth/gmail.readonly
ToDo this
PauseIntegration.pause stops every call through Gmail at once and keeps the token; Integration.resume picks up from the same cursor.
ReconnectIntegration.reconnect returns a fresh connectUrl that lasts one hour, and keeps the Integration's id and cursor, so nothing imports twice.
DisconnectIntegration.revoke revokes the token with Gmail; every record it brought in stays in your records.

What your agents do

AskVerbRuns throughPrice
Send each step of my Sequence from my own address, and stop on any reply.Contact.enrollYour accountFree
Hold this reply until 9:00 in their time zone, then send it.Message.scheduleYour accountFree
Send the launch note to my waitlist.Message.broadcastYour accountFree
Answer this reply in the same thread.Conversation.answerYour accountFree
Turn the first reply into a lead, with the thread as its source.Prospect.engageYour accountFree
Stop every send to anyone who asks.Contact.unsubscribeYour accountFree

Calls on your own account are free.

What it holds

NounThe account’s objectWhenWhich side leads
MessagemessageYour agent sends a step, a reply or a broadcastYour records
MessagemessageA reply arrives in the inboxThe account
ThreadthreadThe first send opens it; every reply joins itThe account
ContactFrom, To and CcAn address writes to you for the first timeYour records

Events and webhooks

DirectionEvent
EmitsMessage.created, Contact.enrolled, Message.broadcasted, Prospect.engaged, Contact.unsubscribed
Hears users.watchBecomes Message.created

Any Event can wake a Workflow, and a Watch delivers it to your endpoint, signed (Events and webhooks).

Limits

WhatLimitCall
Sends from one inbox2,000 messages in a rolling 24 hours on a Google Workspace account, to at most 10,000 recipients; the rest wait for the window with quota-reachedMessage.broadcast
Outside recipients3,000 addresses outside your own domain a day, and 500 on one messageMessage.broadcast
Cold sends30 a day per inbox after 14 days of warm-up, held by your standing approval; a Sequence spreads the rest over the next daysContact.enroll
RepliesGmail pushes each new message within seconds; the platform renews the mailbox watch daily, inside the 7 days Gmail allowsEvery call

Field map

Our fieldGmail’s fieldNotesCalls
Message.fromraw: From headerYour address, or a send-as alias you set up in GmailMessage.schedule, Message.broadcast, Contact.enroll
Message.toraw: To headerNone.Message.schedule, Message.broadcast, Contact.enroll
Message.subjectraw: Subject headerA reply keeps the thread’s subject, so Gmail threads itMessage.schedule, Message.broadcast, Contact.enroll
Message.bodyraw: text/plain and text/html partsNone.Message.schedule, Message.broadcast, Contact.enroll
Message.purposeraw: List-Unsubscribe and List-Unsubscribe-Post headersA commercial purpose adds the one-click unsubscribe headers Gmail shows as a linkMessage.broadcast, Contact.enroll

What try does here

Renders the exact email, headers included, and returns it with the time it would send; nothing reaches Gmail and no draft is saved.

How long a connection lasts

A connection lasts until you revoke it in your Google Account, or until you change your Google password, which ends any grant that holds Gmail access.

The platform asks you to reconnect 7 days before it runs out; until you do, a call that needs it refuses with needs-reauth.

Plays and strategies

Used by

Reference

6 calls, each with its path and price
CallPathPrice
Contact.enrollPOST /contacts/enrollFree
Message.schedulePOST /messages/scheduleFree
Message.broadcastPOST /messages/broadcastFree
Conversation.answerPOST /conversations/answerFree
Prospect.engagePOST /prospects/engageFree
Contact.unsubscribePOST /contacts/unsubscribeFree

Contents