[deliver]
Deliver article · 2026-07-16 · Charlotte Rodrigues

Customer.io tutorial for SaaS: from events to journeys

Short answer. Start Customer.io with a written identity and event plan. Identify people with a stable ID, model accounts or other entities as objects when their state matters, track meaningful product events, keep durable traits as attributes, and build segments from that governed data. Launch one journey, test every branch, monitor ingestion, and only then scale the lifecycle.

Customer.io is flexible because it can respond to custom product and business data. That flexibility also creates the main implementation risk: an ungoverned event stream with inconsistent names, changing payloads, and no accountable owner.

The platform currently supports several integration paths, including JavaScript and mobile SDKs, server-side APIs, data warehouses, and reverse ETL. Review the official integration overview for current options. This tutorial was reviewed on July 16, 2026.

Decide what Customer.io will own

Write the target scope:

Assign one system owner to each message. Password reset, invoice, product alert, lifecycle education, sales outreach, and support notification can originate from different systems. Customer.io should not duplicate them.

Define environments. Production, staging, and development data should not mix. Use non-real recipients and safe destinations during testing, and prevent staging events from triggering production journeys.

Model identity before events

A person needs a stable identifier that survives email changes. Email can be an attribute and channel address, but it is often a poor primary key for SaaS because users change addresses, have aliases, or belong to multiple workspaces.

Document:

Test anonymous-to-known transitions if the product tracks pre-signup behavior. Decide which history should join the known profile and how consent changes after identification.

Do not send secrets, authentication tokens, passwords, or unnecessary sensitive data into the messaging platform. Use secure, short-lived destination links created by the appropriate application service.

Use people, objects, attributes, and events correctly

Customer.io supports people and relationship-based objects in current product packaging. Objects can represent non-person entities such as accounts, workspaces, devices, courses, or subscriptions. Official object documentation should be checked for current plan and object-type limits.

Use this rule:

Data type Use it for Example
Person attribute Current durable fact about one person role, locale, plan preference
Object Entity with its own state and relationships workspace, subscription, project
Event Something that happened at a point in time report_generated, teammate_invited
Event property Context of that occurrence report_type, project_id, source
Relationship How a person relates to an object owner, admin, member

Avoid turning every event into a profile attribute. last_report_generated_at can help a current-state segment, but it does not replace the complete report_generated event history.

For account-based SaaS, an object prevents copying the same plan, renewal date, and account status onto every member. It also supports journeys where an administrator and an end user need different messages about the same workspace.

Create an event tracking plan

Track events that can trigger a decision or measure customer progress. A good name is stable, specific, and understandable outside the engineering team.

Example plan:

Event Trigger moment Required properties Lifecycle use
account_created Signup succeeds source, plan, role Start onboarding
integration_connected Connection is verified integration, workspace_id Advance setup
project_published First live project project_id, template Activation
teammate_invited Invitation created role, workspace_id Collaboration
subscription_started Billing confirms start plan, amount, currency Customer onboarding
subscription_canceled Cancellation recorded reason, effective_at Save or exit logic

For every event, record:

Use snake_case or another consistent convention. Do not create Project Created, project_created, and createdProject for the same action.

Version material schema changes. Adding an optional property is different from changing a number into a string or redefining what the event means.

Choose the integration path

Browser or mobile SDK

Useful for client-side behavior and in-app experiences. Treat client events as observable behavior, not trusted billing or entitlement records. Network blocking, offline use, and tampering can affect delivery.

Server-side API

Use for authoritative product, account, subscription, and operational events. Build retries, idempotency, logs, rate handling, and monitoring.

Warehouse or reverse ETL

Useful when the warehouse is the governed customer source or when modeled traits are calculated centrally. Understand sync interval, identity rules, deletions, and whether a late update can incorrectly trigger a journey.

Native integration

Faster when the exact source and fields are supported. Inspect payloads and timing. "Connected" does not prove that the journey has every field it needs.

Many teams combine paths. For example, the browser records product interaction, the backend sends billing events, and the warehouse supplies account health. Establish which source wins when values conflict.

Set attributes and subscription preferences

Attributes should have controlled names and types. Examples:

Do not store true, True, yes, 1, and Y for the same boolean. Normalize before ingestion.

Model channel eligibility and preferences separately from business attributes. A paid customer is not automatically subscribed to promotional email. Email, SMS, push, and other channels need their own state and evidence. Transactional communication should have a defined purpose and platform configuration.

Define how unsubscribe, suppression, deletion, and resubscription propagate to other systems. Run these paths as integration tests.

Build useful segments

Start with segments that change the journey:

Write a definition, business use, owner, and expected population for each segment. Check counts and sample people before attaching a campaign.

Be careful with negative conditions. "Has not completed event" often needs a time boundary and proof that the person was eligible to complete it. A new user should not enter a 30-day inactivity segment.

Build the first journey

Choose one journey with a reliable trigger and measurable outcome, such as onboarding to activation.

Specify:

  1. trigger event or segment entry;
  2. eligibility and channel consent;
  3. delays and time-zone behavior;
  4. branches based on person and object state;
  5. messages and destination actions;
  6. exit when activation, conversion, cancellation, or suppression occurs;
  7. success metric and guardrails;
  8. re-entry behavior.

Use event properties for message-specific context and current attributes or objects for present state. Decide what should happen if a value changes during a delay.

Keep the first version small. One reliable journey with transparent logic creates more value than ten cloned campaigns that nobody can debug.

Personalize safely

Use fallback values for names, roles, workspace names, and dynamic links. Preview with profiles representing:

Do not expose internal IDs or raw code values. Map controlled values to human-readable language. Escape or sanitize user-provided content according to the rendering context.

Test before enabling delivery

Create a QA matrix:

Test Expected result
New eligible person Enters once and receives the correct branch
Existing activated person Does not receive setup reminders
Account owner vs member Receives role-appropriate action
Missing attribute Sees fallback content
Unsubscribed person Does not receive promotional message
Conversion during delay Exits or branches before next message
Duplicate event Does not create harmful duplicate journey
Late event Uses the intended timestamp behavior

Test links, mobile layouts, replies, tracking, localization, time zones, and quiet hours. Confirm webhook or downstream actions in the target system.

Use a small controlled production cohort before full launch. Monitor entry counts, message delivery, errors, exits, and customer feedback.

Monitor the data pipeline

Create alerts for:

Keep a schema changelog. Engineering should review changes with lifecycle owners before deployment when a field affects segmentation, branching, or personalization.

Measure the customer outcome

For onboarding, report signup-to-activation rate, median time to activation, trial conversion, retention, and customer support alongside delivery and click behavior. For retention, use an outcome aligned to the product's normal usage cycle.

Use holdouts or staggered rollout for material journeys when traffic allows. Customer.io attribution can help operate the program, but causal lift requires a credible comparison.

Document the audience, window, eligibility, primary metric, guardrails, and decision. Do not optimize a click if downstream activation or retention worsens.

Customer.io or Klaviyo?

Customer.io is often a strong shortlist when custom product events, accounts or objects, mobile or in-app journeys, and engineering-owned data are central. Klaviyo is often a faster shortlist for ecommerce teams using native store, order, catalog, and customer value data.

Both can support event-driven messaging. Compare the source of truth, integration effort, operator, channels, reporting, and total cost. Read the Klaviyo vs Customer.io comparison for a deeper evaluation.

FAQ

Do I need a developer to implement Customer.io?

Many SaaS use cases benefit from engineering involvement because identity, events, accounts, and product state come from the application. Warehouse and native integrations can reduce custom work but still need data ownership and QA.

Should accounts be profile attributes or objects?

Use objects when the account has its own state, multiple related people, or relationship roles. A simple one-person product may need only person attributes. Validate current plan support.

What should the first event be?

Start with reliable signup and the event that represents first product value. Add the setup events needed to diagnose why users do not reach activation.

Can Customer.io send transactional email?

It can support transactional use cases, but define message purpose, reliability, ownership, consent treatment, and failure monitoring. Do not mix operational and promotional logic casually.

How do I prevent duplicate journey entries?

Use stable identities, source idempotency, clear re-entry settings, and event monitoring. Test retries and duplicate events before launch.

Turn product data into a governed lifecycle

Deliver helps SaaS teams define identity, event schemas, objects, journeys, QA, and measurement before the platform becomes difficult to operate. Request a Customer.io lifecycle implementation diagnostic.

CR
Charlotte Rodrigues · CRM Lead at Deliver. Questions about this article? charlotte@agence-deliver.com

Want to apply this to your stack?

Spend 30 minutes with Charlotte to review your CRM setup, size the opportunity and leave with a practical action plan.

Book a 30-minute call →