How ackDB works
This page explains how ackDB structures data and how to think about storing and querying it.
1. Member, Company, and Person
At the top of ackDB's mental model are three objects. Keep them separate before thinking about how data connects them:
A Member belongs to your own team. A Company is one account in your customer universe. A Person is one human, independent of where they work.
Member and Person are deliberately different. A sales representative or customer success manager is a Member because they operate and own records inside ackDB. The humans appearing in customer data are People, whose identities remain intact across sources and company changes.
A Contact is a Person's relationship with one Company. When that relationship is current, the Contact is active and carries company-specific context such as title and work email. If it ends, the Contact becomes former while the Person remains the same.
2. What is ackDB composed of?
Your customer activity is composed of three things:
- Events say what happened.
- Attributes say what is true now.
- Identity links say which record the data belongs to.
Events make up source packs.
Events
An event is one timestamped fact from one source: a Slack message, a paid invoice, a booked meeting. Every event lands on exactly one Company, and is tied to a Contact when it involves a specific person. Events are append-only.
Here are two events shown as the useful details ackDB keeps together:
Attributes
Attributes are current facts associated with one Company, Person, or Contact: lifecycle stage, location, owner. You can define your own attributes on each of them.
Identity links
Identity links are external identifiers associated with a record: domain for a Company, linkedin_url for a Person, email_address for a Contact, and per-source ids such as stripe_customer_id. They keep the same company and the same human as one record across all events.
3. Source packs
A combination of events is called a source pack. It describes what one source can send: structure, not the customer records themselves.
Instead of designing and maintaining a custom pack for every source, use the pre-defined source packs, already structured for storage and querying in ackDB. Each event type declares:
- Company-scoped data connects directly to a Company.
- Person-scoped data connects to a Person and to the Company through that Person's Contact.
Either way, every event is company-scoped at the root: it always lands on a Company, and can also be tied to one of that Company's Contacts.