Walk along any old harbor and you will find a dark stain on the stone, well above the water: the mark of the highest tide. The water is calm today. The stain does not care. Customer.io bills the way that harbor wall remembers, and once you see the mechanic clearly, several confusing invoices suddenly make sense.
How high-watermark billing works
Customer.io prices by profile count: plans start at $100 a month for the entry tier and step up through volume bands as your list grows (listed pricing as of this writing). The subtlety is which count sets the price. It is not your profile count on the invoice date. It is the highest count reached at any point in the billing period: the high watermark.
Import 80,000 profiles on Tuesday, realize the CSV was wrong, delete them on Wednesday: the watermark says 80,000 over your base, and the tier that goes with it is the tier you are in. The water receded; the stain stays until the next period resets it.
Three ways teams trip it
- The migration import. Moving from another tool, you import everything: bounced addresses, unsubscribes from 2019, that scraped conference list. Every row becomes a billable profile the moment it lands, and the cleanup you planned for next sprint happens after the watermark is set.
- The integration that identifies everyone. A well-meaning engineer wires
identify()into every anonymous page view, and suddenly each visitor is a profile. One decent traffic day sets a watermark your paying-customer count will not reach for a year. - Nobody owns deletion. Lists only grow by default. Users churn, emails go stale, but no process removes them, so the ratchet clicks up a tier every few quarters and each click feels too small to fight.
Keeping the bill honest
To be fair to Customer.io: the mechanic is documented, and it is manageable if someone owns it.
- Clean before you import, not after. Drop hard bounces, old unsubscribes and anything without activity in 18 months while the data is still in a spreadsheet, where rows are free.
- Gate your identify calls. Create profiles on signup or another meaningful action, never on page view.
- Schedule the prune. A quarterly deletion of dead profiles, timed just before the billing period rolls over, is the single highest-leverage habit. A prune the day after rollover pays a full period at the old watermark.
- Test big changes in a sandbox workspace, not production, so an experiment cannot set a production watermark.
The alternative: pricing that doesn't count profiles
You can run the cleanup routine forever, or you can pick a pricing model where a profile is not a billable object. This is the axis we sorted our Customer.io alternatives roundup by, and it is where Messy takes a side: hold a million profiles or a thousand, the price is $20 a month hosted, or zero self-hosted. Storage is cheap; we do not meter it. You pay your email and SMS providers for what you actually send, at their direct rates.
That model has its own honesty requirement: it works because you bring your own provider keys, so delivery cost stays between you and Amazon or Twilio. If you are curious what that setup involves, the BYO SES guide walks through it, DNS records and all. And if you stay on Customer.io, no hard feelings: just put the prune on the calendar.



