The 30 second answer
A one-hot ID gives each item its own weight, so nothing learned about one item helps a similar one, and new items have no slot. An embedding is a short dense vector learned so that items that behave alike sit close together. What close means comes entirely from the training objective: bought together suits upsell, while similar descriptions suit search.
One-hot baseline. Give every product its own position in a catalog-sized vector and feed it to a logistic regression. The model learns one weight per product. That is simple, fast and easy to debug, and large sparse linear models served ads for years. It breaks down on sparse data: a toothbrush and an electric toothbrush are unrelated positions, so the long tail learns little, and a product listed this morning has no position at all.
Embedding. Each item gets a short dense vector, and training places items that behave alike near each other, usually measured by dot product or cosine similarity. That buys two things. Related items become a nearest-neighbour lookup, which approximate indexes make fast over very large catalogs. And the vector becomes a compact input to other models, so a ranker receives what was learned about the item instead of an opaque ID.
The objective defines the space. An embedding has no meaning of its own. For a checkout upsell, a good first objective is co-purchase: a toothbrush should sit near toothpaste and floss, not near another toothbrush the shopper already has. A text embedding of the product description would put the two toothbrushes together, which suits search but finds substitutes, not complements. Even inside shopping, "same cart" and "bought within a week" are different signals; a grinder buyer often returns for filters. Whether to merge them or keep the second for a follow-up email is a product decision.
Serving shape. Embed the cart, query an index of product vectors, drop items already in the cart, then let a ranker choose the few to show.