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
| Property | Type | Required | Description |
|---|---|---|---|
since | datetime | required | When the party first accepted an Offer. |
outside | boolean | Computed: true when it shares no owner, account, or sibling chain with the Startup. | |
status | string | One of trialing, activated, atRisk, churned, or wonBack, computed from Events and never set by hand; atRisk reads customer health. | |
billingEmail | email | Where Invoices and receipts go, when it differs from the sign-in email. | |
billingAddress | text | The address printed on new Invoices; Stripe Tax reads it to compute tax. | |
taxIds | string[] | The Customer’s tax ids, such as a VAT number, printed on new Invoices and read by Stripe Tax. | |
creditRecharge | json | When unspent credit falls below below, buy amount of the credit Offer with the default Payment Source. |
Object
{
"$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
- A Customer accepts many Offers: a party becomes a Customer by accepting any Offer, at any price including zero.
accepts, inverseacceptedBy. - A Customer is acquired by one Acquisition: a Customer inherits the Acquisition of the Lead it was; Metrics and payouts read this one row.
acquiredBy, inversecustomers. - A Customer has one Contact: a Contact becomes a Customer on accepting an Offer.
contact, inversebecomes. - A Customer has many Credit Grants: the Customer whose metered calls spend the balance; credits never move to another Customer.
creditGrants, inversecredits. - A Customer holds many Entitlements: a Customer’s Entitlements are what it may do right now, granted by the Offers it accepted.
holds, inverseheldBy. - A Customer has many Invoices: each Invoice is owed by one Customer.
invoices, inversecharges. - A Customer maintains many Subscriptions: a Customer holds Subscriptions, each billed once per Period.
maintains, inversesubscriber. - A Customer opens many Conversations: the Customer a Conversation serves, so every answer reads that Customer’s records.
opens, inversecustomer. - A Customer owns one Tenant: each Customer has one Tenant: the partition of the Startup’s data that no other Customer reads.
owns, inverseownedBy. - A Customer places many Orders: a Customer commits to one-time purchases as Orders.
places, inverseplacedBy. - A Customer saves many Payment Sources: a Customer saves the Payment Sources its Orders, Subscriptions and Invoices charge; each belongs to one Startup and never moves to a sibling.
saves, inversesavedBy. - A Customer is served by one Startup: a Startup serves every party that has accepted one of its Offers.
servedBy, inverseserves. - A Customer signs into one Portal: Customers sign in to a Portal to order, track delivery, accept work, and pay.
signsInto, inverseserves.
Lifecycle
| State | Meaning | Moves 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 |
activated | It 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 |
atRisk | A 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 |
churned | It 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 |
wonBack | A 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
createCreates a Customer.POST /{namespace}/customersgetReturns one Customer by id.GET /{namespace}/customers/{id}listReturns Customers, newest first, one page at a time.GET /{namespace}/customersupdateChanges the given properties of a Customer.PATCH /{namespace}/customers/{id}deleteDeletes a Customer; its history is kept.DELETE /{namespace}/customers/{id}activateActivate marks a Customer activated on an Offer once its declared activation Event reaches the count within the window.POST /{namespace}/customers/{customer}/activateexemptExempt records a Customer’s exemption or resale certificate, verifies it, and stops tax on its Orders where the certificate applies.POST /{namespace}/customers/{customer}/exempt
Permissions
Which Access level may call each Verb. One-way Verbs wait their delay window.
| Operation | owner | admin | member | viewer |
|---|---|---|---|---|
Customer.create | Yes | Yes | Yes | No |
Customer.get | Yes | Yes | Yes | Yes |
Customer.list | Yes | Yes | Yes | Yes |
Customer.update | Yes | Yes | Yes | No |
Customer.delete | Yes | Yes | Yes | No |
Customer.activate | Yes | Yes | Yes | No |
Customer.exempt | Yes | Yes | Yes | No |
Stripe
Customer (customer). The source of truth is db.sb, and Stripe holds a copy written from it.
| Property | Stripe field | Source of truth |
|---|---|---|
billingEmail | email | db.sb |
billingAddress | address | db.sb |
taxIds | tax_ids.data[].value | db.sb |
Call it
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.