Skip to content

Customer

A Customer is a party that has accepted an Offer from a Startup at any price, including zero.

Interest alone makes a Lead, not a Customer.

Properties

PropertyTypeRequiredDescription
sincedatetimerequiredWhen the party first accepted an Offer.
outsidebooleanComputed: true when it shares no owner, account, or sibling chain with the Startup.
statusstringOne of trialing, activated, atRisk, churned, or wonBack, computed from Events and never set by hand; atRisk reads customer health.
billingEmailemailWhere Invoices and receipts go, when it differs from the sign-in email.
billingAddresstextThe address printed on new Invoices; Stripe Tax reads it to compute tax.
taxIdsstring[]The Customer’s tax ids, such as a VAT number, printed on new Invoices and read by Stripe Tax.
creditRechargejsonWhen unspent credit falls below below, buy amount of the credit Offer with the default Payment Source.

Object

JSON
{
  "$id": "https://api.sb/kilnbakery.com/customers/customer_1",
  "$type": "Customer",
  "since": "2026-10-22T12:00:00Z",
  "outside": true,
  "status": "trialing",
  "billingEmail": "tomas@kilnbakery.com",
  "billingAddress": "Example billing address",
  "taxIds": [
    "Example tax ids"
  ],
  "creditRecharge": {}
}

Relationships

Lifecycle

Customer lifecycle: trialing, activated, atRisk, churned, wonBacktrialing → activated: on Customer.activatedtrialing → churned: on Subscription.unsubscribedactivated → atRisk: on Subscription.pastDueactivated → atRisk: on Dispute.openedactivated → churned: on Subscription.unsubscribedatRisk → activated: on Invoice.collectedatRisk → churned: on Subscription.unsubscribedchurned → wonBack: on Offer.subscribedchurned → wonBack: on Order.placedwonBack → atRisk: on Subscription.pastDuewonBack → churned: on Subscription.unsubscribedtrialingactivatedchurnedatRiskwonBack
StateMeaningMoves to
trialing (first)It accepted an Offer and has not yet reached the Offer’s activation Event.activated on Customer.activated; churned on Subscription.unsubscribed when it ends its last active Subscription
activatedIt reached its Offer’s activation Event within the window and pays on time.atRisk on Subscription.pastDue when the Subscription is this Customer’s; atRisk on Dispute.opened when the disputed charge is this Customer’s; churned on Subscription.unsubscribed when it ends its last active Subscription
atRiskA renewal is past due, a Dispute is open, or its health reading fell below the line.activated on Invoice.collected when the overdue Invoice is this Customer’s; churned on Subscription.unsubscribed when it ends its last active Subscription
churnedIt holds no active Subscription and placed no Order in the window; its record stays.wonBack on Offer.subscribed when the subscriber is this Customer; wonBack on Order.placed when the buyer is this Customer
wonBackA churned Customer that subscribed or bought again.atRisk on Subscription.pastDue when the Subscription is this Customer’s; churned on Subscription.unsubscribed when it ends its last active Subscription

Verbs

  1. createCreates a Customer.
    POST /{namespace}/customersdoCustomer.created
  2. getReturns one Customer by id.
    GET /{namespace}/customers/{id}readNo Event
  3. listReturns Customers, newest first, one page at a time.
    GET /{namespace}/customersreadNo Event
  4. updateChanges the given properties of a Customer.
    PATCH /{namespace}/customers/{id}doCustomer.updated
  5. deleteDeletes a Customer; its history is kept.
    DELETE /{namespace}/customers/{id}doCustomer.deleted
  6. activateActivate marks a Customer activated on an Offer once its declared activation Event reaches the count within the window.
    POST /{namespace}/customers/{customer}/activatedoCustomer.activated
  7. exemptExempt records a Customer’s exemption or resale certificate, verifies it, and stops tax on its Orders where the certificate applies.
    POST /{namespace}/customers/{customer}/exemptdoCustomer.exempted

Permissions

Which Access level may call each Verb. One-way Verbs wait their delay window.

Operationowneradminmemberviewer
Customer.createYesYesYesNo
Customer.getYesYesYesYes
Customer.listYesYesYesYes
Customer.updateYesYesYesNo
Customer.deleteYesYesYesNo
Customer.activateYesYesYesNo
Customer.exemptYesYesYesNo

Stripe

Customer (customer). The source of truth is db.sb, and Stripe holds a copy written from it.

PropertyStripe fieldSource of truth
billingEmailemaildb.sb
billingAddressaddressdb.sb
taxIdstax_ids.data[].valuedb.sb

Call it

Text
Activate the latest customer with an offer.

Example

A developer who takes a $0 API key accepts an Offer and becomes a Customer, with since set to that day. A developer who joins the Waitlist accepts nothing and stays a Lead.