Skip to content

Custom tender returned from Clover Sale ignores EXTRA_TIP_AMOUNT and records base amount only #130

@BuffaloDyl

Description

@BuffaloDyl

Summary

When a custom Clover tender is launched from the Clover Sale app and returns a successful tender result with both:

  • clover.intent.extra.AMOUNT = subtotal + tip
  • clover.intent.extra.TIP_AMOUNT = tip

Clover Sale still records the payment as the base amount only and drops the tip from the final Clover payment record.

Important context

We are using the Clover-supported custom tender flow and keeping the tender activity alive through completion.

In our latest reproduction:

  1. Clover Sale launches MerchantFacingTenderActivity.
  2. That tender activity stays alive and launches our internal POS UI as a sub-activity.
  3. The POS flow collects tip, creates a BTCPay invoice, waits for settlement, and then returns to the tender activity.
  4. The tender activity returns RESULT_OK back to Clover Sale with the final Clover tender extras.

So this is not the earlier "launch another app and return canceled" pattern. The tender contract is completing successfully.

We are open to the possibility that we may still be using the wrong methodology for tip-capable custom tenders, but based on current testing it appears that Clover Sale is not honoring the returned tip for this tender.

Reproduction

  1. Register a custom tender with TenderConnector.checkAndCreateTender(...).
  2. Open Clover Sale.
  3. Enter a base amount.
  4. Choose the custom tender.
  5. Inside the tender flow, collect a tip before creating the external payment/invoice.
  6. After settlement, return RESULT_OK from the tender activity with:
    • Intents.EXTRA_AMOUNT = subtotal + tip
    • Intents.EXTRA_TIP_AMOUNT = tip
    • Intents.EXTRA_CLIENT_ID = external invoice id
  7. Observe Clover's native payment creation.

Latest clean reproduction

Base amount:

  • $15.00

Tip:

  • $3.00

Tender returned to Clover Sale:

  • AMOUNT = 1800
  • TIP_AMOUNT = 300
  • CLIENT_ID = Pu4N6MR6WEaoonPAxHwkQu

Clover Sale accepted the tender result and completed the payment flow.

However, Clover's native /cos/v1/pay request still created the payment as:

  • amount = 1500
  • tipAmount = null

Final Clover payment object also showed:

  • amount = 1500
  • tipAmount = null

The Clover order summary then showed:

  • total = 1500
  • amount_paid = 1500
  • one BTCPayServer payment

So the flow completes successfully, but the tip is lost.

Expected behavior

If the tender returns:

  • AMOUNT = subtotal + tip
  • TIP_AMOUNT = tip

then Clover Sale should either:

  • create the final payment with the full amount and tip, or
  • otherwise preserve the tip in the resulting Clover payment/reporting data.

Actual behavior

Clover Sale completes the sale, but still records only the base amount and drops tipAmount.

Additional notes

We also observed in Clover's native payment payload that the custom tender is still treated as:

  • supportsTipOnTenderSelect = false

Even after updating the tender configuration to set supportsTipping = true, Clover Sale still records the custom tender payment as base-only.

Question

Is tip propagation from a custom external tender back into Clover Sale expected to work in this scenario?

If yes, what is the correct supported integration pattern for a custom tender that needs to return both total amount and tip?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions