Migration is mostly a matching problem. Your identifiers do not move; your mappings do.
Before changing any code, run your full product list through match and look at the confidence distribution. That tells you what your coverage will actually be, using your real rows rather than a demo set.
Point a shadow consumer at the new events for two weeks without acting on them. Compare against your existing feed. Disagreements are informative in both directions — sometimes the incumbent was wrong.
This is the honest part. History accumulates forward and cannot be transferred. If your incumbent has three years on a product, they keep that advantage on that product until enough time passes. Start collection on your priority set before you need it, not when you switch.
Store `product_id` alongside your rows during the match run, then you never resolve at request time again.