Skip to content

Sell a service

Say "sell renewal outreach as a service at $199 a month" and get a Service with its promise, an Offer, and an acceptance step before each delivery bills.

A Service sells an outcome: the work done, with a remedy when it is not. Your agents deliver it, the customer accepts each delivery, and the Offer bills.

Needs Startup

What you get

  • 1service with its promise and what you owe if you miss itService
  • 1Offer at $199 a monthOffer
  • 1Order per delivery, with an acceptance stepOrder
  • 1agent that does the workRole
  • 1Portal page where the customer follows each deliveryPortal

Your agent does

Service.create → Offer.create → Offer.publish
You, to your agent

Sell renewal outreach as a service at $199 a month.

Do the work for my customers and charge monthly?

Turn this into a done-for-you service.

# 1. Service.create
curl -X POST https://api.sb/leaseline.app/services \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Renewal outreach","promise":"Every tenant hears about their renewal 90 days ahead, or that month is free."}'

# 2. 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":199,"currency":"USD"},"interval":"month","terms":"Monthly, billed in advance. A missed notice makes that month free."}' | jq -r '.offer["$id"] | split("/") | last')

# 3. Offer.publish
curl -X POST https://api.sb/leaseline.app/offers/$OFFER/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'

await $.Service.create({ name: 'Renewal outreach', promise: 'Every tenant hears about their renewal 90 days ahead, or that month is free.' })
const offer = await $.Offer.create({ price: { amount: 199, currency: 'USD' }, interval: 'month', terms: 'Monthly, billed in advance. A missed notice makes that month free.' })
await $.Offer.publish({ offer: offer.$id })
npx startup-builder do Service.create --json '{"name":"Renewal outreach","promise":"Every tenant hears about their renewal 90 days ahead, or that month is free."}'
OFFER=$(npx startup-builder do Offer.create --json '{"price":{"amount":199,"currency":"USD"},"interval":"month","terms":"Monthly, billed in advance. A missed notice makes that month free."}' | jq -r '.offer["$id"] | split("/") | last')
npx startup-builder do Offer.publish --json '{"offer":"'"$OFFER"'"}'
{
  "name": "do",
  "arguments": {
    "code": "await $.Service.create({ name: 'Renewal outreach', promise: 'Every tenant hears about their renewal 90 days ahead, or that month is free.' })\nconst offer = await $.Offer.create({ price: { amount: 199, currency: 'USD' }, interval: 'month', terms: 'Monthly, billed in advance. A missed notice makes that month free.' })\nreturn await $.Offer.publish({ offer: offer.$id })"
  }
}

Change it

  • Have a person check every notice before it goes out.
  • Add a $499 tier for 500 units.
  • Charge per renewal signed instead.

Under the hood

Systems
Service delivery, Billing
Nouns
Service, Offer, Order, Outcome Contract
Events
Service.created, Offer.created, Offer.published
Stripe objects
Product, Price