The customer object
A customer is a company or a person that pays you, or might. The record is
resolved from what every source says about them, and carries the amounts
computed from their subscriptions, such as mrr and status. The changes
to those subscriptions are the run rate movements.
Attributes
idstring (UUID)The customer’s Summerbase id. Anywhere a customer is addressed, one of its
identitiesworks too.objectstringThe object’s type, always
customer.Always
customerarrdecimal stringWhat this customer is worth a year, in the project’s reporting currency, at today’s rate:
mrr, rounded to the cent, times twelve.churned_attimestampWhen the current churn began — the instant
statusbecamechurned. Null while the customer is trialing or active, and cleared when they come back.countryobjectThe country the customer is billed in. Expandable.
Show 3 child attributes
objectstringThe object’s type, always
country.Always
countrycodestringIts ISO 3166-1 alpha-2 code:
US,DK.namestringWhat it is called, in English:
United States,Denmark.
country_codestringThe country the customer is billed in, by its ISO 3166-1 alpha-2 code — the
country_codeproperty, resolved the same way asname, from the highest-priority source whose value is a country’s code. Expandcountryfor its name.created_attimestampWhen Summerbase first recorded the customer.
emailstringThe customer’s address, resolved the same way as
name.erasuresarray of objectsEvery erasure of their personal data, oldest first. Expandable.
Show 10 child attributes
idstring (UUID)The erasure’s unique identifier.
objectstringThe object’s type, always
customer_erasure.Always
customer_erasurecompleted_attimestampWhen every copy Summerbase keeps had been removed too, or empty while that is still to happen — within a day of
requested_at.customerobjectThe customer whose data was erased. Expandable.
Show 20 child attributes
idstring (UUID)The customer’s Summerbase id. Anywhere a customer is addressed, one of its
identitiesworks too.objectstringThe object’s type, always
customer.Always
customerarrdecimal stringWhat this customer is worth a year, in the project’s reporting currency, at today’s rate:
mrr, rounded to the cent, times twelve.churned_attimestampWhen the current churn began — the instant
statusbecamechurned. Null while the customer is trialing or active, and cleared when they come back.countryobjectThe country the customer is billed in. Expandable.
country_codestringThe country the customer is billed in, by its ISO 3166-1 alpha-2 code — the
country_codeproperty, resolved the same way asname, from the highest-priority source whose value is a country’s code. Expandcountryfor its name.created_attimestampWhen Summerbase first recorded the customer.
emailstringThe customer’s address, resolved the same way as
name.erasuresarray of objectsEvery erasure of their personal data, oldest first. Expandable.
first_paying_attimestampThe first instant this customer had revenue — when
statusfirst becamepaying, and what cohort analysis groups by. Set once and kept through churn and reactivation. Which month it falls in depends on the timezone being reported in.first_seen_attimestampThe earliest instant anything was asserted about this customer, their subscriptions or their items — the first thing we were told. Set once.
first_subscribed_attimestampThe first instant one of this customer’s subscriptions was live, free or paying — when
statusfirst became one of the two. Set once and kept through churn.identitiesarray of stringsWhat each source calls this customer, as
source:id. Any entry addresses it —stripe:cus_123.mrrdecimal stringWhat this customer is worth a month, in the project’s reporting currency, at today’s rate, rounded to the cent.
Every kind of revenue counts, each change converted from the currency it was billed in, so this amount moves when a rate does and when the project’s reporting currency changes. The same amount a filter on
customer.mrrcompares and a list sorted bymrrorders by.namestringWhat the customer is called — the
nameproperty, resolved to the highest-priority source that has one. Writeproperties.nameto change it.propertiesobjectYour source’s properties on this customer, as they stand now. What you write here is what you read back — another source’s values never appear in it and can never be overwritten through it.
properties_by_sourcehas everyone’s.properties_by_sourceobjectEvery source’s properties on this customer, keyed by source slug — including your own. Read-only: a write only ever reaches the source it is attributed to.
signed_up_attimestampWhen the customer signed up for the product — the
signed_up_atproperty, resolved the same way asname. Writeproperties.signed_up_atto set it; a billing provider’s source writes the moment it first saw the customer, and a project’s own source outranks it. A customer who has signed up and never subscribed istrialing.statusenumWhere the customer stands with us, derived from what is live now:
paying,free,churned,trialingorlead. A subscription is live while its status isactive; paying and free are told apart bymrr, sopayingmeans on a paid plan, whether or not an invoice has been settled. A customer with nothing live who has subscribed before ischurned; one on a trial, or who has signed up and never subscribed, istrialing; anyone else is alead. A change undone inside the project’s collapse window never happened to the status either.One of
paying,free,churned,trialing,leadsubscriptionsarray of objectsEverything they are subscribed to, from every source. Expandable.
customer_idstring (UUID)The customer whose data was erased.
erased_identity_sourcesarray of stringsThe slug of the source each erased identity came from, one entry per identity. The identities themselves are not kept.
erased_propertiesarray of stringsEach property erased, as
record.properties.source.key. A property is listed once however many values it held.requested_attimestampWhen the erasure was asked for. Erased values were gone from every answer moments after.
requested_byobjectWho asked for the erasure, when a person did. Empty when an API key did. Expandable.
Show 6 child attributes
idstring (UUID)The user’s unique identifier.
objectstringThe object’s type, always
user.Always
usercreated_attimestampWhen the account was created.
emailstringThe email address the account signs in with.
namestringThe name on the account.
oauth_providerstringThe provider the account signs in with, or null for email and password.
requested_by_idstring (UUID)Who asked for the erasure, when a person did. Empty when an API key did.
first_paying_attimestampThe first instant this customer had revenue — when
statusfirst becamepaying, and what cohort analysis groups by. Set once and kept through churn and reactivation. Which month it falls in depends on the timezone being reported in.first_seen_attimestampThe earliest instant anything was asserted about this customer, their subscriptions or their items — the first thing we were told. Set once.
first_subscribed_attimestampThe first instant one of this customer’s subscriptions was live, free or paying — when
statusfirst became one of the two. Set once and kept through churn.identitiesarray of stringsWhat each source calls this customer, as
source:id. Any entry addresses it —stripe:cus_123.mrrdecimal stringWhat this customer is worth a month, in the project’s reporting currency, at today’s rate, rounded to the cent.
Every kind of revenue counts, each change converted from the currency it was billed in, so this amount moves when a rate does and when the project’s reporting currency changes. The same amount a filter on
customer.mrrcompares and a list sorted bymrrorders by.namestringWhat the customer is called — the
nameproperty, resolved to the highest-priority source that has one. Writeproperties.nameto change it.propertiesobjectYour source’s properties on this customer, as they stand now. What you write here is what you read back — another source’s values never appear in it and can never be overwritten through it.
properties_by_sourcehas everyone’s.properties_by_sourceobjectEvery source’s properties on this customer, keyed by source slug — including your own. Read-only: a write only ever reaches the source it is attributed to.
signed_up_attimestampWhen the customer signed up for the product — the
signed_up_atproperty, resolved the same way asname. Writeproperties.signed_up_atto set it; a billing provider’s source writes the moment it first saw the customer, and a project’s own source outranks it. A customer who has signed up and never subscribed istrialing.statusenumWhere the customer stands with us, derived from what is live now:
paying,free,churned,trialingorlead. A subscription is live while its status isactive; paying and free are told apart bymrr, sopayingmeans on a paid plan, whether or not an invoice has been settled. A customer with nothing live who has subscribed before ischurned; one on a trial, or who has signed up and never subscribed, istrialing; anyone else is alead. A change undone inside the project’s collapse window never happened to the status either.One of
paying,free,churned,trialing,leadsubscriptionsarray of objectsEverything they are subscribed to, from every source. Expandable.
Show 22 child attributes
idstring (UUID)The subscription’s Summerbase id. Anywhere a subscription is addressed, one of its
identitiesworks too.objectstringThe object’s type, always
subscription.Always
subscriptionannual_amountdecimal stringWhat this subscription is worth a year, in
currency_code:monthly_amounttimes twelve.billing_amountsarray of objectsWhat this subscription comes to each time it bills: the items still on it, their
net_amountsummed per billing interval, longest interval first. One entry for nearly every subscription; one per interval for a subscription whose items bill on different ones, such as a yearly fee beside a monthly one. Its price whatever its status — a trial still has one.monthly_amountis what it is worth on one footing.Show 3 child attributes
intervalenumThe unit these items bill in:
day,week,monthoryear.One of
day,week,month,yearinterval_countintegerHow many of
intervalbetween charges:3andmonthis quarterly.net_amountdecimal stringThe items on this interval summed, each its
net_amount, in the subscription’scurrency_code.
cancels_attimestampA cancellation already booked. It is still in service until then, and the source says so with
status: canceledwhen it stops.currencyobjectThe currency it bills in. Expandable.
Show 3 child attributes
objectstringThe object’s type, always
currency.Always
currencycodestringIts ISO 4217 code —
USD,EUR,DKK.namestringWhat it is called, in English:
US dollar,Danish krone.
currency_codestringThe currency it bills in, by its ISO 4217 code.
current_period_ends_attimestampWhen the current billing period ends. The next charge is due then, unless a cancellation is booked for it.
customerobjectThe customer who is subscribed. Expandable.
Show 20 child attributes
idstring (UUID)The customer’s Summerbase id. Anywhere a customer is addressed, one of its
identitiesworks too.objectstringThe object’s type, always
customer.Always
customerarrdecimal stringWhat this customer is worth a year, in the project’s reporting currency, at today’s rate:
mrr, rounded to the cent, times twelve.churned_attimestampWhen the current churn began — the instant
statusbecamechurned. Null while the customer is trialing or active, and cleared when they come back.countryobjectThe country the customer is billed in. Expandable.
country_codestringThe country the customer is billed in, by its ISO 3166-1 alpha-2 code — the
country_codeproperty, resolved the same way asname, from the highest-priority source whose value is a country’s code. Expandcountryfor its name.created_attimestampWhen Summerbase first recorded the customer.
emailstringThe customer’s address, resolved the same way as
name.erasuresarray of objectsEvery erasure of their personal data, oldest first. Expandable.
first_paying_attimestampThe first instant this customer had revenue — when
statusfirst becamepaying, and what cohort analysis groups by. Set once and kept through churn and reactivation. Which month it falls in depends on the timezone being reported in.first_seen_attimestampThe earliest instant anything was asserted about this customer, their subscriptions or their items — the first thing we were told. Set once.
first_subscribed_attimestampThe first instant one of this customer’s subscriptions was live, free or paying — when
statusfirst became one of the two. Set once and kept through churn.identitiesarray of stringsWhat each source calls this customer, as
source:id. Any entry addresses it —stripe:cus_123.mrrdecimal stringWhat this customer is worth a month, in the project’s reporting currency, at today’s rate, rounded to the cent.
Every kind of revenue counts, each change converted from the currency it was billed in, so this amount moves when a rate does and when the project’s reporting currency changes. The same amount a filter on
customer.mrrcompares and a list sorted bymrrorders by.namestringWhat the customer is called — the
nameproperty, resolved to the highest-priority source that has one. Writeproperties.nameto change it.propertiesobjectYour source’s properties on this customer, as they stand now. What you write here is what you read back — another source’s values never appear in it and can never be overwritten through it.
properties_by_sourcehas everyone’s.properties_by_sourceobjectEvery source’s properties on this customer, keyed by source slug — including your own. Read-only: a write only ever reaches the source it is attributed to.
signed_up_attimestampWhen the customer signed up for the product — the
signed_up_atproperty, resolved the same way asname. Writeproperties.signed_up_atto set it; a billing provider’s source writes the moment it first saw the customer, and a project’s own source outranks it. A customer who has signed up and never subscribed istrialing.statusenumWhere the customer stands with us, derived from what is live now:
paying,free,churned,trialingorlead. A subscription is live while its status isactive; paying and free are told apart bymrr, sopayingmeans on a paid plan, whether or not an invoice has been settled. A customer with nothing live who has subscribed before ischurned; one on a trial, or who has signed up and never subscribed, istrialing; anyone else is alead. A change undone inside the project’s collapse window never happened to the status either.One of
paying,free,churned,trialing,leadsubscriptionsarray of objectsEverything they are subscribed to, from every source. Expandable.
customer_idstring (UUID)The customer who is subscribed.
ended_attimestampWhen service stopped, beside
status: canceled. Clear it, withstatusback toactive, to resume a subscription; the same id may be brought back as often as the source does so.identitiesarray of stringsWhat each source calls this subscription, as
source:id. Any entry addresses it —stripe:cus_123.itemsarray of objectsThe items it is made of, and where the money is. Expandable.
Show 22 child attributes
idstring (UUID)The item’s Summerbase id. Anywhere an item is addressed, one of its
identitiesworks too.objectstringThe object’s type, always
subscription_item.Always
subscription_itemcreated_attimestampWhen this item was first recorded.
deletedbooleanWhether the item has come off the subscription. When it did is the
effective_atof the write that set this.discount_amountdecimal stringWhat comes off this item’s invoice, in the subscription’s currency, after every discount the source applies to it has been worked out: coupons at any level, stacked in the source’s order, restricted to the products they cover. The item is worth
unit_amount × quantityless this, each interval. Zero is no discount.discount_ends_attimestampWhen the discount, or the earliest part of it, stops applying, if the source knows. Information for a reader: the discount comes off when the source writes a smaller
discount_amount, not when this passes.identitiesarray of stringsWhat each source calls this subscription item, as
source:id. Any entry addresses it —stripe:cus_123.intervalenumThe unit this item bills in.
One of
day,week,month,yearinterval_countintegerHow many intervals between charges.
net_amountdecimal stringWhat this item comes to each time it is billed, in its subscription’s currency:
unit_amounttimesquantity, lessdiscount_amount.plan_idstring (UUID)The plan this item is on: its price’s.
plan_namestringWhat the plan this item is on is called: its price’s.
priceobjectThe price this item is on, when a source named one. Expandable.
price_idstring (UUID)The price this item is on, when a source named one.
price_namestringWhat the price this item is on is called, when a source named one.
pricing_modelenumHow the unit amount is arrived at.
One of
fixed,tiered,meteredpropertiesobjectYour source’s properties on this subscription item, as they stand now. What you write here is what you read back — another source’s values never appear in it and can never be overwritten through it.
properties_by_sourcehas everyone’s.properties_by_sourceobjectEvery source’s properties on this subscription item, keyed by source slug — including your own. Read-only: a write only ever reaches the source it is attributed to.
quantitydecimal stringHow many units at this unit amount. A decimal, because a unit is not always a whole seat: a billing system that meters usage sends 1.5 of something, and rounding it would misstate what the item is worth.
subscriptionobjectThe subscription this is an item of. Expandable.
subscription_idstring (UUID)The subscription this is an item of.
unit_amountdecimal stringWhat one unit costs per interval. Excludes tax and any discount.
monthly_amountdecimal stringWhat this subscription is worth a month, in
currency_code, after the items’ discounts — derived, not reported. The sum of what its items are worth; zero while it is on trial, paused or ended, and zero on a free plan. A customer’smrris these summed across their subscriptions, in the reporting currency.owner_sourceobjectThe source this subscription lives in — the only one that may write its own fields. Any source may attach properties and identities to it. Expandable.
Show 18 child attributes
idstring (UUID)The source’s unique identifier. Records are identified by its
slug.objectstringThe object’s type, always
source.Always
sourceconnected_attimestampWhen a provider source was given its credential, or empty: a provider source that has not been connected yet or has been disconnected, and every source that is not a provider’s.
created_attimestampWhen the source was added.
import_failed_attimestampWhen the last import gave up, or empty when none has since the last one succeeded. The source’s log says why.
import_progressdecimal stringHow far the running import has got, from 0 to 1, or empty while it does not know yet.
import_started_attimestampWhen the import now running began, or empty when none is. Every metric that reads this source’s records is incomplete until it ends.
import_stepstringWhat the running import is doing, in a sentence:
Importing customers, 1,240 of 8,100.imported_attimestampWhen the last import finished, or empty when none has.
namestringWhat the source is called, for people reading a screen.
priorityintegerWhere this source sits when resolving
nameandemail. Lower wins, and the project’s own source starts at the top so a manual correction outranks a provider sync. It orders nothing else — every other property is namespaced by source and never arbitrated.project_idstring (UUID)The project the source belongs to.
provider_account_idstringThe provider’s own id for the account the source is connected to:
acct_…for Stripe. Kept through a disconnect, so that connecting again is checked against it.provider_codeenumThe code of the system the source pulls from.
customis a source you write to yourself, and the only one that accepts writes;stripeis connected withconnect_stripeand fetches for itself.One of
custom,stripe,summerbasesandboxbooleanWhether the connection is to the provider’s test mode rather than a live account; empty while nothing is connected.
slugstringHow this source’s records are identified — the
stripeinstripe:cus_123. Lowercase letters, digits, hyphens and underscores; unique within the project and fixed once the source exists, because integrations hard-code it. A reference shaped like an id is read as one, so a slug may not look like a UUID.webhook_installed_attimestampWhen the provider’s webhook was installed for this source — by the connection, or by hand and registered with
register_stripe_webhook— or empty: nothing is connected, or the source is connected without a webhook and its changes arrive with the hourly reconcile.webhook_urlstringWhere the provider posts this source’s events: the address of the endpoint a connection installs, and of one to install by hand. Empty for a source whose provider posts no webhooks.
owner_source_idstring (UUID)The source this subscription lives in — the only one that may write its own fields. Any source may attach properties and identities to it.
propertiesobjectYour source’s properties on this subscription, as they stand now. What you write here is what you read back — another source’s values never appear in it and can never be overwritten through it.
properties_by_sourcehas everyone’s.properties_by_sourceobjectEvery source’s properties on this subscription, keyed by source slug — including your own. Read-only: a write only ever reaches the source it is attributed to.
recorded_attimestampWhen Summerbase first recorded it. Never set by a caller.
started_attimestampWhen the subscription began — derived, not reported.
It is the earliest instant anything was asserted about the subscription or its items. A source cannot say it began earlier than it described it: send the earliest write with
effective_atat the real start instead, which is what an import of history does anyway.It moves earlier when a later write describes an earlier moment.
statusenumWhere it is in its life. Not whether it has been paid for.
One of
pending,trialing,active,paused,canceledtrial_ends_attimestampWhen the trial ends, or ended. A subscription that trials starts trialing, so when it began is
started_atand its status history.
Example
{ "arr": "15000.00", "churned_at": null, "country_code": "US", "created_at": "2025-11-03T16:20:04Z", "email": "billing@northwind.example.com", "first_paying_at": "2025-12-01T10:04:00Z", "first_seen_at": "2025-11-03T16:20:00Z", "first_subscribed_at": "2025-11-17T10:04:00Z", "id": "0199a7c2-4e1b-7f38-b9d2-5a6c8e0f1d73", "identities": [ "stripe:cus_QX7bN2kLp4Rt9v", "backend:acct_4821" ], "mrr": "1250.00", "name": "Northwind Labs", "object": "customer", "properties": { "seats": 25 }, "properties_by_source": { "backend": { "seats": 25 }, "stripe": { "email": "billing@northwind.example.com", "name": "Northwind Labs" } }, "signed_up_at": "2025-11-03T16:20:00Z", "status": "paying"}