Summarize this documentation using AI
Overview
If you’re piping quiz results, back-in-stock requests, warranty registrations, or newsletter popups into Customer.io, the real win isn’t “capturing a lead”—it’s making that data trustworthy enough to drive repeat purchase and recovery flows. If you want a second set of eyes on your data-in setup (especially identity + event mapping), you can book a strategy call and we’ll pressure-test it like an operator would.
In most retention programs, form data is where segmentation quietly goes off the rails: submissions come in anonymous, fields change names over time, and automations stop triggering when you need them most (cart recovery, replenishment, or reactivation).
How It Works
Form data enters Customer.io as either person attributes (state on the profile) and/or events (a timestamped action like “submitted quiz”). The choice matters because it changes how reliably you can trigger campaigns and how clean your segments stay over time.
- Identity resolution is the first gate. A form submission is only useful if it attaches to the right person. Practically, that means sending a stable identifier (usually
email; sometimesid) with the submission so Customer.io can identify the person and merge activity correctly. - Events are your trigger layer. When someone submits a form, track an event like
form_submittedwith properties such asform_name,source,variant, and the answers. Events give you clean “entered at this time” logic for cart recovery, browse follow-ups, and reactivation. - Attributes are your segmentation layer. If the form captures durable preferences (skin type, size, pet type, subscription interest), store them as person attributes like
skin_typeorpreferred_size. Attributes make segments stable and easy to reuse across journeys. - Mapping is where teams usually get burned. If your form tool sends
Skin Typeone week andskin_typethe next, you’ll end up with fragmented data and segments that undercount. Normalize field names before they hit Customer.io. - Anonymous submissions need a plan. If your form can be submitted without email, you’ll either (a) create anonymous profiles that must later merge, or (b) lose the ability to message. For retention, it’s usually worth gating the form’s “results” behind email so identity is deterministic.
D2C scenario: A skincare brand runs a “Find your routine” quiz. If the quiz answers come in as attributes (e.g., skin_type=oily, concern=acne) and the submission also fires an event (quiz_completed), you can trigger a routine email immediately, then segment future replenishment and cross-sell based on those attributes. If identity is missing or fields aren’t normalized, the routine series goes to the wrong profile (or doesn’t send at all), and your “acne concern” segment becomes unreliable.
Step-by-Step Setup
The goal here is simple: every submission should (1) attach to the correct person, (2) fire a consistent event you can trigger from, and (3) update attributes you can segment on later.
- Decide what’s an event vs. an attribute.
- Event:
form_submitted,quiz_completed,back_in_stock_requested. - Attribute:
preferred_size,hair_type,sms_opt_in,interest_category.
- Event:
- Standardize your naming before you ship.
- Pick a single convention (snake_case is easiest) and stick to it.
- Create a short “data contract” doc: event names + property names + attribute names.
- Ensure the submission includes a stable identifier.
- At minimum:
email. - If you have a logged-in experience: also send your internal
customer_idas the primary ID and store email as an attribute.
- At minimum:
- Send the event to Customer.io with useful properties.
- Include:
form_name,form_id,source(popup, footer, post-purchase),url,utm_campaign(if available). - Include answers as properties when they’re needed for branching (e.g.,
concern,budget).
- Include:
- Update person attributes for durable preferences.
- Only write attributes you’ll actually use; don’t dump the whole form schema into the profile.
- If answers change over time (like size), decide whether “latest value wins” is acceptable.
- Validate in Customer.io before building campaigns.
- Check a real profile: confirm the event shows up with expected properties.
- Confirm attributes are populated and spelled correctly.
- Create a test segment to ensure the data is queryable the way you expect.
When Should You Use This Feature
Form data is most valuable when it reduces guesswork in your retention program—either by making triggers more precise or by making segments more predictive of the next purchase.
- Cart recovery with better intent signals. Capture “why didn’t you checkout?” or “which variant were you looking for?” and write it into event properties so your abandonment flow can branch intelligently.
- Repeat purchase and replenishment. Collect usage rate (e.g., “lasts me ~30 days”) and store it as an attribute to time replenishment reminders more accurately.
- Product discovery quizzes. Use quiz outputs as attributes for ongoing cross-sell, not just a one-time results email.
- Back-in-stock and waitlists. Treat each request as an event (timestamp matters), and store the product/variant as properties so you can message the right people when inventory returns.
- Reactivation with preference capture. A “tell us what you want” form is only useful if it attaches to known customers and cleanly updates the attributes you’ll segment on for winback.
Operational Considerations
Most issues aren’t “Customer.io problems”—they’re data consistency problems that show up later as underperforming segments or journeys that stop enrolling people.
- Segmentation drift is real. If your form tool changes field labels, you’ll end up with multiple attributes representing the same thing. Lock naming early and treat changes like a migration.
- Event/property bloat slows operators down. Keep one canonical event (e.g.,
form_submitted) and differentiate withform_name. Otherwise you’ll have 14 near-identical triggers that are hard to audit. - Orchestration across tools needs a single source of truth. If Shopify/Klaviyo/your form tool all write “SMS consent” differently, you’ll eventually message the wrong cohort. Decide which system owns consent and mirror it into Customer.io.
- Anonymous-to-known merging can break attribution. If you allow anonymous quiz completion and later identify via email, make sure you have a consistent merge strategy—otherwise the event that should trigger a follow-up sits on an anonymous profile you never message.
- Trigger reliability depends on identity timing. If the event arrives before the person is identified, your event-triggered campaign may not fire the way you expect. In practice, send/identify the person first, then send the event.
Implementation Checklist
Before you ship forms into production, run this checklist once. It saves you from the classic “why is the segment empty?” fire drill later.
- Event name(s) defined and consistent (ex:
form_submittedwithform_name). - Stable identifier included on every submission (
emailor internalcustomer_id). - Person attributes normalized (snake_case) and documented.
- Event properties include the minimum needed for branching and reporting (
form_name,source,url). - Consent fields mapped intentionally (email/SMS opt-in isn’t guessed).
- Test profile verified in Customer.io: attributes updated + event recorded.
- At least one segment built off the new data and validated against real submissions.
Expert Implementation Tips
These are the small choices that keep your data usable six months from now—when you’re iterating fast and multiple people are touching the stack.
- Prefer “one event, many forms.” Use
form_submitted+form_nameinstead of separate events per form. It keeps triggers and reporting clean. - Store quiz outputs as attributes, not raw answers. Raw answers are often messy. Compute an output like
routine_typeorrecommended_bundleand store that—your segments will actually be usable. - Add a version property. Include
form_versionso when you change questions, you can debug performance and avoid mixing incompatible schemas. - Don’t overwrite high-signal attributes accidentally. If a post-purchase survey asks “what size do you wear?” and someone fat-fingers it, you can degrade segmentation. Consider writing survey answers to event properties and only updating the attribute when confidence is high.
- Send timestamps intentionally. If your integration supports it, ensure the event time reflects submission time (not batch import time). Time-based segments and “within last X days” logic depend on it.
Common Mistakes to Avoid
These are the ones that quietly cost revenue because they make segments smaller than they should be or triggers inconsistent.
- Missing identity on submission. If the email isn’t present (or isn’t the same email you use elsewhere), you’ll create duplicates or orphaned activity.
- Using attributes for everything. Teams store every form submission as attributes and lose the ability to trigger off “just happened” behavior.
- Inconsistent naming across tools.
phoneNumbervsphone_numbervsphonebecomes three segments and a reporting mess. - Triggering campaigns on the wrong event. If you trigger on “person updated” instead of the submission event, you’ll accidentally enroll people when any attribute changes.
- No guardrails for schema changes. A new form field gets added, breaks a branch condition, and suddenly your best-performing recovery message stops sending to half the cohort.
Summary
If form data is going into Customer.io, treat it like production data: normalize it, identify the person deterministically, and separate events (triggers) from attributes (segments). When you get that right, cart recovery and repeat purchase flows become more precise—and far more reliable.
Implement Forms In Campaigns with Propel
If you’re already running retention in Customer.io, forms are one of the fastest ways to sharpen segmentation—assuming the data lands cleanly and consistently. When teams want help tightening identity resolution, mapping a durable schema, or pressure-testing triggers before they go live, it’s usually easiest to book a strategy call and walk through the data flow end-to-end.
The goal isn’t more data. It’s fewer surprises: segments that match reality and journeys that fire every time.