> ## Documentation Index
> Fetch the complete documentation index at: https://developers.nova.money/llms.txt
> Use this file to discover all available pages before exploring further.

# Offer One-Click Upsells After a Successful Checkout

> Use Nova.Pay upsell offers to charge customers an additional product after checkout, using their saved payment method — no card re-entry required.

After a successful checkout, Nova.Pay can offer the customer an additional product — an upsell — charged to the same saved payment method with a single click. The customer does not need to re-enter their card details or go through a new checkout flow, making this a frictionless way to increase revenue per transaction.

***

## How It Works

<Steps>
  <Step title="Customer Completes Checkout">
    The customer submits a payment via `POST /payments` as described in the [Create a Payment guide](/guides/create-payment). Nova.Pay processes the charge and returns a `PaymentResult` object.
  </Step>

  <Step title="Check for an Upsell Offer">
    If the checkout page has an upsell product configured **and** the payment was successful, the `PaymentResult` response will include an `offer` field. This value is a signed GlobalID (SGID) — a time-limited, single-use token that authorises the upsell charge.

    ```json theme={null}
    {
      "order_status": "paid",
      "payments": ["ch_abc123"],
      "offer": "eyJfcmFpbHMiOnsibWVzc2FnZSI6Ik1RPT0iLCJleHAiOiIyMDI..."
    }
    ```

    If `offer` is absent from the response, either the checkout page has no upsell configured or the payment did not succeed.
  </Step>

  <Step title="Present the Upsell in Your UI">
    Display the upsell offer to the customer immediately after payment confirmation — for example, in a modal or a dedicated confirmation page section. Show the product name, price, and a clear call-to-action button.

    <Warning>
      The `offer` SGID is **single-use and time-limited**. Do not cache it or delay presenting it to the customer. Once expired or used, the token cannot be reused and a new checkout must be initiated.
    </Warning>
  </Step>

  <Step title="Submit the Upsell if the Customer Accepts">
    If the customer clicks the upsell call-to-action, POST the `offer` SGID to the `/upsell` endpoint. Nova.Pay charges the original payment method on file — no additional card data is required.

    **Endpoint:** `POST /upsell`

    <Note>
      The `POST /upsell` endpoint is **not** host-restricted. You can call it from your server or directly from the customer's browser.
    </Note>

    ```bash theme={null}
    curl -X POST "https://pay.nova.money/api/v1/upsell" \
      -H "Content-Type: application/json" \
      -d '{
        "offer": "eyJfcmFpbHMiOnsibWVzc2FnZSI6...",
        "meta": { "source": "upsell_modal" }
      }'
    ```

    The `meta` object is optional and can carry any key-value pairs you want to associate with this upsell event (e.g. UI placement, A/B test variant).
  </Step>
</Steps>

***

## Upsell Response Fields

A successful `POST /upsell` call returns an `UpsellResult` object.

<ResponseField name="order_status" type="string" required>
  Status of the upsell order (e.g. `"paid"`, `"pending"`, `"refused"`). Handle `"refused"` gracefully — the customer's card may have been declined for the additional charge.
</ResponseField>

<ResponseField name="payments" type="array">
  Array of gateway-level payment IDs created for the upsell order.
</ResponseField>

<ResponseField name="bank_slip_url" type="string">
  URL to the generated boleto PDF for the upsell order. Present only if the original order was paid via boleto.
</ResponseField>

<ResponseField name="pix_qr_code" type="string">
  Base64-encoded Pix QR code image for the upsell order. Present only if the original order was paid via Pix.
</ResponseField>

<ResponseField name="pix_qr_code_url" type="string">
  Hosted URL for the Pix QR code image of the upsell order. Present only if the original order was paid via Pix.
</ResponseField>

<ResponseField name="pix_expires_at" type="string">
  ISO 8601 timestamp indicating when the upsell Pix QR code expires. Present only if the original order was paid via Pix.
</ResponseField>


## Related topics

- [Upsell API — Confirm One-Click Post-Purchase Offers](/api-reference/upsell.md)
- [Nova.Pay Checkout Flow: Pages, Carts, and Charge Links](/concepts/checkout-flow.md)
- [Create and Process Your First Payment with Nova.Pay](/guides/create-payment.md)
- [Nova.Pay API: Payments, Checkout & Order Management](/introduction.md)
- [Webhooks API — Handle Payment Gateway Event Callbacks](/api-reference/webhooks.md)
