← All posts

Cross-sell and upsell: the difference, with Odoo examples

30 September 2026

Both usually get filed under "growing the account". They are two different questions, computed differently and said differently to the customer. Mixing them up produces recommendations that reps ignore, rightly.

Cross-sell: what they do not buy yet

Cross-selling is offering a category the customer has never bought, because customers who look like them buy it. The question is not "what sells best?" but "what do the buyers of what they buy also take, more often than average?"

On the Odoo of a security equipment distributor, 6.6% of customers buy camera brand H. But among customers who buy a certain range of video accessories, 43.5% also buy H. Ratio: 6.6. A customer who takes those accessories and not H is an anomaly, and a natural proposal.

Three precautions, without which the list is unusable:

With those rules, this distributor has 200 candidate customer-category pairs. Keep the best per customer, and the top ten by account revenue come up every morning.

Upsell: what they already buy, but less than others

Upsell, or share of wallet, is a customer who already buys a category but devotes a clearly smaller share of their purchases to it than customers their size. They know the product, they have validated it, and they probably buy the rest of it elsewhere.

Same Odoo: an account at 850,000 € over two years buys brand U for 102,000 €, 12% of its purchases. Customers its size devote 19.6% to it. The gap is worth 64,000 € over the period, probably going to another distributor.

Three precautions here too:

Result at this distributor: 51 accounts with a gap of at least 2,000 € a year. Far fewer than cross-sell, and each line is a number the rep can say to the customer.

The difference, one sentence each

Cross-sell: "Customers like you also take H, you have never tried it." Upsell: "You already take U from us, but for 12% of your purchases when your peers are at 20%. What holds you back on the rest?"

The first opens a door. The second asks why an open door is not walked through. Not the same call, and often not the same rep.

What never to do

Offer anything to a customer with an overdue invoice or a difficult call last week. At this distributor, 257 accounts are in that situation at any given time, contacts and parent companies included. They leave both lists until the problem is settled. A rep who calls to sell to someone waiting for a credit note loses both.

How to see it in Odoo

Odoo has neither. With Sales Analysis grouped by customer and category you can export the matrix and compute shares in a spreadsheet. Cross-sell also needs the co-occurrences between categories, which is beyond a spreadsheet. A day's project to redo every month, or an overnight calculation.

How ERP-BI does it

Both calculations run every night on confirmed orders, contacts rolled up to their company. Both recommendations show their working on the card: for cross-sell, the category already bought that justifies the proposal, the share of comparable customers who also buy, the base rate and the number of observations; for upsell, the current share, the peer share and the gap in euros. A rep had told us "il faudrait plus expliquer pour être sûr que la reco est bien", it needs more explanation to be sure the recommendation is right. This is the answer.