Case study · Fashion & retail
How a fashion brand found the 16.5% of customers who bring 67% of its revenue
An apparel and accessories brand with an online store and its own shops started with a simple hypothesis: 57% of customers had bought only once, so growth had to come from second purchases. After the rollout, the merged online and offline history told a sharper story, and the brand rebuilt its analytics around it. Here is the whole path, step by step.
Prepared by the oneCDP implementation team · Published
The platform is live and the analytics model has been rebuilt on real data. Four scenarios run against 15% control groups; we will publish the measured effect after the quarter.

- Industry
- Apparel & accessories
- Channels
- Online store + own shops
- Existing stack
- CRM, website builder, loyalty platform with Wallet cards, email, SMS
- Customer model
- 6 RFM segments, thresholds validated on a holdout
- Scenarios
- 12 lifecycle triggers + 4 segment scenarios with control groups
- Rollout
- 4 months, then analytics rebuilt on real data
Starting point
Where we started: three years of CRM history
Before designing a single scenario, we analysed three years of orders from the brand's CRM. The shape of the base told us where to start.
Customers by number of purchases
Share of the customer base in the initial CRM export
Welcome and reactivation journeys
Retention, higher purchase frequency
Grow into loyal customers
Pre-VIP programme
VIP segment, personal service
- Repeat sales relied on manual mailings and a loyalty programme.
- Customers rarely read email, so a single-channel trigger would underperform.
- Wallet loyalty cards were installed by about 20% of customers.
- Store receipts already flowed into the CRM alongside online orders.
- Returns were modest: 3.4% of sales.
The first hypothesis was obvious: 57% of customers had bought only once, so the growth reserve looked like the second purchase. It shaped the first triggers. After launch, the full merged history showed where the money actually is.
Revenue by category
Seasonality is predictable, so scenarios switch content and recommendations with the season.
What the full history showed
One in six customers brings two thirds of revenue
After launch we merged online and in-store purchases over four and a half years and re-fitted the model on real data. Every threshold was validated on a holdout: customers as they were a year earlier, checked against what they actually bought over the next 12 months.
of revenue comes from the core, just 16.5% of customers
of revenue comes from the top 1% of profiles
of the core would drop out of a 12-month window
of in-store purchases had no phone or email
The one-time buyers were still there, but most of them had bought long ago and rarely come back. The money sat in a small core of regulars at different stages of cooling off. So the model was rebuilt around protecting and winning back that core, while mass mechanics serve the rest of the base.
Goals
What the brand wanted from a CDP
More revenue from repeat purchases
Move customers towards regular buying and keep the most valuable ones from drifting away.
One customer profile
Online and offline activity stitched into a single customer card.
Lifecycle automation
Replace manual mailings with triggered, cascading scenarios.
Personal bonuses
Tie incentives to segment and lifecycle stage instead of one-off promotions.
Transparent analytics
See how much revenue each channel and scenario brings, and prove it against a control group.
Architecture
Six sources, one customer
The platform sits on top of the tools the brand already used. Nothing was replaced; everything was connected.
CRM
Customers, online and in-store orders, items, amounts, returns, order source. Two-way, near real time.
Website
Product and category views, cart, checkout, UTM tags, sessions, device. Tracking script on every page.
Loyalty platform
Bonus balance, accruals and redemptions, Wallet card status, tier. Two-way API, including triggering bonuses.
Email provider
Opens, clicks, unsubscribes, bounces and complaints via webhooks.
SMS gateway
Delivery statuses and replies via webhooks.
Stores
Receipts, items, staff member and store, synced through the CRM within a day.
Identity resolution
Records are stitched by phone number, then email, then CRM contact ID: a match on any one merges them. Profiles created from website visits merge with purchase-history profiles at the customer's first identified visit.
What each customer profile holds
- Identifiers and consents per channel
- Profile stage, scores and current segment
- One timeline of online and in-store orders
- Viewed products and abandoned carts
- Bonus balance and loyalty tier
- Every message sent, opened and clicked
- Average order, average gap between purchases, omnichannel flag
Data rules agreed before modelling
- Profile stages: anonymous → contact → buyer. Only buyers get scores, a segment and tags.
- A purchase is an order that is shipped or paid with an amount above zero; a return is a separate negative event.
- De-duplication by the order ID in its source: re-exports and status changes update a purchase, never double it.
- The channel is defined by how the purchase happened, not by who entered it. A paid purchase in both channels makes a customer omnichannel.
- Large orders stay in: the top 1% of profiles brings 16.8% of revenue, and they are real customers.
Segmentation
Three scores, six segments
Every buyer gets three independent scores from 1 to 3. The segment is set by recency and frequency; the average-order score doesn't change the segment but sets the level of the offer inside it. The generic built-in segmentation was switched off: these six segments are the only ones in use.
RFM is a customer scoring method that rates each buyer on three signals: how recently they bought (recency), how often (frequency) and how much they spend (monetary value). The scores group customers into segments you can act on.
Recency
Days since the last purchase: 3 = up to 150 · 2 = 151–540 · 1 = over 540
150 days sits between the in-store buying cycle (120 days) and the online one (180). The median gap between purchases is 56 days in store and 75 online.
Chance of buying in the next 12 months: 42.7% · 15.2% · 5.0%
Frequency
Purchases over the whole history: 3 = four or more · 2 = two or three · 1 = one
Clothing at this price level is a considered purchase: gaps are measured in months and relationships in years, so there is no 12-month window.
Return within 12 months: 50.2% · 16.8% · 6.5%
Average order
Three average-order bands fitted to the brand's base
Total revenue repeated what frequency already said (correlation 0.88). Average order is nearly independent of it (0.19).
Sets the offer level inside a segment, not the segment itself.
Why the whole history, not 12 months
With a 12-month window, 41% of the core would have dropped out, and customers with a purchase in the last year bring only 62.9% of revenue. The other 37.1% would belong to profiles the model simply wouldn't see. Recency already separates active customers from cooling ones; limiting frequency too would punish the same customer twice.
1.Core
Rule (R·F): R3·F3Active regulars: four or more purchases, the last within 150 days. About two thirds of them buy both online and in the store.
2.Cooling core
Rule (R·F): R2·F3Proven buyers past their usual cycle. Their chance of returning drops from 42.7% to 15.2%. The first target for reactivation: the most money per unit of effort.
3.Sleeping core
Rule (R·F): R1·F3Former regulars, last purchase over 540 days ago. Their history and average order still justify a win-back.
4.Growing
Rule (R·F): R3·F2, R3·F1Active customers early in their lifecycle. The job: bring them to the fourth purchase and into the core.
5.Fading
Rule (R·F): R2·F2, R2·F1, R1·F2No stable buying habit and outside the active window. The largest working segment: mass mechanics, low return per customer, volume makes up for it.
6.Lost
Rule (R·F): R1·F1One purchase long ago, return chance below 5%. Excluded from regular communication; used in rare broad campaigns and as a control group.
The first three segments are one core at different stages of cooling off: 16.5% of customers and 66.9% of revenue. Moves between them are the main signal for the CRM.
From segments to action
Tags in the CRM, tasks for managers
Segmentation only pays through communication. The platform turns the model into signals that marketing automation and managers can act on without opening the analytics.
Personal purchase cadence
For customers with three or more purchases, the platform calculates their own average gap between purchases; that covers 23% of the base, the rest use the channel median: 56 days in store, 75 online. When the time since the last purchase goes past it, the customer gets a “time to buy” tag, at most once every 30 days.
Priority score
A 0–100 score (recency 40%, frequency 40%, average order 20%) only sorts lists for managers, showing who to call first. It creates no tags and no scenarios. The top 10% of the base by score brings 53.9% of revenue.
Tags in the CRM card
The segment and modifiers are written to the contact card, so mailing scenarios are built on tags. Tags are set only automatically; managers use a separate namespace for manual labels.
RFM_CORERFM_CORE_COOLINGRFM_CORE_SLEEPINGRFM_GROWINGRFM_FADINGRFM_LOSTRFM_OMNIPurchases in both channelsRFM_HIGH_ORDERTop average-order bandRFM_TIME_TO_BUYPast the personal purchase cadenceRFM_DOWNGRADESegment got worse since the last calculation
Tasks for managers
The CDP writes tags; the CRM's own automation turns them into tasks. People step in only where there is a lot of money and few customers: the core and the cooling core, which make up 12% of customers and 57% of revenue.
| Condition in the card | Task | Deadline |
|---|---|---|
| Dropped out of the core | Contact the customer personally | 3 working days |
| Core customer, time to buy, high average order | A personal offer instead of an automatic push | 5 working days |
| Moved into the core from any segment | Say thank you, learn preferences | 7 working days |
About 20–30 tasks a month across all managers. One open task per customer, none for the control group, closed automatically on purchase. The result goes back to the CDP as a “personal contact”, so manual work counts in attribution.
First quarter
Four scenarios, each with a control group
The first quarter launches four segment scenarios. Every tag and metric in the model serves one of them; anything without a scenario is not built.
| Scenario | Who gets it | Trigger | What we measure |
|---|---|---|---|
| Win back the cooling core | Cooling core | Entering the segment | Share who buy within 60 days |
| Time to buy | Customers past their personal cadence | Recency exceeds the average gap | Share who buy within 30 days |
| Nudge the growing | Growing | 30 days after a purchase | Share with the next purchase within 90 days |
| Manager alert | Customers who dropped out of the core | Nightly recency recalculation | Share back in the core within 60 days |
15% control group in every scenario
A random 15% of each segment receives nothing, fixed for the whole quarter. Without it you can't tell the effect of a message from a purchase that would have happened anyway. On a base this size it reveals differences like 15% versus 30%; smaller effects don't matter here.
Decision after the quarter
A scenario with a confirmed effect becomes permanent. One with no difference from control is switched off or rewritten. New tags and metrics are added only for scenarios that pass this test.
Lifecycle triggers
12 lifecycle triggers, each a three-channel cascade
Because email alone was read poorly, every trigger is a cascade: email → Wallet push → SMS. The cascade stops the moment the customer acts, timings are set per trigger, and a frequency cap keeps triggered messages ahead of mass ones.
| Trigger | When it fires | Cascade | Launch | Revenue priority |
|---|---|---|---|---|
| Abandoned cart | Items in cart, no checkout for 1 hour | Email after 1 h → Wallet push after 6 h → SMS after 24 h | Month 1 | High |
| Welcome series | Sign-up or first identification, no purchase | Brand story → bestsellers after 2 days → Wallet push with a welcome bonus → SMS after 7 inactive days | Month 1 | High |
| Second purchase | 14 days after the first order | Email with personal picks and a bonus → Wallet push after 5 days → SMS after 10 days | Month 2 | Very high |
| Reactivation | No purchase for 180 days | “We miss you” email → email with a bonus after 3 days → Wallet push → SMS on day 10 | Month 2 | High |
| Birthday | 3 days before the date | Email with a personal bonus → Wallet push on the day → SMS 2 days before the bonus expires | Month 2 | Medium |
| Abandoned browse | Product viewed for 60+ seconds, not added to cart within 2 days | Email with the product and 3 picks → Wallet push after 24 h → SMS after 3 days | Month 3 | Medium |
| Abandoned category | 3+ products viewed in one category in a session, no purchase | Email edit after 1 day → Wallet push after 2 days → SMS after 4 days | Month 3 | Medium |
| Dormant customers | No purchase for 365 days | Bigger bonus: email → Wallet push after 2 days → SMS after 5 days, SMS-led in case the email changed | Month 3 | Medium |
| Price drop | A wishlisted or viewed item goes on sale | Wallet push instantly → email after 2 h → SMS after 24 h if the discount is over 20% | Month 3 | Medium |
| Return | A return is registered | Email with an apology and a short survey → Wallet push with an alternative after 3 days, no SMS | Month 3 | Service |
| Post-purchase | 5 days after delivery | Styling picks and a review request → Wallet push with a review bonus after 7 days | Month 3 | Medium |
| Seasonal window | Start of a season + last season's behaviour | Segmented edit by email → Wallet push after 3 days → SMS on day 7 for the core and growing customers | Month 3 | High |
Loyalty
Bonuses that follow the lifecycle, not the calendar
The platform reads bonus balances and tiers from the loyalty platform and triggers accruals itself. Incentives depend on the customer's stage, not on one-off promotions.
Second purchase → loyal
After the second purchase: +3% on the usual cashback rate for 30 days.
Slowing down
Purchase frequency drops: a welcome-back bonus on the next order.
Back from sleep
A long-inactive customer buys again: double bonus on the next order.
Core retention
The most loyal customers: a quarterly gift card or exclusive early access.
Before expiry
Bonuses expire after 14 days: automatic reminders 5, 2 and 1 day before.
Rollout
Four months, money first, then the model on real data
The rule was simple: launch the triggers that pay first, then build the rest of the foundation, then re-fit the analytics on what the data actually showed. What we deliberately postponed matters as much as what we launched.
- Weeks 1–2
Preparation
The blocking stage: without it nothing moves.
- API access and test environments for the CRM and the loyalty platform
- Email provider chosen, sending IP warmed up
- Consents per channel, privacy policy, loyalty terms
- Identity resolution rules and a master system for each data type
- Minimal, extendable profile model; website tracking limits checked
- Purchase history exported to build the first profiles
- Month 1
MVP with a fast return
Two triggers live and the first reports.
- CRM connected in read mode, full website tracking, email live
- Abandoned cart: one email after an hour
- Welcome series: two to three emails
- Dashboards: abandoned cart, welcome, base dynamics
Deliberately postponed: Loyalty platform, SMS, Wallet push, RFM, the other 10 triggers, recommendations, offline.
- Month 2
Cascades and loyalty
Email triggers become three-channel cascades; retention triggers go live.
- Loyalty platform, SMS gateway and Wallet push connected
- Abandoned cart and welcome moved to email → Wallet → SMS with frequency caps
- First RFM segments written back to the CRM, visual segment editor
- Second purchase, reactivation after 180 days, birthday
By the end of the month 5 of 12 triggers run: the five that earn the most.
- Month 3
All triggers and offline
The rest of the trigger library and in-store purchases in the profile.
- Store receipts reach the profile within a day; segmentation counts offline purchases
- Triggers fire regardless of where the purchase happened
- The remaining seven triggers
- Lifecycle bonus rules
- Visual scenario editor with branches, A/B tests and time-outs
- Month 4
Personalisation, Wallet adoption, reporting
Full scope of the original brief.
- Product recommendations based on purchases and views, on the website and in email
- A journey that invites customers without a Wallet card to install one: from 20% towards 60%+ within a year
- Full reporting set
- After launch
Analytics rebuilt on real data
The customer model re-fitted on the merged purchase history.
- Online and in-store purchases merged over four and a half years
- Recency and frequency thresholds validated on a holdout a year back
- Six segments replace the generic built-in segmentation
- Tags and manager tasks in the CRM
- Four first-quarter scenarios with 15% control groups
What we measure
The dashboard the results will come from
Segments
Customers and share of revenue across the six segments. This is the main view. Active buyers are the core plus growing customers.
Migration
Moves between segments month to month. Downgrades are shown as a separate line, and a move down triggers reactivation.
Active customers
Identified customers who didn't buy this month but took a target action: a payment link, an add to cart, a conversation with a manager. Views and session time are noise and don't count.
Unaddressable demand
The share of target actions made by anonymous visitors: ready-to-buy demand the brand can't reach with communication yet.
New customers
First purchase across the merged history in the month, recalculated back in time when older purchases are matched.
Reactivations
Purchases by cooling core, sleeping core and fading customers within 30 days of a reactivation message, attributed to the last touch in the cascade.
Recalculation rhythm
A full recalculation on the 1st: stitching, de-duplication, scores, segments, tags, migrations, dashboards. The fixed monthly snapshot is the baseline for reporting.
Recency grows without any events, so recency, segment and the “time to buy” and “downgrade” tags are refreshed every night.
A purchase recalculates the profile immediately, so a reactivation message never goes to someone who has just bought.
Lessons
What we would tell any fashion brand starting out
Design identity resolution before the first integration
Decide how records are stitched and which system is the master for contacts, orders and bonuses. Skip it, and you rebuild in month two or three.
Launch the money first
Two email triggers in month one, abandoned cart and welcome, earn while cascades, segmentation and loyalty are still being connected.
If email is weak, cascade
Wallet push and SMS pick up what email misses. The cascade stops on purchase, and a frequency cap protects the customer from overload.
Content is the real bottleneck
Twelve triggers mean dozens of emails, push notifications and SMS texts. Plan copywriting and design as a separate resource, or months two and three stretch.
Fit the window to the purchase cycle
For considered purchases a 12-month window hides your best customers: here it would have dropped 41% of the core. Let recency separate active from cooling, and count frequency over the whole history.
Average order, not total revenue
Total revenue mostly repeats frequency. Average order adds new information and tells you what level of offer a customer expects.
Identify the buyer at the till
A third of in-store purchases had no phone or email and never reached the model. It was the single biggest distortion of every metric.
No scenario, no feature; no control group, no conclusion
Every tag and metric exists because a scenario uses it, and every scenario is judged against customers who got nothing.
In Europe
The same project for an EU fashion brand
The architecture and the model carry over one-to-one. A few things change.
Consent per channel
Email, SMS and push consents are collected separately under the GDPR and stored in the profile.
Data stays in the EU
Profiles, media and backups are hosted in the European Union, under a Data Processing Agreement.
WhatsApp in the cascade
In most EU markets WhatsApp can take the place of SMS or join it as the next step.
Your e-commerce platform
Shopify, WooCommerce or a custom store instead of a site builder; POS and loyalty over API.
Questions
Questions about this case
What is a customer core?
The core is the small group of regular customers who bring most of the revenue. In this case it is customers with four or more purchases: 16.5% of buyers who bring 66.9% of revenue, split into active, cooling and sleeping stages.
Why is the recency threshold 150 days?
It sits between the brand's in-store buying cycle (about 120 days) and its online cycle (about 180 days). On a holdout, 42.7% of customers under 150 days bought again within 12 months, against 15.2% between 151 and 540 days and 5.0% after that.
Why does every scenario have a control group?
Without customers who receive nothing, you can't separate the effect of a message from purchases that would have happened anyway. Here a random 15% of each segment is held out for the quarter, and a scenario stays only if it beats that group.
Can a European fashion brand run the same model?
Yes. The architecture and segmentation carry over. What changes is GDPR consent per channel, EU data residency, WhatsApp as a cascade channel and connectors for platforms like Shopify or WooCommerce.
Find your own core
We'll analyse your customer base the same way: how much revenue your most loyal customers bring, who is cooling off, and which scenarios will pay off first.