Skip to content

Products

What a Startup sells: an App, an API, a Site, a Service, an agent sold as a service, or data, each sold through Offers.

A Product is what a Startup sells: an App, an API, a Site, a Service, an agent or data, each sold through an Offer. How products work maps each onto its kind.

ProductWhat it isKindBuild it in code
AppThe signed-in product your customers useSoftwareapps/[app]/ · reference
APIYour Verbs, sold to developers and agentsSoftwareproducts/[product].mdx · API
SitePublic Pages, storefront, Portal and DomainsEvery kind gets onesites/[site]/ · reference
ServiceWork agents deliver, priced per outcome, hour or monthServiceproducts/[product].mdx · reference
An agent sold as a serviceOne agent doing one job for your customersAgentproducts/[product].mdx · reference
A data productA Dataset, queried or downloadedDataproducts/[product].mdx · reference
OffersA Product at a Price, on termsAnyoffers/[offer].mdx · reference
PricingFlat, per seat, metered or per outcomeAnyoffers/[offer].mdx · reference
Software.create → App.publish
You, to your agent

Build the app my property managers sign in to.

Give each customer a dashboard of their leases and renewal dates.

Make an app where a manager sees which renewals are due this month.

# 1. Software.create
curl -X POST https://api.sb/leaseline.app/software \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Leaseline","promise":"Every lease renewal date in one place, with a reminder 90 days out."}'

# Look up the Interface: Interface.list
APP=$(curl "https://api.sb/leaseline.app/interfaces?where=kind%20%3D%20app&limit=1" \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY" | jq -r '.interfaces[0]["$id"] | split("/") | last')

# 2. App.publish
curl -X POST https://api.sb/leaseline.app/apps/$APP/publish \
  -H "Authorization: Bearer $STARTUP_BUILDER_API_KEY"
import { $ } from 'startup-builder'

await $.Software.create({ name: 'Leaseline', promise: 'Every lease renewal date in one place, with a reminder 90 days out.' })
const [app] = await $.Interface.list({ where: 'kind = app', limit: 1 })
await $.App.publish({ app: app.$id })
npx startup-builder do Software.create --json '{"name":"Leaseline","promise":"Every lease renewal date in one place, with a reminder 90 days out."}'
APP=$(npx startup-builder do Interface.list --json '{"where":"kind = app","limit":1}' | jq -r '.interfaces[0]["$id"] | split("/") | last')
npx startup-builder do App.publish --json '{"app":"'"$APP"'"}'
{
  "name": "do",
  "arguments": {
    "code": "await $.Software.create({ name: 'Leaseline', promise: 'Every lease renewal date in one place, with a reminder 90 days out.' })\nconst [app] = await $.Interface.list({ where: 'kind = app', limit: 1 })\nreturn await $.App.publish({ app: app.$id })"
  }
}

Guides. What a founder says to their agent, and the guide that does it.

You sayGuideCallsStatus
Give every new Pro customer 14 days freeAdd a free trial to a planOffer.updatelive
Add a yearly plan at $290Add a yearly planOffer.create, Offer.publishlive
Build the app my property managers sign in toBuild my appSoftware.create, App.publishbeta
Buy leaseline.appBuy a domainDomain.search, Domain.register, Domain.connectlive
Give Starter 10 exports a day, then ask them to upgradeCap usage on a planLimit.create, Offer.grant, Offer.updatelive
Charge $15 a month for each person on the teamCharge per seatOffer.create, Offer.publishlive
Connect leaseline.com. I bought it somewhere elseConnect my domainDomain.connectlive
Give me dana@leaseline.appGet email at my domainDomain.authenticate, Mailbox.createbeta
Give Riverside Property a 14-day free trialGive a customer a free trialOffer.triallive
Give the first 100 customers 20% off for three monthsGive a launch discountCoupon.createlive
Let my customers sign inLet customers sign inTenant.provision, Tenant.invitelive
Lock export to ProLock a feature to a planOffer.grantlive
Sell renewal outreach as a service at $199 a monthSell a serviceService.create, Offer.create, Offer.publishbeta
Sell renewal dates by county as dataSell my dataDataset.create, Offer.create, Offer.publishbeta
Sell renewal dates as an API, a cent per callShip an APIInterface.create, Offer.publishbeta
Keep each customer's leases, units and tenantsStore my customers' dataCollection.create, Tenant.provisionbeta
Make Harbor Residential a custom plan at $24,000 a yearMake a custom plan for one customerOffer.create, Quote.create, Quote.sendlive
Sell in the UKSell outside the USMarket.enterbeta
Set up SSO with Okta for Harbor PropertiesSet up SSO for a customerTenant.requestSetup, SSOConnection.activatebeta
Cancel a customer’s subscriptionCancel a customer’s subscriptionSubscription.unsubscribelive
Can Riverside Property export right nowCheck what a customer can doEntitlement.checklive
My domain is not workingFix my domainDomain.verifylive
License the full renewal dataset for $12,000 a yearLicense my dataOffer.create, Offer.publishbeta
Promise 99.9% uptime on ScalePromise uptime on a planOffer.updatelive
Raise Pro to $39 for new customersRaise my priceOffer.create, Offer.publish, Offer.withdrawlive
A customer posted their API key in public, replace itReplace a leaked keyAPIKey.rolllive
List renewal dates on AWS MarketplaceSell on AWS MarketplaceIntegration.connect, Integration.syncbeta