Policies, properties, vehicles, cohorts, shipments, licences, machines. Define the record type yourself, give it typed fields, link it to the customer it belongs to, and let automations act on it.
The half of your business currently living in a spreadsheet nothing else can see.
Get StartedFive statements from this page that stand on their own, with where each one comes from. The first two are the comparison most buyers want and rarely get stated plainly.
HubSpot custom objects require an Enterprise subscription and are capped at 10 custom objects per account, with additional objects and records sold separately.
HubSpot, Create and edit custom objects
GoHighLevel makes custom objects available on every subscription tier including Starter, capped at 10 per location.
GoHighLevel, Custom Objects In All Plans + Higher Limit
Inflowave custom objects require the MAX plan and allow 25 object types, 200 fields per object and 100,000 records per object, rising to no limit on Enterprise.
Inflowave product
A lookup field on an Inflowave custom object can point at a contact, at another custom object, or at an entire client workspace, and the record author chooses whether a deletion cascades or clears the link.
Inflowave product
Inflowave rejects a write to a custom object that contains a field which was never defined, and rejects values that do not match the declared field type.
Inflowave product
Competitor claims taken from each vendor own published documentation and checked on 30 July 2026. Products in this category change often, so verify anything that decides a purchase.
Almost every business running a CRM also runs a spreadsheet beside it. It has the policies, or the properties, or the vehicles, or the cohorts. Somebody owns it, it is usually the person who least wants to, and it is the actual operational record of the business.
It persists because the CRM had no shape for the thing. So people improvise. The three common improvisations are a note on the contact, a pile of numbered fields, or a tag, and all three fail the same way: none of them can hold two of something, and none of them can be acted on.
There is a clean test for whether you need this. Have you ever created a field called policy 2 start date? Then you needed a second record, not a second field, and everybody in the building already knows it.
One contact with three policies has three renewal dates, three premiums and three reference numbers. Fields on a contact can express one of something. Everything after that is numbered fields and regret.
A date in a spreadsheet is a date somebody has to notice. A date on a record is a date that can send a message, move a deal or create a task on its own, ninety days out, every time, without anybody remembering.
A spreadsheet accepts anything, so eventually it contains Active, active, ACTIVE and a blank, and the report everybody relies on has quietly been wrong for a year. Nothing warns you, because nothing is checking.

An object is a name, a plural, an icon, and a set of fields. It takes about ten minutes and no technical knowledge, and the only decision that needs care is the type of each field.
A short line or a paragraph. The default for anything you have not decided the shape of yet, and the one to avoid using for everything, because a text field holding a number is how a report becomes impossible.
Stored as numbers rather than strings, so they add up, sort correctly and can be compared in a workflow condition. Currency is separated because money is the field people most often want totalled.
The field that turns a record into an automation. A renewal date, an expiry, a service due date, a cohort start. Something has to hold the date before anything can act on it.
A real boolean rather than the word yes typed into a text box, which is the single most common reason a filter returns nothing on an inherited spreadsheet.
A fixed list of options. Anything not on the list is refused, which is what keeps you from ending up with Active, active, ACTIVE and Actve as four different statuses.
Checked on the way in. An email field will not accept something that is not an address, and a web address field will not accept a sentence.
The field that stops this being a spreadsheet. It points at a contact, at a client workspace, or at another object of yours, and you decide what happens to the record if the thing it points at is deleted.

Any field can be made compulsory, forced to be unique so you cannot enter the same reference twice, or marked sensitive so the value is encrypted where it is stored and shown as dots on screen. Use the last one for the fields you would not want in a screenshot.
The internal name and the field type. Labels, options, order and whether something is required are all editable whenever you like, but a type change would mean reinterpreting every value already stored, and there is no honest way to do that automatically. So it refuses, and you add a new field and move across instead.

A table of policies is a spreadsheet with better validation. A table of policies where each one knows whose policy it is becomes something else entirely, because now every fact about the policy is also a fact about the customer.
A lookup field can point at a contact, at another object of yours, or at a whole client workspace. That third one is what an agency needs, because the thing being tracked usually belongs to the client rather than to one named person at the client, and modelling it against a person breaks the day that person leaves.
You also decide what a deletion means. If the contact goes, the record can go with them, or the link can simply be cleared and the record kept. Those are genuinely different intentions and most tools pick one for you.
Being honest about the shape of it: a lookup points at one target, and there are no named relationships. If you need the same two records related in three different ways, with each direction labelled, GoHighLevel and Salesforce both model that properly and this does not.
The contact it links to is the same record the whole system uses, so it carries their deal and timeline and their conversation history.
Modelling your data is satisfying and does not, by itself, make you any money. What makes money is that the model can now act.
Creating a record, updating one, deleting one and linking one are all triggers. Creating, finding and updating records are all actions. So a workflow can react to your data, and can maintain it.
This is the detail that makes the difference and it is easy to miss. When a record is linked to people, the trigger fires once per linked person rather than once for the record. So the action that follows has a human to act on: it can send that customer a message, not merely log that something changed. Without it, a record-level automation can update a field and nothing else.
Because finding and updating a record are actions, the object does not depend on somebody remembering to maintain it. A won deal can create the enrolment. A payment can mark the policy active. A form submission can update the vehicle. The data stays true because keeping it true is not left to a person to remember.
A broker defines a Policy object with a renewal date, a premium and an encrypted policy number, and links each one to the customer who holds it. One workflow watches the renewal date and, ninety days out, messages the customer on whichever channel they last replied on and creates a task for the person who sold it.
That is the whole thing, and it replaces a spreadsheet, a calendar reminder and somebody being conscientious in December. Same shape for a garage and a service date, a training company and a cohort start, a landlord and a tenancy end.
The triggers and actions are built in the workflow builder, and the message that goes out can be a DM, an email or a text.
Anybody can offer a flexible data model. The difference between one that is still trustworthy after two years of a real team using it and one that is not comes down to what it refuses.
A number field will not accept text, an email field will not accept a sentence, a web address field will not accept a name, and a choose-one field will not accept an option that is not on the list. Every one of those is a report that keeps working.
Send data with a field nobody created and the write is rejected with the offending name. It sounds pedantic until an integration invents a field for six months and nobody notices, at which point you have two sources of truth inside one record.
An update can say which version it was based on, and is refused if the record moved in the meantime. The second person gets told rather than silently winning, which is the difference between a conflict and a mystery.
A sensitive field is encrypted where it is stored and masked on screen. Being clear about the boundary: that protects the value at rest, it is not a permission system, and deciding who should see a record at all is a coarser control here than in Salesforce.
On MAX: twenty-five object types, two hundred fields on each, and a hundred thousand records per object. On Enterprise: no limit on any of the three. For comparison, HubSpot allows ten custom objects on their Enterprise tier and roughly half a million records across all of them combined, and GoHighLevel allows ten per location.
The honest list of what is missing:
Insurance, property, vehicles, equipment, memberships, tenancies, licences. The pattern is always the same: the customer is one thing, but the thing they bought has its own dates, its own status and its own reference, and it renews or expires on its own schedule. That schedule is where the repeat revenue lives, and in most businesses it is guarded by a spreadsheet and one conscientious person.
The renewal reminder itself is built in workflows.
Retainers, deliverables, ad accounts, campaigns as things you own rather than lines in a proposal. The lookup pointing at a client workspace rather than a person is the reason this works for an agency: the retainer belongs to the client, and it should survive the marketing manager changing job.
More in the agency use case and what we build for agencies.
A cohort is a thing with a start date, a capacity and a list of people in it, and it is not a deal. Modelling it properly means you can see who is enrolled in what, message one cohort rather than everybody, and start the onboarding sequence when the enrolment is created instead of when somebody notices.
Garages, clinics, installers, lettings, equipment hire. This is the group with the most to gain and the least appetite for configuring anything, so the honest advice is to model exactly one thing and stop. The boiler, the vehicle, the treatment plan, the machine. Not five objects, one.
And model it because of a date, not because it would be tidy. A boiler with a service date that texts the customer eleven months later is worth real money every year and takes an afternoon to set up. A beautifully structured record of equipment nobody automates against is a spreadsheet with extra steps.
The plan requirement is worth saying plainly to this reader: it needs MAX, which is not the tier most businesses of this size start on. If the renewal or service cycle is where your repeat revenue comes from, it pays for itself quickly. If it is a nice-to-have, wait.
See how small businesses use Inflowave and what it costs for a small team.
Open the spreadsheet you already keep and model that. It is the thing your business actually runs on, it already has the fields, and it already has the data. Resist designing the whole model on day one, because the objects you invent before you have used one are always slightly wrong.
This is the only irreversible decision on the page. Dates as dates, numbers as numbers, statuses as a fixed list rather than free text. Making everything a text field works for a week and then quietly ruins every report you build on it.
Decide whether the record belongs to a person or to a client workspace and wire that first. Importing four hundred records and then working out who each one belongs to is a worse afternoon than it sounds.
Before you import everything, before you tidy anything. Take the date field and build the reminder. It proves the model works end to end, and it is the only part of this that produces money rather than order.
Anything that a person would otherwise update by hand should be an action on a workflow instead. A model that depends on human diligence decays at exactly the speed the spreadsheet did, and you will have gained nothing.
The first two rows are the two we lose, and they are the two a buyer checks first. Read them before anything else.
| Capability | Inflowave | HubSpot | GoHighLevel | Salesforce |
|---|---|---|---|---|
| Available without buying the top tier | No | No | Yes | Partly |
| How many object types you can define | Yes | Partly | Partly | Yes |
| Fields per object | Partly | Yes | Partly | Yes |
| Records per object | Yes | Partly | Partly | Yes |
| Relate a record to a contact in the CRM | Yes | Yes | Yes | Yes |
| Named relationships, many-to-many | No | Yes | Yes | Yes |
| Relate a record to a client workspace, not just a contact | Yes | No | Partly | Partly |
| Field-level encryption on sensitive values | Yes | Partly | No | Partly |
| Rejects data that does not match the field you defined | Yes | Partly | Partly | Yes |
| Protects against two people overwriting each other | Yes | Unclear | Unclear | Yes |
| Records trigger and are acted on by automations | Yes | Yes | Yes | Yes |
| A record event reaches the contact it belongs to | Yes | Partly | Partly | Partly |
| A real application platform | No | Partly | No | Yes |
Where the others are stronger. GoHighLevel beats us on the two things a buyer checks first. Their custom objects are on every plan including Starter while ours need MAX, and their relationship model is richer than ours: labelled associations, a pair of labels so a link reads as Buyer and Seller rather than just linked, many-to-many, and association fields you can use as columns, in filters, in smart lists and in exports. HubSpot allows a thousand properties per object against our two hundred, which is five times the room for a large model, although it costs an Enterprise subscription to get any of it. And Salesforce is the real answer if what you actually need is an application platform with code, custom interfaces and a marketplace, because that is what it is and nothing here competes with it.
What is different here is that the object is wired into a working sales system rather than sitting beside one. A record can point at a lead or at a whole client workspace, a field can be marked sensitive and is then encrypted and masked, data that does not match the field you defined is refused instead of quietly stored, and an update that was based on a stale copy is rejected rather than silently winning. Then the useful part: when a record changes, the automation that fires knows which human it concerns, because a record linked to leads fans out one event per linked person. That is the difference between a database that reports and one that can text the customer whose renewal date just moved.
The table is the evidence. This is the verdict, one at a time, with the case for choosing them stated first because on this page it is frequently the right one.
Buy theirs when: Custom objects on every tier including Starter, which is a materially better offer than ours, and a relationship model with more in it: labelled associations so a link reads as Buyer or Seller, many-to-many, up to ten labels between any two objects, and association fields usable as list columns, filters, smart lists and exports. If you are on GoHighLevel already, this is not a reason to move.
Buy ours when: Ten objects per location against twenty-five on MAX and unlimited on Enterprise, and a thousand linked records per association side. Past that it is the data-integrity layer: encrypted sensitive fields, refusal of values that do not match the field type, refusal of fields you never defined, and rejection of an update based on a stale copy. Those matter when the object holds a policy number rather than a nickname.
Buy theirs when: A thousand properties per object against our two hundred, a mature data model, and the whole HubSpot ecosystem around it. For a large company modelling something genuinely complicated, that headroom is real and we do not match it.
Buy ours when: It is Enterprise only, capped at ten custom objects and roughly half a million records across all of them combined, with more sold separately. We give twenty-five objects and a hundred thousand records per object on MAX, and unlimited on Enterprise. The other gap is scope: a HubSpot custom object lives in HubSpot, whereas here the record can relate to a client workspace and its changes can message the person it concerns.
Buy theirs when: Salesforce is the reference implementation and it is not close. Custom objects, code, custom interfaces, a development lifecycle and an app marketplace: if you need an application platform, buy the application platform. Anyone telling you a CRM feature replaces Salesforce is selling something.
Buy ours when: Almost nobody reading this needs an application platform, they need to track the four things their business actually runs on without hiring someone to configure it. This is a smaller idea on purpose: define the object, add the fields, relate it to a customer, and have automations act on it the same afternoon.
Taken from vendor documentation, checked 30 July 2026. Limits in this area change often, so verify any row that decides your choice.
A record type you define yourself. Every CRM ships with contacts and deals because every business has them, but almost no business only has them. An insurance broker has policies, an estate agent has properties, a garage has vehicles, a training company has cohorts and enrolments. A custom object lets you add those as first-class things with their own fields, rather than either cramming them into a note or keeping them in a spreadsheet that nothing else can see.
Custom fields describe the person. Custom objects describe the things the person has, and the difference shows the moment somebody has two of them. A customer with three policies cannot be modelled with policy fields on the contact, because there is one contact and three policies, each with its own renewal date. The test is simple: if you have ever named a field policy 2 start date, you needed an object. Custom fields on a contact.
MAX and Enterprise. On MAX you get twenty-five object types, two hundred fields on each, and a hundred thousand records per object. On Enterprise all three are unlimited. Worth being straight that this is a genuine gap against GoHighLevel, who put custom objects on every plan including their entry tier. Compare the plans.
Yes, and it is the point. A lookup field points at a contact in the CRM, at a whole client workspace, or at another one of your objects. The client option is the one agencies need, because a thing being tracked often belongs to the client rather than to one named person at the client. You also choose what happens when the target is deleted: the record goes too, or the link is simply cleared.
Yes. Created, updated, deleted and linked are all triggers, and a workflow can create, find and update records as actions. The part that makes it useful rather than merely possible is that when a record is linked to people, the trigger fires once per linked person, so an action that sends a message actually has somebody to send it to. A renewal date moving can text the customer whose renewal it is. See workflows.
It is refused rather than stored. A number field will not take text, an email field will not take something that is not an address, a choose-one field will not take an option that is not on the list, and a field you never defined is rejected outright instead of quietly appearing in the data. That last one sounds pedantic and is the reason the object is still usable in two years.
Mark the field sensitive and the value is encrypted where it is stored and shown as dots in the interface. Use it for the fields you would be uncomfortable seeing in a screenshot: policy numbers, licence numbers, reference numbers issued by somebody else. It is not a substitute for deciding who on your team should see a record at all, which is a coarser control here than it is in Salesforce.
An update can carry the version it was based on, and it is refused if the record moved underneath it. So the second person is told the record changed rather than silently overwriting the first. Nobody puts this on a feature list and everybody who has lost twenty minutes of edits cares about it.
You can change the label, whether it is required, its options and its order at any time. What you cannot change is the internal name and the field type, because changing a type is destructive: every value already stored would have to be reinterpreted, and there is no honest way to do that automatically. Add a new field and migrate to it instead. Spend two minutes on the type when you create it.
Yes. Objects, fields and records are all available programmatically, including describing an object so a tool can discover its shape rather than having it hard-coded. That means you can ask an assistant to list, search, read, create and update records in plain language once the object exists. The assistant tool reference.
For the part of your spreadsheet that describes customers, yes, and that is the part worth moving. Airtable is a better general-purpose database with better views, and if what you have is a project tracker it should stay there. The thing that makes moving worthwhile is the link: a row in Airtable does not know who the customer is, so nothing can act on it, and somebody has to notice the renewal date by hand.
No many-to-many or named relationships: a lookup points at one target, so if you need the same two records related in three different ways, GoHighLevel and Salesforce both model that and we do not. No custom interfaces or code. No per-record permission model. And it is MAX and above, which is the honest headline limitation.
Model the thing, link it to the customer, and let the renewal date do the chasing instead of a person in December.
Get Started