Introduction
With revenue attribution, you can precisely connect every order to the campaign or journey that drove it — giving you full visibility into what's working, what isn't, and where to invest next. Without it, measuring the impact of your WhatsApp channel means guessing, or relying on customers to tell you what influenced their purchase.
charles' built-in attribution model does the heavy lifting automatically, so you can focus on what matters: applying a clear Analyse → Learn → Improve loop to every campaign you run.
KPIs & Benefits
Revenue attribution unlocks clear, reportable performance metrics across your entire WhatsApp channel:
KPI | Description |
ROI / ROAS | Total return on investment, broken down per campaign or journey |
Total Revenue Generated | Gross revenue after discounts attributed to charles touchpoints |
€ / Recipient | Average revenue generated per contact messaged |
Stitched Contact Rate | The percentage of contacts successfully linked between charles and your shop — a key driver of attribution accuracy |
Why It Matters
Revenue attribution puts you in control of your performance data. With it, you can:
Attribute revenue to specific touchpoints — Know exactly which campaign or journey drove a purchase
Calculate ROI and ROAS — Both in total and broken down per touchpoint
Identify your most effective strategies — Double down on what works, and confidently cut what doesn't
Justify and grow your WhatsApp investment — With clear, reportable numbers that speak for themselves
Without attribution, these insights simply aren't available — making it impossible to optimise your channel with confidence.
Requirements
To use revenue attribution in charles, you will need:
Requirement | Purpose |
Shopify integration | Required to receive order data and trigger attribution |
CRM integration | Enriches customer data for more accurate contact stitching |
Google Analytics | Provides additional data to support attribution reporting |
Contact stitching (email) | Links contacts between charles and your shop system to enable attribution |
💡 Tip: The higher your stitched contact rate, the more accurate your revenue attribution will be. See Increasing your synced subscri... for tips on improving this.
Use Cases
Revenue attribution applies to all revenue-generating touchpoints in charles, including:
Marketing campaigns (one-off sends)
Journeys / automated flows (e.g. welcome, post-purchase, win-back)
How It Works
Attribution Model: Last-Touch
charles uses a last-touch attribution model. Revenue from an order is assigned to the last tracked interaction a contact had with a campaign or journey before placing their order — within the attribution window.
Tracked events include:
A contact reads a message
A contact clicks a quick reply button
A contact clicks a CTA button
Attribution Window
The attribution window defines how far back charles looks when assigning revenue to a touchpoint. It is set to 5 days by default, but can be adjusted to suit your industry.
To update: Settings → Configurations → Attribution window configuration
The timezone used is based on your account timezone (also set in Settings)
⚠️ Note: Changing the attribution window only affects future attribution. Historical data will not be recalculated — though a history table in Settings shows previous configurations for reference.
Coupon Code Attribution
If a contact is not stitched, charles can still attribute revenue using a coupon code included in the campaign or journey. This is toggled on by default and is a useful fallback when your stitched rate is low.
Coupon codes can be added to both Campaigns and Journeys.
To add a coupon code to a Journey, go to the Journey Settings → Coupon codes → Add coupon code.
To add a coupon code to a Campaign, Create a Campaign, on the 1st step of a Campaign setup→ Add coupon code.
To update attribution settings: Settings → Configurations → Attribution window configuration
⚠️ If the same coupon code is used across multiple campaigns, the last touched campaign receives attribution. To ensure accurate attribution, avoid reusing coupon codes across different campaigns or journeys.
How Attribution Is Assigned: Step by Step
When a customer places an order, charles runs the following process:
Is the contact stitched? If yes → charles checks all tracked events within the attribution window and attributes revenue to the campaign or journey linked to the most recent event. If no → move to step 2.
Was a coupon code used? If yes and it matches a campaign or journey → revenue is attributed accordingly. If no → revenue is not attributed.
Revenue is assigned to the campaign or journey of the last tracked event.
💡 If a contact is stitched at a later date, the attribution process runs again automatically — without creating any duplicate revenue entries.
The diagram below illustrates the full decision logic:
Example
Wolfgang receives Campaign 1 for an end-of-year sale and opens the message. Three days later, he receives Campaign 2 — a last-chance reminder — and clicks the CTA button, then places an order. With a 5-day attribution window:
His contact is confirmed as stitched ✅
charles checks all tracked events in the last 5 days
The last event was Wolfgang clicking the CTA in Campaign 2 — so revenue is attributed to Campaign 2
Where to Find Revenue Attribution in charles
Revenue Dashboard
Available in Analytics → Revenue Dashboard, this gives you a high-level view of all attributed revenue. It is visible once at least €1,000 of revenue has been generated in the last 30 days.
The dashboard includes:
Metric | Description |
Total Attributed Revenue | All revenue attributed across campaigns and journeys |
Total Journeys Revenue | Revenue attributed to automated flows |
Total Campaign Revenue | Revenue attributed to one-off campaigns |
Revenue per Conversation (RPC) | Average revenue generated per marketing or utility conversation |
💡 Note: RPC is a lagging metric — a conversation and its resulting purchase may happen on different days. Daily RPC is calculated as: Daily revenue ÷ Daily number of marketing and utility conversations.
Analytics Hub (Campaigns & Journeys)
Detailed, touchpoint-level revenue attribution is available directly within individual Campaigns and Journeys in the Analytics Hub — so you can assess performance at a granular level without leaving the workflow.
Glossary
Term | Definition |
Stitched contact | A contact successfully linked between charles and the integrated shop system |
Stitched rate | The percentage of contacts successfully stitched |
Attribution window | The timeframe charles considers when attributing revenue to a campaign or journey (default: 5 days) |
Last-touch model | Assigns revenue to the last tracked interaction before a purchase, within the attribution window |
RPC (Revenue per Conversation) | Total revenue divided by the number of marketing and utility conversations in a given period |
FAQs
Question | Answer | Helpful links | Feature |
Why is my revenue per conversation (RPC) super high one day, but the average is around 1€? Why have I made revenue on this day with 0 conversations? | Revenue per conversation is a lagging metric because the conversation and purchase can happen on different days. For example, you send a marketing campaign on Monday but your customer doesn’t purchase anything until Tuesday. In this case, the RPC on Tuesday will be higher.
Calculation of the daily RPC is : Daily revenue / Daily number of marketing and utility conversation |
| Revenue attribution |
Why can’t I see my revenue data? | For us to display the revenue dashboard, we need at least €1000 of generated revenue in the last 30 days. |
| Revenue attribution |
Why don’t I see any trend in my chart? | If we have no historical data for both options in the comparison date picker, we cannot display any trend on the metrics cards. |
| Revenue attribution |
What kind of revenue is displayed in the platform? Gross/net? After discount? | The platform always displays gross revenue after discount. |
| Revenue attribution |
What happened to the revenue data before November 16, 2023? What about to my campaigns before November 16, 2023? | Before the November 16, we didn’t have the information we needed to accurately track revenue so we can’t display revenue data from our new model prior to November 16.
All campaigns published before November 16 will display revenue data from Google Analytics (or coupon code if available). |
| Revenue attribution |
I sent out a large campaign but see no revenue attributed to the campaign. How come? | It could possibly be because; - Synced subscribers rate = 0 - No shop integration - No orders coming in (check webhooks) |
| Revenue attribution |
Can an order be attributed to a flow and a campaign? | An order can only be attributed to a campaign OR a flow (for now) |
| Revenue attribution |
I did not send out a campaign recently but still see revenue attributed to campaigns. How come? | People may be using a coupon code that was shared in this campaign to place an order.
However, campaigns stop receiving attribution 30 days after their publication. |
| Revenue attribution |
What happens if I use the same coupon code in different campaigns? What happens if I use the same coupon code in a campaign and a flow? | When the same coupon code is used in multiple campaigns, only the last one published will receive attribution from this coupon code If the same coupon code is used in a campaign and a flow, as of today, both receive the attribution (because of the new logic vs old attribution logic) |
| Revenue attribution |
How do I know the rate of synced subscriber rate of my universe? | Check the synced subscriber block on the Home screen. | Revenue attribution | |
I changed the attribution window in the settings, will the previous attribution data be updated? | Previous/historical attribution data won’t be updated after a change in the attribution settings, only the future attribution will use the updated settings.
A history table is available in the settings page helps to understand previous attribution. |
| Revenue attribution |
I don’t have Shopify/Shopware/Woocommerce integrated, can I still get revenue attributed? | Unfortunately not at the moment as we rely on orders sent by these integrations. |
| Revenue attribution |
Why is the attributed revenue so low? | If you subscriber base has a low syncing rate between charles and the integrated shop system, it’s hard for us to attribute revenue because we can do so only for synced contacts | Revenue attribution | |
When should I activate the coupon code in attribution setting? | When the syncing rate is low, we advise to use the coupon code to enrich the data and have a more accurate revenue attribution. |
| Revenue attribution |




