The Slow Drift That Makes Marketing Expensive
A marketing org builds segments over time: “high-intent buyers Q3,” “high-value leads with recent engagement,” “trial users with email opens.” Two years in, there are 140 active segments. Half of them overlap by more than 60%. Activation costs multiply because each segment is computed independently and pushed to each destination separately. The marketer running campaigns can’t tell which segment to use because they all return roughly the same people.
This is the segment-overlap problem in Dynamics 365 Customer Insights. It compounds quietly. The detection is straightforward once you know what to look for.
What Overlap Actually Costs in 2026
Customer Insights bills on monthly active profiles per destination. If two segments overlap by 80% and both push to a marketing destination, you pay for the same profile twice in that month — once per segment. With 100K profiles and 12 destinations, the bill differs by 30-40% between a well-pruned segment list and a sprawled one.
That’s the activation cost. The other cost is the marketing one: campaigns running against multiple overlapping segments produce duplicate messages to the same person. Customers complain. Unsubscribes spike. CAN-SPAM scrutiny appears.
The Query That Finds Overlap
Customer Insights supports a “Compare segments” view, but it only does pairs. For full overlap mapping, run this query in Power Query against the Customer Profile table once a month:
let
Source = #"Customer Profile",
SegmentMembership = Source[Segments],
Expanded = Table.ExpandListColumn(Source, "Segments"),
Pairs = Table.SelectRows(
Table.NestedJoin(Expanded, "ProfileId", Expanded, "ProfileId", "Joined"),
each [Segments] <> [Joined]{0}[Segments]
),
Counts = Table.Group(Pairs, {"Segments", "Joined.Segments"},
{"OverlapCount", each Table.RowCount(_)}),
SegmentTotals = Table.Group(Expanded, {"Segments"},
{"Total", each Table.RowCount(_)}),
Joined = Table.NestedJoin(Counts, "Segments", SegmentTotals, "Segments", "T1"),
OverlapPct = Table.AddColumn(Joined, "OverlapPct",
each [OverlapCount] / [T1]{0}[Total])
in
OverlapPct
The result is a matrix: row = segment A, column = segment B, value = the percent of A that also appears in B. Anything above 80% is a candidate for merging. Anything in the 40-60% range is a candidate for sharper definition.
The Cleanup Pattern
Walk the high-overlap pairs in order. For each:
1. Decide if they’re meant to overlap. “All customers” and “All customers in EMEA” overlap 30% — that’s fine; one is a parent of the other. “High-intent buyers Q3” and “Engaged trial users” overlapping 85% is not fine; one of them is doing the job.
2. Promote one as the canonical segment. Pick the one with the cleaner definition and the better name. Archive the other after migrating any active campaigns and journeys.
3. Document what the canonical means. The most common reason segments duplicate is that nobody remembers what the original meant, so the next marketer builds their own. Write a one-paragraph description in the Customer Insights segment metadata field — there’s literally a Description field; almost nobody fills it in.
4. Audit the activations. When you archive a segment, every activation that pointed at it goes inactive. Re-point those to the canonical segment before archiving, not after.
What Real-Time Segments Make Worse
Real-time segments (the 2026 Wave 1 GA feature) recompute on profile change rather than on a schedule. They’re powerful and they’re an overlap-multiplier. Each real-time segment maintains its own state machine; each one runs against every profile event; each one publishes its own change stream to downstream destinations.
The cost difference between 5 well-designed real-time segments and 30 sloppy ones is roughly 6x in compute. We’ve seen Customer Insights bills go from $8K/month to $48K/month after a marketing team added “just a few more real-time segments” without auditing overlap.
The pre-deployment check before any new real-time segment: run the overlap query against existing segments. If the new one overlaps with an existing real-time segment by more than 60%, refactor the existing one instead of adding a new one.
The Anti-Pattern: Per-Campaign Segments
When marketers can build segments on-demand, the temptation is to build a fresh segment per campaign — “Q3 launch buyers,” “Q3 launch buyers v2,” “Q3 launch buyers + EMEA.” Each campaign gets one segment, the segment is used once, and it then lives forever in the segment list.
The discipline that survives: campaign segments are temporary by default. Configure a Power Automate flow that finds segments older than 90 days with zero activations in the last 30 and emails marketing ops asking “delete or keep.” Defaults to delete. Two months later, your segment list is half the size and twice as understandable.
What to Do This Week
Pull the overlap matrix. Find the top 10 overlap pairs. Decide for each whether to merge, sharpen, or accept. Document what you accept (so the next person doesn’t relitigate). For real-time segments specifically, set an internal threshold (60% is reasonable) above which new ones require a written justification.