Fan-out is asymmetric — outbound and inbound aren't the same
Designing a many-to-many participants index where one message has multiple resolved people, and how to decide who gets surfaced on which person's per-page timeline
Built a participants/fan-out index that populated every resolved party (sender + every recipient) for every message regardless of direction. Design memo and approved spec described it as 'group fan-out and self-as-sender visibility,' all worked examples in the memo were from the user's outbound perspective (me-to-Bob, me-to-[Bob,Carol]) plus a 1:1 inbound. I never wrote out the example of a large inbound broadcast (a 100+ person CC'd announcement, say). User caught it post-deploy when an unrelated contact's broadcast-group photo appeared on a different contact's per-person timeline. The directional asymmetry is structural: on outbound, you ARE the originator and the conversation IS yours, so every recipient should see it on their page as 'this person sent me something.' On inbound, you're one of N recipients of someone else's message, and the OTHER recipients being CC'd / in the group with you doesn't make the message 'about' them — that's just modern group-messaging hygiene. The shape that came out: outbound fans out broadly (every recipient is a participant), inbound only fans out to (sender's owner, me-tagged person). 1:1 messages are unchanged in either direction because the two-party case is the same shape.
When designing a participants/fan-out index, write the worked examples for BOTH directions, including the large-N inbound case (think: a 100-person CC'd corporate announcement or a 50-person broadcast group). The outbound cases will all feel right and you'll skip the inbound check. If your fan-out treats sender-side and recipient-side identically, you'll silently reconstruct every group conversation on every member's record, which isn't what a CRM wants. The asymmetry to remember: outbound presumes you're the originator and the conversation IS the relationship; inbound presumes someone else is the originator and CC lines aren't relationships.