The CRM you already use
Keep the CRM you know: your agents keep its contacts, companies and deals in step with your records, in the direction you choose.
- Connect
- Sign in once, 4 grants
- Runs through
- Your account
- First run
- See what one sync would change, record by record, free on your account
- Sites
- None, it holds your records
You, to your agent
Show me what one sync with my CRM would change, with my records leading.
curl -X POST "https: //api.sb/ leaseline.app/ integrations/ sync? mode= try" \
-H "Authorization: Bearer $SB_TOKEN" \
-H "Content-Type: application/ json" \
-d '{"integration": "integrations/ crm-mirror"}'
npx startup-builder do Integration.sync --try --data '{"integration": "integrations/ crm-mirror"}'
{
"name": "do",
"arguments": {
"mode": "try",
"code": "return await $.Integration.sync({ integration: 'integrations/ crm-mirror' })"
}
}
import { $ } from 'startup-builder'
const result = await $.try.Integration.sync({ integration: 'integrations/ crm-mirror' })
Response
{
"$type": "Integration",
"mode": "try",
"stored": false,
"system": "crm",
"direction": "mirror",
"wouldChange": {
"contacts": {
"create": 41,
"update": 12
},
"organizations": {
"create": 18,
"update": 3
},
"deals": {
"create": 5,
"update": 2
}
},
"conflicts": [
{
"record": "contacts/ rosa-northgate",
"field": "title",
"ours": "Owner",
"theirs": "Property Manager",
"wins": "ours"
}
]
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns
Connect once
- Call
Integration.connectwithsystem:and the'crm' modeyou want, then open theconnectUrlit returns and sign in to your CRM as an admin. - Choose the direction.
mirrorwrites your records out, so your team sees every Contact, deal and Meeting in the CRM;importturns each edit made in the CRM into a Change here. - Pick the pipeline and the fields to keep in step; a field you leave out stays where it is.
| Grant | What it unlocks | Scope |
|---|---|---|
| Contacts | People, read and written in the direction you chose | contacts: |
| Companies | The Organizations they work at | companies: |
| Deals | Deals and their stages in one pipeline | deals: |
| Activity | Each Message and Meeting logged on the record’s timeline | activities: |
| To | Do this |
|---|---|
| Pause | Integration.pause stops every sync at once and keeps the cursor; Integration.resume picks up the changes made meanwhile, once each. |
| Reconnect | Integration.reconnect returns a fresh connectUrl that lasts one hour, and keeps the Integration’s id and cursor, so nothing imports twice. |
| Disconnect | Integration.revoke revokes the token with your CRM; every record stays on both sides, and nothing is deleted from either. |
What your agents do
| Ask | Verb | Runs through | Price |
|---|---|---|---|
| Keep my contacts, companies and deals in step with the CRM, my records leading. | Integration.sync | Your account | Free |
| Bring my existing CRM records in once, then keep them in step. | Integration.connect | Your account | Free |
| Qualify this lead and open its deal in both places. | Lead.qualify | Your account | Free |
| Move the Northgate deal to proposal, and show it in the CRM. | Deal.advance | Your account | Free |
Calls on your own account are free.
What it holds
| Noun | The account’s object | When | Which side leads |
|---|---|---|---|
| Contact | contact or person | In mirror: your agents write it out | Your records |
| Contact | contact or person | In import: your team edits it in the CRM, and the edit arrives as a Change | The account |
| Organization | company or account | In the direction you chose | Your records |
| Deal | deal or opportunity | In the direction you chose | Your records |
| Meeting | activity | A Meeting is booked or held | Your records |
| Message | activity | A Message is sent or received | Your records |
Events and webhooks
| Direction | Event |
|---|---|
| Emits | Integration.synced, Lead.qualified, Deal.advanced |
Hears record created or changed | Becomes Integration.synced |
Any Event can wake a Workflow, and a Watch delivers it to your endpoint, signed (Events and webhooks).
Limits
| What | Limit | Call |
|---|---|---|
| Direction | One per Integration. Your records stay the record in both modes, and the side you declared leads every conflict | Every call |
| The first sync | Reads every record once; each later run reads only what changed since the cursor, so a run takes seconds | Integration.sync |
| Stages | Map one to one onto the pipeline you picked; a stage with no match refuses with venue-rejected and names it | Lead.qualify |
Field map
| Our field | The CRM you already use’s field | Notes | Calls |
|---|---|---|---|
Lead.status | lead status or lifecycle stage | Whichever your CRM keeps | Lead.qualify |
Lead.fit | fit | A field the platform adds: strong, partial or none | Lead.qualify |
Lead.owner | owner | None. | Lead.qualify |
What try does here
Reads your CRM and returns what one sync would change on each side, record by record; nothing is written to either.
How long a connection lasts
A connection lasts until you revoke it in your CRM’s settings; the platform refreshes the token before it lapses.
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
| Kind | Where |
|---|---|
| Plays | Closer handoff, Buying committee, lead nurture, lead reactivation |
| Strategies | Hands-on |
Used by
- Workflows: Ad test setup
- Services: Sales closing
Reference
4 calls, each with its path and price
| Call | Path | Price |
|---|---|---|
Integration.sync | POST / | Free |
Integration.connect | POST / | Free |
Lead.qualify | POST / | Free |
Deal.advance | POST / | Free |