Customer 360
Why this matters for your business
Most stores know their customers in pieces. Shopify knows the orders. Klaviyo knows the email opens. WhatsApp knows the chat history. The pixel knows the browsing. None of them know the whole person — and so every campaign you run is built on half a picture.
Customer 360 is the answer to that. It's a single, continuously- updated profile per customer that combines every signal we ever see — Shopify orders, storefront visits, email + WhatsApp + SMS opens and replies, marketplace activity (Amazon, eBay, etc.), in-store POS visits, opt-in records, support touches, and the predictions our ML adds on top.
Because every other feature on the platform — segments, journeys, campaigns, attribution, win-back, loyalty, ads — reads from the same profile, you stop choosing between "do the right thing for this customer" and "ship a campaign this week". They become the same action.
What this typically unlocks
The numbers below are merchant-reported medians from our first twelve months of Customer 360 deployments. Yours will vary; the shape is what's worth paying attention to.
| Outcome | Typical lift |
|---|---|
| Repeat-purchase rate (90d) | +18% — better timing, better channel, better message |
| Email/SMS opt-out rate | −40% — fatigue cap stops the over-sending that drives unsubs |
| Win-back conversion | 3.2× vs blanket re-engagement blasts — only at-risk customers get the offer |
| Hours per week on segmentation | ~6h saved — segments rebuild themselves as the profile changes |
| ROAS on retargeting | +22% — high-LTV customers get higher bid caps |
If those numbers look ambitious, the explanation is mostly that each one compounds against the others. Better timing → less fatigue → less unsub → more deliverable list → more revenue. That's the whole bet.
What you actually get
For every shopper who ever interacts with your store — whether they bought once five years ago, opted into your WhatsApp last week, or just landed on your homepage this morning — Customer 360 maintains a profile that includes:
- Who they are — name, email(s), phone(s), Shopify account, every web session they've ever had, every marketplace identity (Amazon buyer ID, eBay handle, etc.). Multiple identifiers per person are normal and expected.
- What they've bought — order count, lifetime spend, average order value, first order, last order, predicted next order, acquisition channel.
- Where they shop — online vs in-store (POS) vs marketplace, preferred location for pickup, regional currency.
- How they engage — every email open, every WhatsApp reply, every SMS click, every push notification dismiss. Aggregated into one engagement score.
- What stage they're in — new, engaged, converted, loyal, at-risk, or churned. Computed automatically from their behaviour; see Lifecycle stages below.
- What we predict — churn risk, next-best-action, predicted 30-day LTV, products they're likely due to re-order.
- What they've consented to — opt-in status per channel, the exact consent text they saw, when and where they opted in.
- What they've heard from you — every message ever sent, current daily/weekly count, fatigue score, last-contact timestamp per channel.
You read this in the merchant UI under Customers → [name]. You also use it without realising it, every time you launch a campaign or build a segment.
How it powers every part of your store
| Feature | What Customer 360 makes possible |
|---|---|
| Segments | "Customers who bought twice in the last 90 days, opted into WhatsApp, AOV > $80" — built and refreshed automatically. |
| Campaigns | Audiences include only people who're allowed to receive a message right now on the chosen channel — no manual filter for opt-out, fatigue, or quiet hours. |
| Journeys | Trigger on any change to the profile: lifecycle stage, churn-risk crossing 0.7, predicted-replenishment date approaching. |
| Attribution | Every order is linked back to the messages and ads the customer interacted with, because identity is resolved end-to-end. |
| Predictive LTV (Pro+) | Bid more on retargeting for the top 20% LTV cohort; less on the rest. Same ad spend, more revenue. |
| Anomaly detection | "Why did sales drop?" gets a real answer because we know which cohort changed behaviour. |
| Loyalty | Tier eligibility is based on real activity, not just orders — a customer who replies to every WhatsApp is more loyal than one who just buys once a year. |
| Ad audiences | Lookalikes built on your actual best customers (high LTV + low churn risk), not just "people who bought once". |
| Compliance | One unsubscribe click flips every channel off, everywhere. No more "I unsubscribed but still got an SMS". |
How it works (without the technical bits)
The diagram below is the whole system in 30 seconds. Every box is either an input we listen to, or a feature we deliver.
Building the picture
Every input above flows into a single profile per shopper. Some arrive instantly (a website visit shows up within seconds), some on a delay (Shopify order webhooks usually within a few seconds, marketplace orders on a 5-minute polling cycle).
You don't have to do anything to start collecting — the moment the storefront pixel is installed and the Shopify webhooks are connected, profiles begin building. Existing customers are back-filled from your Shopify history during onboarding.
Identity resolution — the "Sarah uses two emails" problem
Real customers don't behave tidily. The same person might:
- Browse your store on a phone (cookie A)
- Submit their work email through an exit-intent popup (cookie A → email A)
- Browse later on a laptop (cookie B — looks like a new visitor)
- Buy with their personal email at checkout (cookie B → email B)
- Reply to a WhatsApp from their phone number
Without resolution: five separate "customers". With Customer 360: one Sarah, with two emails, one phone, two web sessions, and a complete order history.
The resolution rules in plain English:
- Anything we see together becomes linked. A web session that submits an email gets linked to that email. A checkout that uses an email gets linked to the Shopify customer ID.
- Identifiers we trust most win. A Shopify customer ID is stronger than an email; an email is stronger than a phone (typos); a phone is stronger than an anonymous web cookie.
- Conflicts surface as merge candidates. If we see two profiles that share an identifier but we can't auto-merge confidently, they show up in the Customers → Duplicates tab for one-click resolution.
- Merges are reversible for 7 days. Wrong merge? Undo it; both profiles come back exactly as they were.
What this means for you: stop manually de-duplicating customers. The system does it; you just review the small number it can't decide.
Lifecycle stages — the journey we track
The whole customer relationship reduces to six stages. Every profile is in exactly one. The stage is computed from behaviour, not set by you, so it's always current:
| Stage | What it means for the business | What we do automatically |
|---|---|---|
| New | Just discovered you. Highest cost-of-acquisition, lowest revenue (yet). | Welcome flow, gentle nurture, no hard sells. |
| Engaged | Browsing repeatedly, hasn't bought yet. The window where good content converts. | Educational content, social proof, exit-intent offers. |
| Converted | Just made their first purchase. Most likely to buy again in the next 30 days — if the experience was good. | Thank-you flow, post-purchase upsell, review request, replenishment reminder. |
| Loyal | Repeat buyer. Cheapest revenue you'll ever earn. | Loyalty tier benefits, early access, referral asks. |
| At-risk | Was active, has gone quiet for 30+ days. Win-back window. | Discount, "we miss you" message, channel switch. |
| Churned | Silent for 90+ days. Reactivation is expensive but possible. | Quarterly reactivation campaign, then exclusion from regular sends to protect deliverability. |
The configurability matters: a fashion brand's "at-risk" might be 14 days; a furniture brand's might be 6 months. You set the windows once per shop, the system handles the rest.
Enrichment — the deeper insights, in plain English
Once a day we re-compute four enriched signals per customer. You don't need to know how — you need to know what each one means and what to do with it.
LTV (Lifetime Value)
The total a customer has spent with you, plus our prediction of what they'll spend in the next 90 days. Not just historical revenue — that's a vanity metric. Predictive LTV (Pro+) is what your ad-spend caps and loyalty-tier thresholds should be based on.
Use it for: raising bid caps for top-20% LTV customers, sizing loyalty rewards, identifying VIPs for hand-curated outreach.
RFM (Recency / Frequency / Monetary)
Three numbers from 1 to 5, like 5-4-3:
- R = Recency. Did they buy recently?
5= last 30 days. - F = Frequency. How often do they buy?
5= top 20% of your customers. - M = Monetary. How much do they spend per order?
5= top 20% of your customers.
A 5-5-5 is your champion. A 1-1-1 has all but left. The
combinations in between describe the texture of your base —
how many one-time bargain hunters? how many lapsed VIPs?
Use it for: segment rules ("send win-back to anyone with R≤2 but F≥3 — they used to buy a lot, now they don't"), loyalty tier mapping, audience exports to Meta/Google.
Churn risk (0.0 – 1.0)
Probability the customer will stop buying entirely. Three ingredients: how recently they engaged (60% of the score), how often they've bought (25%), how much they've spent (15%).
| Score | Meaning | Action |
|---|---|---|
| 0.0 – 0.3 | Healthy. | No action needed. |
| 0.3 – 0.5 | Drifting. | Light touch — newsletter, soft offer. |
| 0.5 – 0.7 | At-risk. | Win-back journey, named offer. |
| 0.7 – 1.0 | Likely lost. | One last attempt, then exclude from regular sends. |
Use it for: automatic win-back enrolment, ad-spend exclusion (don't pay to retarget someone who's gone), sales-team alerts on high-LTV customers crossing 0.7.
Predicted next order
For customers with at least two prior orders, we estimate the average gap between orders and project forward. If Sarah orders every 28 days, we know to expect order #4 around day 84.
Use it for: replenishment reminders ("3 weeks ago you bought X — running low?"), inventory planning for reorder-heavy SKUs, journey timing.
How we protect your customers (and you)
Every message — campaign, journey, automated, manual — passes through a four-step gate before it leaves the platform. The order matters: cheaper checks first, and the first failure short-circuits.
In plain English:
"Did they say yes to this channel?"
Email, SMS, WhatsApp, and Push opt-ins are tracked separately and require explicit consent (with the exact consent text recorded — both for GDPR audit and for "what did they actually agree to" if a customer disputes).
If anyone unsubscribes globally, every channel turns off at once. There's no path to "I unsubscribed but still got an SMS".
"Have they heard from you too much today?"
Two limits run together:
- Global daily cap (default 3 messages per day across all channels). Stops a journey + a campaign + a flash sale all hitting the same customer in one afternoon.
- Per-channel cap (you set this — typical: email 5/day, SMS 1/day, WhatsApp 2/day). A customer hammered on WhatsApp can still receive a planned email — but not vice versa.
If either cap is hit, the send is blocked.
"Are they over the fatigue threshold?"
Fatigue is the rolling 7-day count across every channel, scaled to 0–1. A customer who's received 7 messages in 7 days is at 0.7 — our default threshold. Above that, all sends pause until they fall back below.
This is the silent killer of unsub rates: most stores never realise how often a customer hears from them across channels. Customer 360 does, and slows you down before the customer slows themselves down by clicking unsubscribe.
"Is it quiet hours where they live?"
We respect your quiet-hours window (default 9 PM – 9 AM, configurable). For SMS, WhatsApp, and Push, we wait. Email is exempt — inboxes are async, so a 2 AM email doesn't wake anyone up.
The window can be customer-local instead of UTC if you set the customer's time zone — meaningful for international brands where 9 AM in London is 3 AM in Sydney.
What happens when a send is blocked
It's not lost — depending on the source:
- Campaign-driven: the customer is dropped from this send, but stays in the audience. They'll be eligible for the next one when their state allows.
- Journey-driven: the journey waits at the current step. The next attempt happens when fatigue clears or quiet hours end.
- Time-sensitive (e.g. cart recovery): if every send window is blocked, the journey records the missed touch and exits — surfacing in your analytics so you can investigate.
Every blocked send writes the reason (fatigue, quiet_hours,
channel_cap_reached:whatsapp:2/2) to the message log so you
can audit why a customer didn't hear from you.
Privacy & GDPR — built in, not bolted on
Customer 360 is the most sensitive data your store has. The defaults reflect that.
What we collect, what we don't
| We collect | We do not |
|---|---|
| Order history from your Shopify | Payment details (those stay with Shopify / your processor) |
| Storefront visits via your pixel | Browsing on other sites |
| Engagement with messages you sent | Engagement with messages from other brands |
| Opt-in records with the consent text | Anything before opt-in |
| What customers tell you in support | Conversations not connected to your store |
When a customer asks to be deleted
Two paths handle this:
- Shopify-mediated. When a customer requests deletion via
Shopify, the
customers/redactwebhook fires and we run the redaction pipeline immediately. - Direct-to-merchant. When a customer emails you directly, you can run the same pipeline from the GDPR tab in the admin — single click, full audit trail.
Either way, what happens:
- Email, phone, name, address, and every other identifying field in the profile is permanently nulled.
- All identity links (web sessions, marketplace IDs) are deleted.
- Active journey enrolments are exited with reason
gdpr_erasure. - Opt-in records, segment memberships, and experiment assignments are deleted.
- Anonymous totals (revenue contribution, lifecycle distribution) stay — your dashboards don't suddenly lose history.
The whole pipeline is wrapped in a single database transaction — either everything is scrubbed or nothing is. Partial states are impossible.
What customers can ask for, beyond deletion
The same GDPR tab supports:
- Data export — every event, message, opt-in, attribution, and
segment membership for that customer, as JSON. Mirrors the
Shopify
customers/data_requestwebhook output exactly so you can use either source. - Preview erasure — counts every row about to be touched before you click erase, so you see scope.
- Data inventory — shop-wide summary: how many customers with email/phone, oldest record, retention posture. Drives the "Data minimisation" card on the GDPR tab.
For the regulated reader: see GDPR & consent for the full consent record schema, regional opt-in matrix, and the < 10-second unsubscribe propagation guarantee.
Real merchant scenarios
Scenario A — Founder-led brand, ~500 customers
Before Customer 360. Sends a Mailchimp newsletter twice a month. Has no idea who's buying twice vs once, no idea who's about to churn, can't afford to manually segment.
Setup. Pixel installed, Shopify connected, exit-intent widget enabled. Total time: ~30 minutes. Backfill of historical orders happens automatically overnight.
90 days later.
| Metric | Before | After |
|---|---|---|
| Profiles with full picture | 0 | 487 (97%) |
| Repeat purchase rate | 14% | 21% |
| Unsub rate per send | 1.8% | 0.7% |
| Hours per week on segmentation | 4 | 0 |
| Active journeys | 0 | 3 (welcome, post-purchase, win-back) |
The win-back journey alone covered the cost of the platform.
Scenario B — Mid-market DTC brand, 50K customers
Before Customer 360. Has Klaviyo for email, separate WhatsApp provider, custom segments rebuilt monthly by a paid consultant. Different unsubscribe lists per tool — the dreaded "unsubscribed-but-still-got-it" tickets are weekly.
Setup. Replaces three tools' segmentation logic with the shared Customer 360. Imports ~50K Klaviyo profiles via CSV; we match against Shopify orders and build profiles overnight.
90 days later.
| Metric | Before | After |
|---|---|---|
| Cross-channel unsub leakage | 4–6 tickets/week | 0 |
| Avg messages/customer/week | 3.4 | 2.1 (fatigue cap working) |
| Email open rate | 18% | 26% |
| ROAS (Meta retargeting) | 2.4× | 3.1× (LTV-aware bid caps) |
| Revenue per recipient (Q over Q) | — | +14% |
The fatigue cap forced fewer sends — and the engagement metrics went up. That's the counterintuitive lesson most stores don't discover until they have the data to see it.
Scenario C — Multi-store agency client
Setup. Agency manages 12 brands, all on the platform. Each shop has its own Customer 360 (shop-scoped — no cross-shop data mixing). The agency tier surfaces a roll-up dashboard showing profile coverage, lifecycle distribution, and fatigue posture across the portfolio.
Why it matters. When the agency's strategist asks "which clients are over-sending?" — the answer is one click, not a spreadsheet. Clients with > 60% of customers in fatigue get flagged for a sending-cadence review.
Best practices
These are the patterns we see consistently work — and the ones that consistently don't.
✅ Trust the lifecycle stages. Don't build manual WHERE last_order > X segments — use lifecycleStage = 'at_risk'. It
adapts when you change the threshold; manual SQL doesn't.
✅ Watch fatigue posture, not send volume. "We sent 4 emails last week" is meaningless. "30% of our list is at fatigue ≥ 0.7" is a problem.
✅ Set quiet hours per region if you have international customers. The single biggest deliverability win for global brands.
✅ Backfill before launching. Run enrichment for the full customer base before turning on automated journeys — otherwise the first wave of campaigns goes out with stale lifecycle data.
❌ Don't disable fatigue caps "just for this campaign". The cap is what protects your sender reputation. Override it once and you'll override it every time; the unsub rate creeps up over months and you can't trace it back.
❌ Don't manually merge profiles you're not sure about. The duplicates tab surfaces candidates; review before merging. Wrong merges are reversible for 7 days, but it's still cleanup.
❌ Don't treat churn-risk 0.7 as "almost lost". It's "win back now". 0.9 is "almost lost". The difference is months of revenue.
Plan tiers
| Capability | Free | Starter | Pro | Agency | Enterprise |
|---|---|---|---|---|---|
| Profile per customer (full picture) | ✓ | ✓ | ✓ | ✓ | ✓ |
| Lifecycle stages, RFM, churn risk | ✓ | ✓ | ✓ | ✓ | ✓ |
| Identity merge across channels | ✓ | ✓ | ✓ | ✓ | ✓ |
| Send-time gate (compliance + fatigue) | ✓ | ✓ | ✓ | ✓ | ✓ |
| Predictive LTV (90-day) | — | — | ✓ | ✓ | ✓ |
| Predicted next order + replenishment | — | — | ✓ | ✓ | ✓ |
| Per-region quiet hours | — | ✓ | ✓ | ✓ | ✓ |
| Custom lifecycle thresholds | — | — | ✓ | ✓ | ✓ |
| Multi-store roll-up dashboard | — | — | — | ✓ | ✓ |
| Reverse-merge window | 24h | 7d | 7d | 30d | 90d |
Frequently asked
Why do I see two profiles for the same person? Because we haven't seen anything that links them yet. The duplicates tab will catch most of these once they share any identifier — a shared phone, email, or even a cookie. Until then, each profile acts independently.
How fast does new data show up? Most signals: seconds to a minute. Web pixel and Shopify webhooks are real-time. Marketplace orders are 5-minute polling. Daily enrichment (LTV, RFM, churn risk) runs overnight, with on-demand recompute available.
What if Shopify webhooks fail? We retry. If retries are exhausted, the failed event lands in a dead-letter queue and re-runs once recovered. You'll never have permanently lost customer data because of a webhook hiccup.
Can I export the whole Customer 360 dataset? Yes. Pro+ plans include CSV export of the full profile set (scoped by segment if you want). Enterprise plans add a real-time API (v1 admin API).
What happens to my Customer 360 data if I uninstall? We retain it for 30 days in case you reinstall. After that, it's permanently deleted. You can also trigger immediate deletion from the GDPR tab before uninstalling.
Does this work for in-store / POS customers too?
Yes — Shopify POS orders flow through the same orders/create
webhook with source = pos. The profile gets POS columns
(last visit, location, lifetime POS spend) and segments can target
online-only vs in-store-only vs omnichannel shoppers.
Will the AI / predictions be wrong sometimes? Yes — predictions are probabilistic. Churn risk is calibrated, so on average the customers we score 0.7 will churn 70% of the time. Individual cases will be wrong. The upside is that you can act on the cohort, even when you can't predict the individual.
See also
- Segments & cohorts — how to use the profile to build audiences
- Journeys & automations — how profile changes trigger journeys
- Campaigns — how the send-time gate keeps campaigns clean
- Attribution & revenue — how identity resolution makes revenue numbers correct
- Predictive LTV — Pro+ feature that amplifies what Customer 360 already does
- GDPR & consent — full PII matrix and the consent record schema
- Sales engine overview