Accepted answer
Separate fact tables make sense once stages genuinely have different grains or measures, like purchase having amount and currency that impression doesn't. Otherwise model those as satellite tables joined by a shared session_id instead of duplicating funnel logic.