App_fee_money accepted on payment link but never collected

I run a platform that onboards market organizers onto Square via OAuth. Sellers connect their own Square accounts and take booth fee payments from vendors. I want to collect a platform fee on those payments.

I’m creating payment links via POST /v2/online-checkout/payment-links using the seller’s OAuth access token, with app_fee_money in checkout_options:

{
  "idempotency_key": "...",
  "quick_pay": {
    "name": "Booth fee",
    "price_money": { "amount": 103, "currency": "USD" },
    "location_id": "<seller location>"
  },
  "checkout_options": {
    "app_fee_money": { "amount": 3, "currency": "USD" }
  }
}

Square-Version: 2024-07-17

The request succeeds and the response echoes the fee back in payment_link.checkout_options.app_fee_money with the amount I sent. The buyer completes payment by card and the seller receives the funds.

But no application fee ever appears in the balance of the Square account that owns the developer application. I’ve tested twice, with fees of $0.62 and $0.03, and checked Balance rather than Transactions.

My OAuth scopes include PAYMENTS_WRITE_ADDITIONAL_RECIPIENTS, granted before the seller connected. The seller’s account and my application’s account are separate.

Is app_fee_money supported on payment links created this way, or does collecting an application fee require the Payments API? And is there anything my application needs enabled before fees are collected?

Welcome to the Developer Forum!

app_fee_money is supported on Checkout API Payment Links. I know you already went through your diagnosis, but could you please check the following again?

  1. Confirm the completed Payment object includes app_fee_money.
  2. Confirm the OAuth token currently has PAYMENTS_WRITE_ADDITIONAL_RECIPIENTS using RetrieveTokenStatus. If that scope was added after the seller connected, they’ll need to reauthorize.
  3. Confirm the developer account that owns the app is activated to process/receive payments.
  4. Confirm the developer account and seller location use the same country/currency.
  5. For very small payments, make sure the app fee is within the app fee limits. For example, payments under $5 USD have a lower percentage cap.

If the issue still persists, please share your payment_id or payment_link_id and approximate timestamp so that I can take a further look.