Skip to content

Make a custom plan for one customer

Say "make this customer a custom plan at $24,000 a year" and get a private Offer, a Quote with an accept link and an invoice on their terms.

For developers

A custom plan is a private Offer that one buyer sees, sent as a Quote. The buyer accepts it, and the Agreement and invoice follow from the same terms.

For developers

Needs Charge monthly · Open a bank account

What you get

  • 1private Offer at $24,000 a year that only Harbor Residential seesOffer
  • 1Quote with its own accept link, valid until November 30Quote
  • 1order form the Contracts Manager signs, within the amount it may sign forAgreement
  • 1yearly invoice due in 30 days, with their purchase order numberInvoice

Your agent does

Offer.create → Quote.create → Quote.send
You, to your agent

Make Harbor Residential a custom plan at $24,000 a year.

Quote an enterprise deal.

Give one buyer its own private price.

# 1. Offer.create
OFFER=$(curl -X POST https://api.sb/leaseline.app/offers \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"price":{"amount":24000,"currency":"USD"},"interval":"year","privateTo":"organization_harbor","terms":"Yearly, invoiced net 30. Up to 4,000 units, single sign-on and 99.9% monthly uptime."}' | jq -r '.offer["$id"] | split("/") | last')

# 2. Quote.create
QUOTE=$(curl -X POST https://api.sb/leaseline.app/quotes \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"total":{"amount":24000,"currency":"USD"},"validUntil":"2026-11-30","lines":[{"offer":"'"$OFFER"'","quantity":1}],"paymentTerms":{"collection":"send","terms":30,"purchaseOrder":"PO-2291"}}' | jq -r '.quote["$id"] | split("/") | last')

# 3. Quote.send
curl -X POST https://api.sb/leaseline.app/quotes/$QUOTE/send \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'

const offer = await $.Offer.create({ price: { amount: 24000, currency: 'USD' }, interval: 'year', privateTo: 'organization_harbor', terms: 'Yearly, invoiced net 30. Up to 4,000 units, single sign-on and 99.9% monthly uptime.' })
const quote = await $.Quote.create({ total: { amount: 24000, currency: 'USD' }, validUntil: '2026-11-30', lines: [{ offer: offer.$id, quantity: 1 }], paymentTerms: { collection: 'send', terms: 30, purchaseOrder: 'PO-2291' } })
await $.Quote.send({ quote: quote.$id })
OFFER=$(npx startup-builder do Offer.create --json '{"price":{"amount":24000,"currency":"USD"},"interval":"year","privateTo":"organization_harbor","terms":"Yearly, invoiced net 30. Up to 4,000 units, single sign-on and 99.9% monthly uptime."}' | jq -r '.offer["$id"] | split("/") | last')
QUOTE=$(npx startup-builder do Quote.create --json '{"total":{"amount":24000,"currency":"USD"},"validUntil":"2026-11-30","lines":[{"offer":"'"$OFFER"'","quantity":1}],"paymentTerms":{"collection":"send","terms":30,"purchaseOrder":"PO-2291"}}' | jq -r '.quote["$id"] | split("/") | last')
npx startup-builder do Quote.send --json '{"quote":"'"$QUOTE"'"}'
{
  "name": "do",
  "arguments": {
    "code": "const offer = await $.Offer.create({ price: { amount: 24000, currency: 'USD' }, interval: 'year', privateTo: 'organization_harbor', terms: 'Yearly, invoiced net 30. Up to 4,000 units, single sign-on and 99.9% monthly uptime.' })\nconst quote = await $.Quote.create({ total: { amount: 24000, currency: 'USD' }, validUntil: '2026-11-30', lines: [{ offer: offer.$id, quantity: 1 }], paymentTerms: { collection: 'send', terms: 30, purchaseOrder: 'PO-2291' } })\nreturn await $.Quote.send({ quote: quote.$id })"
  }
}

Change it

  • Give them 10% off if they sign by Friday.
  • Split it into two years at $22,000 and $26,000.
  • Let them pay by card instead.

Under the hood

Systems
CRM, Billing
Nouns
Offer, Quote, Agreement, Invoice
Events
Offer.created, Quote.sent, Quote.accepted
Stripe objects
Quote, Invoice