# DualPricingSettings

A model the API reference uses in a request or a response. The operation pages link every field typed as this model here.

A merchant's dual pricing program: a cash price and a higher card price posted before the payer
chooses how to pay, the card price being the cash price plus `rate` of it or, in
`Fixed` mode, plus `fixedAmount`. Stored on the
merchant aggregate as a nullable owned reference, and carried on the merchant create, update and
read contracts.

## Fields
- `enabled` (boolean): The per-merchant program switch. Null reads as off. Changing it requires the `Merchants.DualPricing.Enable` permission, which the merchant's own users do not hold. (nullable)
- `mode` ([DualPricingMode](https://devportal.signapay-sbx.winkpg.io/docs/api/models/DualPricingMode.md)): How the card price is derived from the cash price: a percentage rate, or a fixed amount. Null reads as `Percentage` (`GetMode`), so a configuration written before the fixed-amount mode existed keeps pricing exactly as it did. (nullable)
  Values:
  - `Percentage`: The card price is the cash price plus rate times the composed base. The reading of a configuration that names no mode.
  - `Fixed`: The card price is the cash price plus fixedAmount, the same amount on every payment the card price applies to, whatever its size.
- `rate` (number(double)): The card price uplift, stored as a fraction of the cash price (`0.04` is 4 percent). Read through `DualPricingRate`, the one place the fraction and the percent an operator types are converted, so the editor and the validator never disagree about what a value means. (nullable, greater than 0, max 0.10)
- `fixedAmount` (number(double)): The card price uplift in `Fixed` mode, in the merchant's currency (`2.50` adds 2.50 to every payment the card price applies to). Read only in that mode; the percentage mode reads `rate` alone. Bounded above by the platform ceiling `Merchants.DualPricing.MaxFixedAmount` (`DualPricingLimits`). (nullable, greater than 0, max 100.00)
- `includesShipping` (boolean): Whether the rate also applies to the shipping amount. Null reads as no: by default the card price uplift is computed on the cash price alone. A fixed amount does not depend on the base, so in `Fixed` mode the election is not read (`RateIncludesShipping`). (nullable)
- `treatAchAsCash` (boolean): Whether a bank (ACH) payment is charged the cash price. Null reads as yes. Only `true` is accepted at save: what a bank payment is charged when the merchant does not treat it as cash is an open product and legal decision, so the platform implements no outcome for it and refuses the election rather than guessing one. (nullable)
- `channels` ([DualPricingChannels](https://devportal.signapay-sbx.winkpg.io/docs/api/models/DualPricingChannels.md)): The channels the program applies to. Null reads as none, so the runtime applies the card price on no channel until at least one is chosen. Only `Supported` members are accepted at save. Values combine: send one or more member names separated by a comma and a space, or the integer sum of their values. Responses carry the names. (nullable)
  Values:
  - `None`: No channel.
  - `VirtualTerminal`: The merchant-operated Virtual Terminal.
  - `HostedPaymentPage`: The Hosted Payment Page, both forms, and the payment links that open it.
  - `Api`: Direct API integrations.
  - `DigitalWallet`: Digital wallet payments on the channels above.
  - `Invoicing`: Invoices: the invoice document states both prices, and an automatic charge of the balance and a payment link for the balance or a deposit are charged the card price. A partial payment (an installment or a payment link amount the payer chooses) is charged the cash price.
  - `RecurringBilling`: Recurring charges, from any source: a scheduled charge of a recurring contract, a merchant-initiated recurring or installment charge, a Hosted Payment Page enrollment's first payment, and a repeat or retry of any of these. A card is charged the card price only when the cardholder's stored-credential consent stated it, and never at a rate above the one the consent stated.
  - `SplitTender`: Split-tender legs: each payment of a split tender is priced on its own share of the order, a card charged the card price for its share and a cash or bank payment the cash price, while the group balance is kept in cash-price terms. A leg is still priced on the channel it arrived on (the Virtual Terminal or the API), so the merchant names that channel too.
  - `Terminal`: Card-present sales: a card read at a point of sale (a swipe, a chip read or a tap, or a declared card-present cardholder), whichever source submitted it. The payer saw the merchant's own signage, so naming this channel needs the merchant's attestation that both prices are posted at every card-present point of sale (terminalSignageAttested).
- `bothPricesPostedAttested` (boolean): The merchant's attestation that both prices are posted wherever it takes payment outside the platform's own surfaces (signage, menus, a card-present counter). Required before the program can be switched on. (nullable)
- `bothPricesPostedAttestedAt` (string(date-time)): When `bothPricesPostedAttested` was set. Server-owned: stamped by the merchant app service on the save that sets the attestation, carried forward unchanged after that, and cleared with it. (nullable, read only)
- `bothPricesPostedAttestedBy` (string): Who set `bothPricesPostedAttested`. Server-owned on the same terms as `bothPricesPostedAttestedAt`. (nullable, read only)
- `terminalSignageAttested` (boolean): The merchant's attestation that both prices are posted at every card-present point of sale: the counter signage a payer reads before handing over a card at a terminal, which no platform surface renders. Required to name `Terminal`, whatever the program switch, and read again by the decider, so a card-present sale is never charged the card price without it. Null reads as not attested. (nullable)
- `terminalSignageAttestedAt` (string(date-time)): When `terminalSignageAttested` was set. Server-owned on the same terms as `bothPricesPostedAttestedAt`. (nullable, read only)
- `terminalSignageAttestedBy` (string): Who set `terminalSignageAttested`. Server-owned on the same terms as `bothPricesPostedAttestedAt`. (nullable, read only)
- `displayCopyTemplate` (string): The merchant-editable price panel sentence. It must carry `{cashPrice}`, `{cardPrice}` and the mode's own token (`{rate}` in percentage mode, `{amount}` in fixed-amount mode) and no other brace-delimited placeholder (see `DualPricingDisplayCopy`). Null, or blank, means the platform default copy for the mode. Conditional: When IsConfigured(DisplayCopyTemplate) is true. (nullable, max length 1000)
- `configurationVersion` (integer(int32)): A counter bumped on every save that changes this configuration, so a decision recorded against a transaction can name the configuration it was computed under. Server-owned. (nullable, read only)
- `enabledChangedAt` (string(date-time)): When `enabled` last changed. Server-owned. (nullable, read only)
- `enabledChangedBy` (string): Who last changed `enabled`. Server-owned. (nullable, read only)

## See also

- [All documentation](https://devportal.signapay-sbx.winkpg.io/llms.txt): the machine-readable index of every public page on this site.
