Every other personalisation stack is five plugins arguing. Osmo is one agent that decides the whole move.
Percent off or amount off, sized to the shopper, never below your margin floor. Never stacks with itself.
A matching item offered at checkout, priced to move slow stock without eating into the main item's margin.
A small item added once the cart hits a threshold the engine learns for each kind of shopper — not one fixed line.
The engine picks the threshold per shopper, trading the cost of shipping against a bigger basket.
When to send the email and what offer to put in it, decided by the same model — no second tool, no second truth.
A classic failure: the discount app offers ten percent off, the upsell app nudges a $22 scarf, the gift app tips in a $12 pair of socks, the shipping app drops the threshold — and the checkout ends up below margin floor. None of them knew about the others. The next week, the merchant turns one off at random, revenue moves, and no one can explain it.
"Attribution is a research project. The only clean thing to do is pick one action and measure it."
The engine cannot break the rails, because the rails are inside its action space, not around it.
Every offer is checked against a margin floor on each product. Below the floor, the offer is simply not on the table.
How deep the discount goes, how rich the gift is, how often you reach out — all capped per collection. Your luxury line never shows up at thirty percent off.
Five percent of traffic always sees no action. That is how we keep the counterfactual honest.
No third‑party data. No cross‑merchant training. Your model is yours.
The left column is every offer the merchant turned on. The middle column is what survives the guardrails for this particular shopper. The right column is the offer Osmo picked, with the margin it expects to earn.