The short answer
- Count the whole audience against each vendor’s definition before comparing prices. Customer.io includes people and objects in profiles.
- Keep subscription state separate from the contact record. Loops excludes unsubscribed contacts from its plan count, but they may still receive transactional email.
- If company relationships drive targeting, start with Userlist: it documents many-to-many relationships. Test your own data mapping before choosing.
- Pause sending during a migration trial and test whether historical users enter onboarding. Resume only after the expected and actual entries match.
Count the audience before comparing prices
Build the estimate from the records you expect to store, including dormant users as well as account records. A smaller sending list can still leave a larger billable population.
We compared documentation for Customer.io, Loops and Userlist. Their counting rules answer different questions, so use your own audience rather than comparing plan labels alone.
| Vendor | Billing unit | Limit or timing | Control that matters |
|---|---|---|---|
| Customer.io | Profiles: people plus objects | Essentials includes 5,000 profiles and 1 million monthly emails | CSV preview and empty-value handling |
| Loops | Plan count excludes unsubscribed contacts | Transactional email can still reach unsubscribed contacts | Subscription property and list preferences |
| Userlist | All stored users | Monthly fee uses prior thirty-day user high-water mark | User and company relationships; import matching |
Source: Customer.io: Customer.io pricing, Loops: Contact properties, Userlist: Userlist pricing, Customer.io: Import people or events via CSV, Userlist: Companies and relationship-level data, Userlist: Importing Data
Customer.io Essentials starts at $100 per month billed monthly with 5,000 profiles. Its allowance also includes two object types. Price overages and channels for your own workload.
Userlist counts all stored users, including inactive ones. It uses the prior thirty-day high-water mark for its monthly fee. Removing inactive users may therefore leave this cycle’s bill unchanged. Userlist Basic includes company accounts.
Customer.io recommends removing unnecessary profiles and objects one to two days before the billing date to avoid inclusion in the next cycle, according to its billing guidance. Preserve any records you need before deleting them.
For example, take a dormant user who belongs to two companies. Count that user in Userlist’s stored audience; for Customer.io, include the person and any stored objects. In Loops, check the contact’s subscription state before forecasting the plan count.
Carry identity and subscription state separately
A successful import should preserve who each person is and which messages they should receive. Export the original state before changing records, then compare it with the destination.
Customer.io lets a CSV import ignore empty values or nullify existing attributes. Its import preview exports mapped data before the irreversible import. Changing an established email, phone or ID requires identifying the person by cio_id.
Userlist matches an imported user by identifier before email, creating a record only if neither matches. Its import guide says imported users are treated as opted in even when double opt-in is enabled. Preserve the original permission records and reconcile preferences before sending.
Loops treats account-wide subscription and mailing-list preferences separately. Its contact properties guide says sending subscribed:true can resubscribe a contact, while omitting that field avoids an unintended change. Deleting and re-adding a contact can lose its previous subscription state.
Loops also says list unsubscribes cannot be reversed through those contact update methods. An ordinary unsubscribe does not block its transactional path. Compare global subscription with list preferences. Inspect delivery suppression separately rather than treating one field as every sending rule.
For company-based targeting, map the relationship as carefully as the person. Userlist supports many-to-many relationships and relationship properties such as a person’s role at a particular company. For complex relationships, its import guide recommends the API or Segment integration.
Keep old users out of new onboarding
Decide which history makes someone eligible before enabling a campaign. An imported record can match a trigger even when the person signed up long ago.
Customer.io says its new attribute and segment triggers can admit matching backfilled users regardless of data age. Its trigger guidance recommends explicit time-based conditions when old users should stay out. Check whether your workspace uses the new or legacy behavior.
Userlist warns that adding marketing leads can change segments built on the assumption that every record is a customer. Its migration guide also calls for reviewing first-seen onboarding triggers. Map the old campaign’s entry conditions to the new system and record the intended outcome for each user.
For a concrete trial, use a synthetic dormant customer and a new signup with the same relevant attributes. The new signup should enter only the intended sequence; the dormant customer should follow the rule you explicitly choose. Inspect workflow entries before enabling live sends.
Email may accompany an in-app guide at the same stage. Use the product onboarding software guide to assess the in-app experience, then test the two paths together so a user’s completed step is reflected in the email decision.
Test each sending path before cutover
A working contact import does not prove that every message has a working route. Inventory the messages your application sends and assign an owner to each path.
Loops uses published transactional templates and dataVariables rather than raw HTML at send time, according to its migration guide. That guide lists dashboard CSV or per-contact upserts for contact import and says there is no public bulk contact import API. Confirm the current endpoint contract before implementation.
One Bubble builder reported that Loops contacts were saving and DNS was verified, while asking how to route password resets and confirmations. Use that account as a prompt to test each message path, rather than as evidence of a general defect.
Superconductor says its own Loops welcome messages distinguish direct signups from invited workspace users in its connector announcement. Try both paths with your own fixtures and inspect the resulting content.
A fallback needs its own owner and a current template. PostHog’s engineering handbook describes Customer.io HTTP delivery alongside SMTP backup templates in its own implementation. That example gives you a question for your team, not a universal cutover design.
Loops’ quickstart covers marketing and transactional email using events and contact properties. Review the actual event names and template variables together so an imported contact and a live application event reach the intended message.
Run a migration worksheet
Run this trial with synthetic records and sending paused. Keep the before and after exports alongside expected and actual workflow entries.
Use the same fixture with each candidate and write down who will repair any mismatch. The software trial guide helps turn those observations into a decision.
Common questions
What is the best lifecycle email tool for B2B SaaS?
If users belong to multiple companies and roles matter, start with Userlist’s documented relationship model. If your audience includes objects, price those Customer.io profiles too. Test the migration with your own data before deciding.
Does deleting inactive users immediately reduce the bill?
Not necessarily. Userlist uses the prior thirty-day high-water mark of stored users for its monthly fee. Customer.io gives different timing guidance for its next billing cycle.
Can an unsubscribed contact still receive transactional email?
Loops says unsubscribed contacts do not count toward the plan and may still receive transactional email. Reconcile the message path and preference state before a migration.
Will importing old users restart onboarding emails?
It can depend on the trigger. Customer.io says its new attribute and segment triggers can admit matching backfilled users regardless of data age. Test historical records with sending paused and use the intended time conditions.
Can I import company relationships with users?
Userlist supports many-to-many user and company relationships. Its import guide recommends the API or Segment for complex relationships. Test the mapping and role properties with a synthetic user in multiple companies.
Sources and scope
We read the linked documentation on October 29, 2026. We have not run these products or tested a migration, delivery or support.
Confirm current plan terms, billing windows, import behavior and sending controls with each vendor for your own workload.
Source references
- Customer.io: Customer.io pricing
Checked 2026-10-29. The billable audience includes objects as well as people, a meaningful distinction for account-based SaaS data models.
- Loops: Contact properties
Checked 2026-10-29. Unsubscribed contacts are free to retain, but update APIs can accidentally restore subscription state.
- Userlist: Companies and relationship-level data
Checked 2026-10-29. The B2B data model distinguishes user, company and relationship properties for targeted lifecycle messages.
- Userlist: Userlist pricing
Checked 2026-10-29. Stored-user billing differs from monthly-active-user pricing.
- Customer.io: Import people or events via CSV
Checked 2026-10-29. Contact import requires identifier mapping and explicit handling of missing values; an export preview supports verification.
- Userlist: Importing Data
Checked 2026-10-29. CSV import covers users and companies, but relational imports and subscription states need special planning.
- Customer.io: Reducing billing overages
Checked 2026-10-29. Profile hygiene and billing timing can affect lifecycle-tool cost.
- Customer.io: Automation triggers, filters and frequencies
Checked 2026-10-29. New trigger semantics can make historical imports start automations that legacy behavior excluded.
- Userlist: How to Migrate Your Marketing Email List
Checked 2026-10-29. Combining marketing leads with existing product users can invalidate customer-only segments and onboarding triggers.
- Loops: Migrate from Mailchimp to Loops
Checked 2026-10-29. Migration includes templates, identity, permission state and duplicate prevention rather than just copying contacts.
- Loops: Sendgrid, Loops email — Bubble migration question
Checked 2026-10-29. An original no-code builder distinguishes successful contact sync and DNS verification from working password-reset and confirmation sends.
- Loops: Superconductor Loops connector launch and internal usage example
Checked 2026-10-29. A connector seller describes its own Loops adoption and the need to align application events with email-template assumptions.
- Customer.io: Developing locally — email implementation
Checked 2026-10-29. Customer's own engineering handbook documents coexistence of Customer.io HTTP delivery and SMTP templates.
- Loops: Loops quickstart
Checked 2026-10-29. The setup sequence joins sending-domain configuration, contact data and event-triggered email.