Skip to content

Outlook

Your agents send from your Outlook address, read every reply, and book the call on your Outlook calendar.

Connect
Sign in once, 4 grants
Runs through
Your account
First run
Enroll 25 checked people in your first Sequence, free on your account
Sites
Outlook
Meeting.book
You, to your agent

Book a 30-minute call with Rosa at Northgate Rentals in my next free weekday slot, and show me the invite.

curl -X POST "https://api.sb/leaseline.app/meetings/book?mode=try" \
  -H "Authorization: Bearer $SB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"contact":"contacts/rosa-northgate","at":"next free 30 minutes, weekdays 10:00 to 16:00 America/Chicago"}'
npx startup-builder do Meeting.book --try --data '{"contact":"contacts/rosa-northgate","at":"next free 30 minutes, weekdays 10:00 to 16:00 America/Chicago"}'
{
  "name": "do",
  "arguments": {
    "mode": "try",
    "code": "return await $.Meeting.book({ contact: 'contacts/rosa-northgate', at: 'next free 30 minutes, weekdays 10:00 to 16:00 America/Chicago' })"
  }
}
import { $ } from 'startup-builder'

const result = await $.try.Meeting.book({ contact: 'contacts/rosa-northgate', at: 'next free 30 minutes, weekdays 10:00 to 16:00 America/Chicago' })
Response
{
  "$type": "Meeting",
  "mode": "try",
  "stored": false,
  "contact": "rosa@northgate-rentals.com",
  "at": "2026-10-29T15:30:00Z",
  "calendar": "outlook",
  "invite": {
    "subject": "Leaseline and the Northgate rent spreadsheet, 30 minutes",
    "from": "dana@leaseline.app"
  },
  "agenda": "How Northgate tracks rent and renewals today"
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns

Connect once

  1. Call Integration.connect with system: 'mailboxes' and venue: 'outlook', then open the connectUrl it returns and sign in as the Microsoft work or personal account you send from.
  2. Approve the four grants Microsoft lists. A work account whose admin restricts apps asks the admin once; the connectUrl waits an hour for it.
  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 addressMail.Send
Read repliesEvery reply lands on its thread and its lead; the platform reads no thread your agents did not startMail.Read
Your calendarFree and busy times, and the Meetings your agents book, on your Outlook calendarCalendars.ReadWrite
Stay connectedYour agents keep working without you signing in each dayoffline_access
ToDo this
PauseIntegration.pause stops every call through Microsoft 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 Microsoft; every record it brought in stays in your records.

What your agents do

AskVerbRuns throughPrice
Send each step of my Sequence from my Outlook 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
Book the call this reply asks for, on my Outlook calendar.Meeting.bookYour accountFree
Answer this reply in the same thread.Conversation.answerYour 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
ThreadconversationIdThe first send opens it; every reply joins itThe account
MeetingeventYour agent books a callYour records

Events and webhooks

DirectionEvent
EmitsMessage.created, Contact.enrolled, Message.broadcasted, Meeting.booked, Prospect.engaged, Contact.unsubscribed
Hears subscription: me/messagesBecomes Message.created
Hears subscription: me/eventsBecomes Meeting.updated

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

Limits

WhatLimitCall
Recipients from one mailbox10,000 in a rolling 24 hours on Exchange Online; past it the mailbox sends nothing until the oldest sends age out, so the call returns quota-reached with the timeMessage.broadcast
Send rate30 messages a minute; the platform paces a broadcast under it, so Microsoft never throttles a sendMessage.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
BookingsOnly inside your bookable hours and never over a busy block on any connected calendarMeeting.book

Field map

Our fieldOutlook’s fieldCalls
Message.tomessage.toRecipientsMessage.schedule, Message.broadcast, Contact.enroll
Message.subjectmessage.subjectMessage.schedule, Message.broadcast, Contact.enroll
Message.bodymessage.body Notes contentType html or textMessage.schedule, Message.broadcast, Contact.enroll
Message.purposemessage.internetMessageHeaders Notes A commercial purpose adds the one-click unsubscribe headersMessage.broadcast, Contact.enroll
Meeting.atevent.start and event.end Notes Each with its timeZoneMeeting.book
Meeting.contactevent.attendees[].emailAddressMeeting.book
Meeting.agendaevent.bodyMeeting.book

What try does here

Renders the exact email or invite and returns it with the time it would go; nothing reaches Outlook and no draft or event is saved.

How long a connection lasts

A connection lasts 90 days from its last use: Microsoft replaces the refresh token on every use, and your agents use it daily.

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
Meeting.bookPOST /meetings/bookFree
Conversation.answerPOST /conversations/answerFree
Contact.unsubscribePOST /contacts/unsubscribeFree

Contents