Skip to content

Paid introductions

Introductions from your happiest customers, each answered within 5 minutes, billed only when the referred account’s first payment clears refunds.

Kind
Service
Price
$200 per paid introduction
Your time
30 minutes
Approval
Runs on its own
Deepens
Retention
Default limits
What waits for you
More factsFewer facts
Referral.deliver
You, to your agent

Get introductions from my customers this month, $200 for each one that pays and stays 30 days, and show me the plan first.

curl -X POST "https://api.sb/leaseline.app/referrals/deliver?mode=try" \
  -H "Authorization: Bearer $SB_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"goal":"Get introductions from my customers this month, $200 for each one that pays and stays 30 days, and show me the plan first.","budget":{"amount":600,"currency":"USD"}}'
npx startup-builder do Referral.deliver --try --data '{"goal":"Get introductions from my customers this month, $200 for each one that pays and stays 30 days, and show me the plan first.","budget":{"amount":600,"currency":"USD"}}'
{
  "name": "do",
  "arguments": {
    "mode": "try",
    "code": "return await $.Referral.deliver({ goal: 'Get introductions from my customers this month, $200 for each one that pays and stays 30 days, and show me the plan first.', budget: { amount: 600, currency: 'USD' } })"
  }
}
import { $ } from 'startup-builder'

const result = await $.try.Referral.deliver({ goal: 'Get introductions from my customers this month, $200 for each one that pays and stays 30 days, and show me the plan first.', budget: { amount: 600, currency: 'USD' } })
Response
{
  "mode": "try",
  "stored": false,
  "estimate": "About 57¢ per 2 paid introductions",
  "bills": "$200 a paid introduction",
  "sample": {
    "referrer": "Kestrel Lane Homes",
    "referred": "Juniper Row Rentals",
    "call": "March 11",
    "paid": "March 14, cleared April 13",
    "state": "accepted"
  }
}
Try mode reads, stores nothing and spends nothingAPI referenceIts Nouns

What you get

  • 2 paid introductions, as Referral records
  • paid[] · Each referred account whose first payment cleared 30 days: the referrer, the call and the plan it took.
  • open[] · Introductions still in a trial or before their call; none is billed yet.
  • bill · Accepted introductions times the price.

Connect once: Stripe, Gmail, Google Calendar. How long: Weekly asks; each introduction bills 30 days after its first payment.

Trigger

It runs when you call it, or on any Trigger you set.

TypeScript
await $.Workflow.create({
  verb: 'Referral.deliver',
  trigger: { schedule: 'weekly' }
})

Steps

Your agent does these steps, one row per step; each step’s check is part of its row and its price.

StepVerbReturnsPriceApproval
1. Ask five happy customers a week for one introductionReferral.askEach ask names the outcome the customer got; a reply with a name becomes a ReferralAbout 9.8¢Runs on its own
2. Route each introduced personLead.routeWho they are, where they work and whether they fit, with the referrer recordedAbout 2.8¢Runs on its own
3. Write to each one within 5 minutesLead.respondA first note that names the referrer and offers a callAbout 7.4¢Runs on its own
4. Book the callMeeting.bookA first call at a time both calendars hold freeFreeRuns on its own
5. Brief you before each callDeal.briefWhy they might buy, and what the referrer already told themAbout 37¢Runs on its own
6. Read the first payment past the refund windowCollection.queryEach referred account paid when its first payment cleared and no refund followed in 30 daysFreeRuns on its own

Calls: Referral.ask, then Lead.route, then Lead.respond, then Meeting.book, then Deal.brief, then Collection.query.

About 57¢ per 2 paid introductions, each time it runs, capped at $2.00. Its own steps cost nothing; the compositions it orders add 57¢.

How it runsWhat it says
Ask only customers past their first outcomeAn ask names the outcome the customer got. A customer with no outcome yet, or an open issue, is never asked.
Price it against what a customer is worthA $149-a-month customer is worth the $795 CAC that plan can afford. $200 is 25% of that, billed only after the first payment clears 30 days.
A name is not an introduction that paysIntroductions, calls and trials bill nothing. Only a first payment that clears the refund window does.

Example: give it a goal

Get introductions from my customers this month, $200 for each one that pays and stays 30 days, and show me the plan first.

The plan it shows runs 6 steps, priced before it spends anything; Run it above shows the result it returns.

When something fails

Each failure, and what happens next
WhenThen
A customer has an open support conversationThey are not asked that week; the ask goes to the next customer on the list.
An introduction asks not to be contactedThe person is suppressed at once, and the referrer is thanked without a follow-up.
A referred account refunds inside 30 daysNothing bills, and the reason is written to the Referral.

Each step retries three times, then falls through to the next route; one item's failure lands in skipped with its reason, never failing the call. Before a step would cross maxCost it stops and returns what it has, with a resume link. Each step's idempotency key is the call's key plus the step and the item: leaseline-referral-deliver-1-<step>-<item>.

What it promises

TermThis Service
DoneAn account a customer introduced pays its first invoice, and no refund follows in 30 days.
Counted byReferral.delivered
Billed$200 a paid introduction, on acceptance
TargetEvery introduction the month’s asks bring.
Accepted whenThe first payment clearing 30 days with no refund accepts it.
CreditedA referred account that refunds or disputes its first payment inside 30 days.
RemedyAn introduction that never pays bills nothing; the referrer still gets a thank-you note.
EvaluatorCode reads the Referral’s referrer and the referred account’s first invoice and any refund from Stripe.
WindowThe calendar month for the asks; each introduction counts when its first payment clears 30 days.
Assurancemeasured
Oversightnone: agents and code do every step

You pay $200 for each paid introduction you accept. Behind it, the agents spend about 57¢ in calls for 2 paid introductions, never more than $2, shown beside your bill. That spend is inside the $200: you are billed for accepted units only, never for the calls.

March: 20 Leaseline customers asked, 5 a week.

CountWhat happened
7Ordered
7Introductions, each routed and answered within 5 minutes.
4First calls held; 3 introductions were not a fit or went quiet.
2Paid, and cleared the 30-day refund window.
1Still in a trial: it bills in April if it pays.
2Accepted and billed: 2 × $200 = $400

Change it

AskCompiles to
Offer a month free for each introduction that pays.Referral.ask
Ask ten customers a week instead of five.Referral.deliver
Brief me two hours before each referred call.Deal.brief
TypeScript
import { $, Service } from 'startup-builder'

export default Service({
  name: 'referral-deliver',
  verb: 'Referral.deliver',
  input: { take: 'integer', offer: 'string', calendar: 'string' },
  maxCost: 2,
  // each one's cost rolls up into this call
  orders: ['Referral.ask', 'Lead.route', 'Lead.respond', 'Deal.brief'],
  oversight: { posture: 'none' },
  contract: {
    done: 'Referral.delivered', accept: {
      after: 'first-payment',
      window: '30d',
      refund: 'none'
    }, assurance: 'measured',
    bills: { usd: 200, per: 'paid introduction' }, credits: ['refund-within-30d'], remedy: 'never-bill-unpaid',
  },
  execute: async (ctx, { take = 5, offer }) => {
    await ctx.every('1w', ($) => $.Referral.ask({ take, offer }))
    on.Referral.created(async (referral, $) => {
      const lead = await $.Lead.route({
        lead: referral.lead,
        source: referral.$id
      })
      await $.Lead.respond({ lead: lead.$id, within: '5m' })
    })
  },
})

Extend it with extends: 'Referral.deliver' and base(), or compose your own from these steps.

Works with

Plays that order it: customer referrals.

OrdersKindRuns, each at its own priceRolls up
Referral askAgent task4 × About 2.4¢ per 5 asksAbout 9.8¢
Inbound routingWorkflow7 × About 0.4¢ an inboundAbout 2.8¢
Answer every inboundAgent task7 × About 1.1¢ an inboundAbout 7.4¢
Account briefAgent task4 × About 9.3¢ a briefAbout 37¢

It serves Keep and grow customers. It deepens Retention.

For agents

For agents: the guide, its approvals, retries and lookups
FactValue
GuideReferral.deliver
Guide approvalNone.
GoalGet introductions from my customers this month, $200 for each one that pays and stays 30 days, and show me the plan first. It may change counts, the order of steps, soft filters and the route a read takes, and it stops early when the goal is met. It never relaxes your words, raises its own budget, answers its own approval, calls a Play or acts outside your standing approval.
RetryThree times with backoff, then the next route; the same idempotency key never charges, sends or posts twice
Idempotency keyleaseline-referral-deliver-1
LookupsA find: input asks unless exactly one record fits

Nothing here waits for you: every step reads, or writes only your own records, up to the $2 cap.

Who does each step, and how it is checked
StepFunctionDoerCheckerAssuranceInputs
1. Ask five happy customers a week for one introduction, by Referral askagenticThe CSM agentA second model checks each ask: the outcome is theirs and true, and the reward matches the Policygraded$0.take, $0.offer
2. Route each introduced person, by Inbound routingcodeCodeA Lead.routed read-back carrying the fit and the referrermeasured$1.referrals
3. Write to each one within 5 minutes, by Answer every inboundagenticThe AE agentA second model checks each answer against your approved pages; code times it from the introductiongraded$2.leads
4. Book the callcodeCodeA Meeting.booked read-back from both calendarsmeasured$3.accepted, $0.calendar
5. Brief you before each call, by Account briefagenticThe AE agentA second model checks each fact in the brief against its sourcegraded$4.meetings
6. Read the first payment past the refund windowcodeCodeCode reads the first invoice and any refund from Stripe at day 30measured$5.deals

The CSM agent does step 1; Code does steps 2, 4 and 6; and the AE agent does steps 3 and 5. A second model checks the 3 graded steps, never the one that wrote it, so the whole call is graded.

Under the hood

Under the hood: the Systems, Nouns and Events it touches
KindWhat it touches
SystemsScheduling
NounsReferral, Lead, Meeting, Deal, Collection
EventsMeeting.booked, Collection.queried

Reference

Inputs, outputs, its Event and its errors
NameTypeDefaultMeaning
takeinteger5Customers asked for one introduction a week.
offerstringRequiredWhat the referrer gets, from your referral Policy, if anything.
calendarCalendaryour connected calendarWhere the first calls are booked, in the hours you set.

Emits one Event named for its Verb. Refuses with max-cost before it spends, and with the Data calls and Accounts groups (refusals).

Contents