Offer Engine
Hyperswitch Offers lets you run card-based promotions — instant discounts tied to card BINs directly inside your existing checkout. Offers are powered by the Offer Engine, a dedicated service that evaluates eligibility, enforces budgets and velocity limits (like "once per card"), and tracks redemptions.
The best part: if you already use the Hyperswitch Web SDK, offers appear in your checkout with zero frontend changes. The SDK detects the card, fetches the matching offer, displays it as applied, and attaches it to the payment — all automatically.

What is an Offer?
An offer is a promotion configured against card attributes — for example, "10% off (up to $20) on all Amex credit cards, valid till month end, once per card." When a customer enters an eligible card at checkout:
The discount is calculated and shown to the customer before they pay
The customer is charged the discounted amount at the payment processor
Budgets and redemption counters are tracked centrally, so an offer can never be over-redeemed
If the payment fails or is refunded, the redemption is automatically rolled back
How does it work?
The full journey of a payment with an offer:
Key behaviours:
Amounts in the payment response
amount stays the full order amount; net_amount and amount_received reflect the discount; applied_offer carries the offer details
Offer Engine unavailable at eligibility
Checkout continues with no offer — payments are never blocked by the offers system
Offer selected but cannot be applied at confirm
The confirm fails (error IR_16) — a customer is never silently charged full price after seeing a discount
Payment fails or is refunded
The redemption is revoked automatically in the background; budgets and per-card counters roll back
Once-per-card limits
Enforced via a PAN-free card fingerprint — the same card cannot reuse an offer even across different customer accounts
What's supported today
One offer per payment — the best eligible offer is auto-applied, read-only
Web SDK works out of the box; custom/headless and mobile checkouts integrate via the REST APIs
Automatic capture — partial capture is not supported with offers
Refunds are handled — Both full and partial refunds are supported. Any successful refund triggers background revocation of the entire applied offer. Once the revocation is processed, the offer redemption is fully reversed, restoring the offer budget and per-card usage counters.
Disputes are not handled today — a chargeback does not revoke the redemption
Offer configuration — creation, updates, pause/resume, and deletion are a self-serve configuration UI on control center
Display offers on your website — use the Browse Offers API show available offers before a payment is created. Its optional display_title field provides a short label for website banners or offer listings, alongside code, title, and description. Eligibility for the customer's card is checked during the payment flow.
Getting started
Then follow the setup guide for your deployment model:
Hyperswitch Cloud — the Hyperswitch team enables the feature for your merchant account; you only verify and go live.
Self-hosted — you add the Offer Engine configuration to your own Hyperswitch stack (config, feature flags).
FAQs
Do I need to build any UI for offers? No. The Web SDK renders the offer inside the card form automatically. If you want to also reflect the discount in your own order summary (outside the SDK), subscribe to the
appliedOffersInfoevent — see How the SDK works.Can a customer choose between multiple offers? Not currently. The best eligible offer is selected and auto-applied. One offer per payment.
What happens to the offer if the payment fails? Hyperswitch notifies the Offer Engine in the background and the redemption is revoked — the customer's card can use the offer again, and the budget is restored.
Does this work for wallets / bank transfers? No. Offers are currently supported for card payments only.
Is the card number shared with the Offer Engine? No. Only the card BIN (upto 9 digits), network metadata, and a PAN-free fingerprint (
card_alias) are sent — never the full card number.
Last updated
Was this helpful?

