The three canonical concepts
Anything that doesn’t fit one of these three is a custom schema — and you should send it anyway (see below).
Custom schemas: model your structure truthfully
Don’t flatten your data to fit ours. If your platform has jobs, invoices, estimates, memberships, appointments, or route stops, model each as its own schema exactly as it exists in your system. There’s no penalty for sending data Reach doesn’t use yet — richer relationships mean richer segments later, and the cost of adding a relationship after go-live is higher than the cost of sending it now.Definitions vs. mappings — two steps, two parts of the UI
This is the distinction that trips people up, so be precise about it:- A schema definition is the shape of your data — a JSON Schema describing your records as they already exist. Your
customerId, yourservice_date, your field names. - A schema mapping tells Reach how to read your data as its concepts — “the
emailfield is the contact’s email,” “this schema is atransactions_schemaandtransactionTotalis the amount.”
Everything resolves to a contact
Segments return people, so every record you send should be traceable back to a contact through references. A transaction points at the customer who made it; a location points at the customer it serves; a route stop points at a location that points at a customer. As long as that chain exists, a segment can reach through any depth of related records and still answer with a list of contacts. You declare a reference with$ref and the reach:schemas/ scheme:
A concrete chain: pool service
A partner serving pool-cleaning businesses has three schemas that reference one another — each hop is a$ref from the child up to its parent:
Next: define your schemas
See the JSON Schema format,
$ref references, categories, and PII annotations.