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:
- Clover
Sale launches MerchantFacingTenderActivity.
- That tender activity stays alive and launches our internal POS UI as a sub-activity.
- The POS flow collects tip, creates a BTCPay invoice, waits for settlement, and then returns to the tender activity.
- 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
- Register a custom tender with
TenderConnector.checkAndCreateTender(...).
- Open Clover
Sale.
- Enter a base amount.
- Choose the custom tender.
- Inside the tender flow, collect a tip before creating the external payment/invoice.
- 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
- Observe Clover's native payment creation.
Latest clean reproduction
Base amount:
Tip:
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?
Summary
When a custom Clover tender is launched from the Clover
Saleapp and returns a successful tender result with both:clover.intent.extra.AMOUNT = subtotal + tipclover.intent.extra.TIP_AMOUNT = tipClover
Salestill 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:
SalelaunchesMerchantFacingTenderActivity.RESULT_OKback to CloverSalewith 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
Saleis not honoring the returned tip for this tender.Reproduction
TenderConnector.checkAndCreateTender(...).Sale.RESULT_OKfrom the tender activity with:Intents.EXTRA_AMOUNT = subtotal + tipIntents.EXTRA_TIP_AMOUNT = tipIntents.EXTRA_CLIENT_ID = external invoice idLatest clean reproduction
Base amount:
$15.00Tip:
$3.00Tender returned to Clover
Sale:AMOUNT = 1800TIP_AMOUNT = 300CLIENT_ID = Pu4N6MR6WEaoonPAxHwkQuClover
Saleaccepted the tender result and completed the payment flow.However, Clover's native
/cos/v1/payrequest still created the payment as:amount = 1500tipAmount = nullFinal Clover payment object also showed:
amount = 1500tipAmount = nullThe Clover order summary then showed:
total = 1500amount_paid = 1500BTCPayServerpaymentSo the flow completes successfully, but the tip is lost.
Expected behavior
If the tender returns:
AMOUNT = subtotal + tipTIP_AMOUNT = tipthen Clover
Saleshould either:Actual behavior
Clover
Salecompletes the sale, but still records only the base amount and dropstipAmount.Additional notes
We also observed in Clover's native payment payload that the custom tender is still treated as:
supportsTipOnTenderSelect = falseEven after updating the tender configuration to set
supportsTipping = true, CloverSalestill records the custom tender payment as base-only.Question
Is tip propagation from a custom external tender back into Clover
Saleexpected 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?