Discounting an offer is a property of the offer itself, not a separate object — you set a fixed amount or percentage, and it applies to the offered product specifically when the offer is accepted, scoped to however many units the offer actually sells rather than the full line quantity, so raising the quantity of an item already in the cart doesn't multiply a fixed-amount discount. All of this runs through a Shopify Function reading a configuration UpsellPlus keeps in sync on your shop's discount nodes — not through older Shopify Scripts or injected storefront code — which is also why checkout-context discounts need no extra setup beyond the offer itself.
The one behavior worth understanding precisely, because it's easy to assume otherwise: an upsell discount does not automatically disappear if the cart stops qualifying for it. By default, once a discount has been applied to a cart line, it stays applied even if you later change the offer's targeting. Automatic removal is a separate, opt-in setting on the offer — turn it on and the discount is re-verified against your current Smart Rules on every cart evaluation, and withheld if they no longer pass. Leave it off and the discount behaves like a one-time grant. If you're debugging a discount that didn't clear when you expected, check this setting before assuming something is broken.
Two more things worth knowing: if a targeting list on a protected offer (one with removal enabled) ever grows too large to fit Shopify's function input limits, the discount is withheld entirely for that offer rather than applied against a silently truncated list — intentional, since a truncated exclude list would fail open and discount items it shouldn't. And if you also run merchant free-shipping discount codes, be aware that UpsellPlus's discount function declares a shipping discount class on the same node, which takes precedence in a way that can block those codes from applying — worth testing together if you use both.