Skip to content

fix: amazon pay fee calculations#11593

Draft
frosso wants to merge 9 commits intodevelopfrom
fix/amazon-pay-fee-calculations
Draft

fix: amazon pay fee calculations#11593
frosso wants to merge 9 commits intodevelopfrom
fix/amazon-pay-fee-calculations

Conversation

@frosso
Copy link
Copy Markdown
Contributor

@frosso frosso commented Apr 14, 2026

Fixes WOOPMNT-6097

Changes proposed in this Pull Request

For non-card Amazon Pay transactions (SEPA, BNPL, etc.), the fee shown across the order and transaction surfaces didn't match the amount actually deducted from the merchant's payout. This PR updates the merchant-facing displays to show the correct fee.

  • Order-page "Transaction Fee" row, timeline, fees-breakdown panel, and order notes now surface the accurate processing fee.
  • Net payout uses store-side amounts when the timeline's captured event carries fee_refunded: true.
  • Webhook processing writes $0 fee/net meta values when the payload carries them (previously skipped by a truthy check, leaving stale values in place).
  • The checkout redirect writes $0 up front for non-card Amazon Pay so the order page doesn't briefly display a stale value.
  • The fee-breakdown order note is scheduled 15 s after capture so the final fee data is available when the note is built.

Regular card payments and card-funded Amazon Pay should remain unaffected.

Testing instructions

Use in combination with the server-side PR (#211501 - or get it from the Linear issue)


  • Run npm run changelog to add a changelog file, choose patch to leave it empty if the change is not significant. You can add multiple changelog files in one PR by running this command a few times.
  • Covered with tests (or have a good reason not to test in description ☝️)
  • Tested on mobile (or does not apply)

Post merge

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 14, 2026

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 11593 or branch name fix/amazon-pay-fee-calculations in your-test.site/wp-admin/admin.php?page=jetpack-beta&plugin=woocommerce-payments

Option 2. Jurassic Ninja - available for logged-in A12s

🚀 Launch a JN site with this branch 🚀

ℹ️ Install this Tampermonkey script to get more options.


Build info:

  • Latest commit: 6efbc37
  • Build time: 2026-04-17 13:04:58 UTC

Note: the build is updated when a new commit is pushed to this PR.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 14, 2026

Size Change: +94 B (0%)

Total Size: 963 kB

Filename Size Change
release/woocommerce-payments/dist/index.js 153 kB +94 B (0%)
ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.46 kB
release/woocommerce-payments/assets/css/admin.rtl.css 1.46 kB
release/woocommerce-payments/assets/css/success.css 1.06 kB
release/woocommerce-payments/assets/css/success.rtl.css 1.06 kB
release/woocommerce-payments/dist/blocks-checkout-rtl.css 3.25 kB
release/woocommerce-payments/dist/blocks-checkout.css 3.25 kB
release/woocommerce-payments/dist/blocks-checkout.js 56.6 kB
release/woocommerce-payments/dist/cart-block-rtl.css 113 B
release/woocommerce-payments/dist/cart-block.css 112 B
release/woocommerce-payments/dist/cart-block.js 17.4 kB
release/woocommerce-payments/dist/cart.js 5.15 kB
release/woocommerce-payments/dist/checkout-rtl.css 1.01 kB
release/woocommerce-payments/dist/checkout.css 1.01 kB
release/woocommerce-payments/dist/checkout.js 34.9 kB
release/woocommerce-payments/dist/chunks/express-checkout-previews.js 3.52 kB
release/woocommerce-payments/dist/express-checkout-rtl.css 377 B
release/woocommerce-payments/dist/express-checkout.css 377 B
release/woocommerce-payments/dist/express-checkout.js 19.3 kB
release/woocommerce-payments/dist/frontend-tracks.js 868 B
release/woocommerce-payments/dist/index-rtl.css 21.5 kB
release/woocommerce-payments/dist/index.css 21.5 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.09 kB
release/woocommerce-payments/dist/multi-currency-async-renderer-rtl.css 344 B
release/woocommerce-payments/dist/multi-currency-async-renderer.css 344 B
release/woocommerce-payments/dist/multi-currency-async-renderer.js 8.1 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 3.82 kB
release/woocommerce-payments/dist/multi-currency-switcher-block.js 19.2 kB
release/woocommerce-payments/dist/multi-currency.css 3.83 kB
release/woocommerce-payments/dist/multi-currency.js 25.5 kB
release/woocommerce-payments/dist/order-rtl.css 740 B
release/woocommerce-payments/dist/order.css 740 B
release/woocommerce-payments/dist/order.js 21.7 kB
release/woocommerce-payments/dist/plugins-page-rtl.css 484 B
release/woocommerce-payments/dist/plugins-page.css 484 B
release/woocommerce-payments/dist/plugins-page.js 2.64 kB
release/woocommerce-payments/dist/product-details-rtl.css 433 B
release/woocommerce-payments/dist/product-details.css 436 B
release/woocommerce-payments/dist/product-details.js 12.9 kB
release/woocommerce-payments/dist/settings-rtl.css 13.1 kB
release/woocommerce-payments/dist/settings.css 13 kB
release/woocommerce-payments/dist/settings.js 154 kB
release/woocommerce-payments/dist/subscription-edit-page.js 2 kB
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 527 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 527 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 1.95 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 730 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 1.87 kB
release/woocommerce-payments/dist/success.js 6.03 kB
release/woocommerce-payments/dist/tos-rtl.css 235 B
release/woocommerce-payments/dist/tos.css 235 B
release/woocommerce-payments/dist/tos.js 3.15 kB
release/woocommerce-payments/dist/wc-payments-review-prompt-rtl.css 1.68 kB
release/woocommerce-payments/dist/wc-payments-review-prompt.css 1.68 kB
release/woocommerce-payments/dist/wc-payments-review-prompt.js 14.5 kB
release/woocommerce-payments/dist/wc-payments-settings-spotlight-rtl.css 1.68 kB
release/woocommerce-payments/dist/wc-payments-settings-spotlight.css 1.68 kB
release/woocommerce-payments/dist/wc-payments-settings-spotlight.js 27.9 kB
release/woocommerce-payments/dist/woopay-direct-checkout.js 5.58 kB
release/woocommerce-payments/dist/woopay-express-button.js 22.1 kB
release/woocommerce-payments/dist/woopay-rtl.css 4.27 kB
release/woocommerce-payments/dist/woopay.css 4.25 kB
release/woocommerce-payments/dist/woopay.js 70.7 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 625 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 814 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.46 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/jetpack-script-data.js 880 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.02 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/script-data.js 69 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/babel.config.js 163 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.css 2.46 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.js 14.3 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.rtl.css 2.46 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.css 10.1 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.js 31.5 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-connection.rtl.css 10.1 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.js 280 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.rtl.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.css 625 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.js 331 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.rtl.css 626 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-users.js 415 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-users-connection.js 159 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-ajax.js 520 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-callables.js 585 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.css 218 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.css 719 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.js 412 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-users.js 625 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.04 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-empty-state.css 294 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-order-statuses.css 408 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin.css 3.59 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/checkout.css 301 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/modal.css 746 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/view-subscription.css 574 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/wcs-upgrade.css 414 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin-pointers.js 543 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js 9.4 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.js 6.78 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.min.js 3.84 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-coupon.js 545 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-subscription.js 2.52 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.js 22.2 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.min.js 11.7 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/payment-method-restrictions.js 1.29 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/wcs-meta-boxes-order.js 507 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/payment-methods.js 358 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/single-product.js 428 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/view-subscription.js 1.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/wcs-cart.js 782 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/modal.js 1.09 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/wcs-upgrade.js 1.26 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.css 391 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.js 3.04 kB

compressed-size-action

fee_exchange_rate?: TimelineFeeExchangeRate;
tax?: TimelineFeeTax;
before_tax?: TimelineFeeTax;
fee_refunded?: boolean;
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Server sets fee_rates.fee_refunded: true on refunded captured events.

Comment on lines +21 to +23
if ( event.fee_rates.fee_refunded ) {
return null;
}
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Server zeros percentage/fixed/history/before_tax/tax.
Without the guard, the component would render a nonsensical "0% + $0.00 = total" breakdown.

Image

// Only set transaction fee if the charge was actually captured.
// Canceled authorizations should not have fees since no payment was processed.
if ( $charge && null !== $charge->get_application_fee_amount() && $charge->is_captured() ) {
// Non-card Amazon Pay transactions have the application fee refunded
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Server zeros application_fee_amount in the forwarded webhook. Without these, the client silently ignores the zeroed value and the order-page meta stays at its pre-refund amount.

Image

}

$lines[] = $this->compose_fee_string();
$fee_rates = $this->captured_event['fee_rates'] ?? [];
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tweaking the order note to make sure it shows the correct fee

Image

@frosso frosso requested a review from Copilot April 16, 2026 21:01
@frosso frosso self-assigned this Apr 16, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adjusts how WooPayments records and displays fees for Amazon Pay transactions, particularly when the application fee is later refunded server-side (non-card funding), so merchants don’t see misleading fee/net values.

Changes:

  • Record _wcpay_transaction_fee as 0 upfront for Amazon Pay non-card funding, and backfill it later from the timeline’s store_fee once settled.
  • Ensure webhook processing persists fee/net meta even when the fee amount is 0 (avoid falsy checks skipping updates).
  • Update admin timeline/UI rendering to suppress standard fee breakdown for refunded-fee events and optionally show “Stripe processing fee” once available.

Reviewed changes

Copilot reviewed 7 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tests/unit/test-class-wc-payments-order-service.php Adds unit tests for Amazon Pay fee behavior and backfilling logic.
includes/class-wc-payments-webhook-processing-service.php Fixes fee/net meta updates when application fee amount is zero.
includes/class-wc-payments-order-service.php Implements Amazon Pay upfront fee=0 behavior, backfill from timeline, and delays fee breakdown note job.
includes/class-wc-payments-captured-event-note.php Adjusts captured-event note rendering for refunded-fee events (Stripe processing fee + net).
client/payment-details/transaction-breakdown/fees-breakdown/index.tsx Hides fee breakdown UI when fee is refunded.
client/payment-details/timeline/map-events.js Updates timeline mapping to handle refunded-fee events and display Stripe processing fee when available.
client/data/timeline/types.d.ts Adds fee_refunded to timeline fee rate typings.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread tests/unit/test-class-wc-payments-order-service.php Outdated
Comment thread tests/unit/test-class-wc-payments-order-service.php Outdated
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants