At a glance
Customers and B2B Companies ranked by refund value over the rolling 90-day window. Helps Operations spot serial returners, fraud-pattern customers, and damaged-shipment-cluster B2B accounts. The card sits between “this is a normal returns operation” and “this is a possible fraud or chronic dispute” depending on context, the same customer at #1 means very different things in DTC vs B2B.
| What it counts | For each customer_id (and Adobe Commerce company_id where the B2B module is enabled): SUM(creditmemo.grand_total) and COUNT(creditmemo) over the 90-day window, ranked descending by sum. Top 20 returned by default. Guests aggregated by email address (customer_email on the order) since they have no customer_id. |
| API field | customer_id, customer_email, extension_attributes.company_attributes.company_id, joined to creditmemo.grand_total and creditmemo.created_at from GET /rest/V1/creditmemos. |
| VAT / tax treatment | Tax-inclusive (grand_total). For UK/EU merchants this is the customer-paid figure including refunded VAT. Net-of-tax view available via the breakdown column. |
| Shipping inclusion | Included in grand_total. Shipping-only Credit Memos contribute their shipping value. |
| Discounts | Already deducted in grand_total. |
| Cancelled orders | Excluded (no Credit Memo on cancel). |
| Guest customers | Aggregated by customer_email since customer_id IS NULL for guests. A guest using two different emails (intentionally or not) appears as two rows. This is the most common false-negative for fraud detection. |
| B2B Companies | When the Adobe Commerce B2B module is enabled, the card aggregates by company_id rather than per-buyer-within-company. A janitor and a head office buyer at the same hospital roll up to “Riverside Hospital Group”. |
| Refund-rate column | Each top-N row shows refund_value ÷ customer_lifetime_revenue so you can distinguish “this customer refunds 80% of orders” (likely fraud or wrong-fit) from “this customer refunds 8%” (legitimate big-spender with normal return rate). |
| Currency | Mixed-currency grand_total for ranking; base_grand_total available for FX-neutral. |
| Multi-store scope | All Store Views by default; per-Store-View slice available. |
| Time window | 90D rolling. |
| Alert trigger | None on this card directly; rely on watchlist rules in the Vortex IQ workspace (e.g. flag any customer whose 90D refund rate is >40% AND refund count is >3). |
| Roles | owner, operations |
Calculation
Calculated automatically from your Adobe Commerce data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.Worked example
A B2B+DTC homewares merchant on Adobe Commerce 2.4.7 with B2B Companies enabled. Snapshot 13 May 26, 90-day rolling. Top 10 refunding customers/companies:| Rank | Customer / Company | Type | Refund value (90D) | Refund count | LTV (90D) | Refund rate (% of LTV) | Diagnosis |
|---|---|---|---|---|---|---|---|
| 1 | Riverside Hospital Group | B2B | $24,300 | 4 | $284,000 | 8.6% | Normal for high-volume B2B |
| 2 | Westfield Schools District | B2B | $18,100 | 3 | $156,000 | 11.6% | Slightly elevated; uniform-line sizing issue |
| 3 | sara.h@personalemail.com | Guest DTC | $4,820 | 11 | $5,940 | 81% | Fraud watch |
| 4 | LeisureGroup Plc | B2B | $4,210 | 2 | $74,000 | 5.7% | Normal |
| 5 | mike_t@… (registered DTC) | DTC | $3,640 | 7 | $4,180 | 87% | Fraud watch |
| 6 | HotelChain UK | B2B | $3,180 | 1 | $112,000 | 2.8% | Single high-AOV return; benign |
| 7 | claire.j@… (registered) | DTC | $2,940 | 12 | $11,200 | 26% | Serial returner, not fraud (consistent buyer) |
| 8 | StateGov Procurement | B2B | $2,710 | 1 | $87,000 | 3.1% | Normal |
| 9 | jen.k@… (registered) | DTC | $2,180 | 9 | $3,400 | 64% | Fraud watch |
| 10 | tony.r@… (registered) | DTC | $1,940 | 6 | $7,200 | 27% | Serial; not fraud |
- B2B-dominated top of the list (5 of top 10). This is normal for a B2B-leaning merchant; high-volume accounts produce high-value returns even at low rates.
- Three fraud watch flags. Customers at ranks 3, 5, and 9 have refund rates above 60% with multiple Credit Memos. That is a fraud pattern: they buy, return, repeat. Often reselling on secondary markets, sometimes “wardrobing” (wear once, return). Action: add to a watchlist and require manual approval on next order.
- Serial returners that are NOT fraud (ranks 7 and 10). Refund rates of 26-27% with consistent buying behaviour signal a customer who routinely buys multiple items to choose from, then returns the rest. This is “try-before-you-buy” behaviour, common in apparel. Customer service decision: keep them (they are net positive) or block them (they are net negative once handling cost is included). Compute net contribution:
LTV × gross_margin − handling_cost × refund_count. For most DTC merchants, a 25% refund rate at $400+ of net LTV is still profitable. - Westfield Schools at #2, refund rate 11.6%. Higher than the B2B norm of 2-5%. Drilling into Top Refunded Products by-customer view: 14 of 16 returned line items are uniform line items affected by the supplier sizing error. Not their fault; not fraud. Sales should reach out with the corrected sizing and a goodwill credit to retain the relationship.
- Cross-link with Refund Value: the top-10 customers here account for 284,600 90-day refund value, or 24%. Pareto-typical; the long tail is healthy normal-customer returns.
- Action queue for Operations: (a) flag the 3 fraud watches for next-order manual review, (b) Sales call to Westfield Schools with sizing correction, (c) audit Riverside Hospital’s 4 returns to ensure they were genuine damage claims (B2B fraud is rare but exists).
Sibling cards merchants should reference together
| Card | Why pair it with Top Refunding Customers |
|---|---|
| Refund Value | The aggregate. This card is the per-customer concentration view. |
| Refund Rate | Overall rate. The customers in this card are the contributors. |
| Refund Count | Per-customer count vs value: high count + low value = small partial returns; low count + high value = whale events. |
| Refunds Over Time | Time pattern. A new customer appearing here usually shows up as a single-day spike there. |
| Return Status | Pipeline; many of these customers have open RMAs in addition to closed Credit Memos. |
| Customer Count | The denominator. Top-10 refunding customers as % of total customers shows concentration. |
| B2B Account Silence | A B2B account on this list whose order cadence stops is a churn-risk red flag. |
klaviyo.high_refund_segment | Suppression list candidates; remove fraud-watch customers from acquisition email flows. |
Reconciling against the vendor’s own dashboard
Where to look in Adobe Commerce Admin: Adobe Commerce does not have a native “Top Refunding Customers” report. Closest equivalents:Reports > Customers > Customers by Number of Orders is the inverse view (top buyers, not top refunders). No native top-refunders ranking.To verify any single customer’s refund value:
Customers > All Customers > [customer] > Orders tab. Manually count Credit Memos against that customer’s orders. Tedious but exact.For B2B Companies:
Customers > Companies > [company] > Orders tab. Same logic at the Company level.Why our number may legitimately differ from a manual Admin count:
| Reason | Direction of divergence |
|---|---|
| Guest aggregation by email. A single guest using two emails (e.g. work + personal, typo) splits across rows in this card. The merchant might mentally consolidate them as “the same person” but the data does not. | Card under-aggregates per-real-person |
Customer email change. If a registered customer changes their email in Adobe, historical orders retain the old customer_email; the customer record uses customer_id which is stable. The card aggregates by customer_id for registered customers (correct) but by customer_email for guests (lossy). | Inconsistent across registered/guest |
B2B Company aggregation. The card rolls up to company_id when present. A merchant manually checking a single buyer’s history will see only that buyer’s slice, not the Company total. | Card shows higher than per-buyer |
Currency. The ranking is grand_total (mixed currency). For an FX-neutral ranking switch the column to base_grand_total. | Material for international |
| Time-zone, sync lag. Standard ±5-15 min sync lag; ±1 day at UTC vs locale boundaries. | Minor |
| Card | Expected relationship | What divergence tells you |
|---|---|---|
klaviyo.refund_segment_size | Klaviyo profiles flagged as “high refund” should overlap with the top-N here | If Klaviyo has a different list, the suppression flow is out of date; sync the segment. |
google_analytics.refund_attribution | GA4 sees only refund events fired by the storefront, not the per-customer aggregation | Do not directly reconcile; GA4 customer identity is unreliable. |
Known limitations / merchant FAQs
A guest customer is at #1, can I see their order history? Click through on the row to the customer email’s order list. Adobe Commerce stores guest orders bycustomer_email and customer_is_guest=1. The Vortex IQ workspace renders an aggregated profile by email, including all guest orders matched.
Why is my B2B Company at #1, isn’t that bad?
Not necessarily. High-volume B2B accounts have high absolute refund value because they have high absolute order value. The refund-rate column normalises: an account with 24k of refunds is at 8.6%, well within B2B norms. The customers to worry about are the ones with refund rate >40%.
A customer’s customer_id changed, why is their history split?
Customer ID is stable in Adobe Commerce; it doesn’t change. What can change is customer_email. Registered customers are aggregated by customer_id, so an email change doesn’t split them. Guests are aggregated by email, so a guest changing emails does split. There is no clean way to merge guest profiles in Adobe.
Should I block fraud-watch customers from buying?
Use a graduated response: (1) flag for manual review on next order; (2) require pre-payment via wire transfer (no chargeback risk); (3) blacklist if the pattern repeats. Adobe Commerce supports per-customer blocking via Customers > All Customers > [customer] > Account Information > “Disable account”. Use it sparingly; false positives create CS load.
A wholesale account showed up here for one bulk return, isn’t that misleading?
The card is a snapshot. A single 284k LTV account is not a problem. The diagnostic column (refund rate) gives context. Look at it together with the count column; one whale return at 8% rate is benign, four returns at the same rate suggest a pattern.
Why isn’t fraud detection automatic?
Because the false-positive rate of pure-statistical fraud detection in B2B and certain DTC verticals is too high. A fashion DTC merchant who accepts try-before-you-buy will see legitimate 25-40% refund rates for repeat customers; flagging those automatically would alienate good buyers. The card surfaces the data; the merchant applies context.
My multi-store, can I see top refunders per Store View?
Yes. Apply the Store View filter to the card. Useful when, e.g., the US site has different refund norms than the UK site (US allows 90-day returns vs UK statutory 14-day; rates structurally differ).
Can I export this list to Klaviyo as a suppression segment?
Yes via the connector to Klaviyo. The fraud-watch flag becomes a Klaviyo profile property; you can build a segment “exclude where vortex_fraud_watch = true” and use it on acquisition flows.
Why does the same customer appear in two rows?
Three causes: (1) guest using two emails; (2) one email registered, the other not; (3) data quality issue (typo in customer_email). The Vortex IQ workspace supports merge-by-email for cases (2) and (3); case (1) cannot be resolved without manual intervention.