Skip to content

Store ipp_channel from intent metadata and suppress IPP receipt for POS orders#11362

Open
staskus wants to merge 6 commits intodevelopfrom
woomob-2161-pos-payment-identification
Open

Store ipp_channel from intent metadata and suppress IPP receipt for POS orders#11362
staskus wants to merge 6 commits intodevelopfrom
woomob-2161-pos-payment-identification

Conversation

@staskus
Copy link

@staskus staskus commented Feb 16, 2026

Part of woocommerce/woocommerce#63322

Changes proposed in this Pull Request

This PR stores the ipp_channel value from Stripe PaymentIntent metadata as WooCommerce order meta and uses it to suppress WCPay's IPP receipt email for POS orders.

Context:
The mobile apps already send ipp_channel in Stripe PaymentIntent metadata with values:

  • mobile_pos: payment made from the POS mode in the mobile app
  • mobile_store_management: payment made from store management part of the mobile app

This metadata was previously only passed to Stripe, but not stored on the WooCommerce order. Storing it enables server-side identification of POS vs non-POS terminal payments.

Changes:

  1. New _wcpay_ipp_channel meta key in WC_Payments_Order_Service with set_ipp_channel_for_order() and get_ipp_channel_for_order() methods.
  2. Store ipp_channel in capture_terminal_payment() — after intent metadata is retrieved and before mark_terminal_payment_completed(), the ipp_channel value from the intent metadata is stored on the order. This keeps mark_terminal_payment_completed() unchanged and stores the value only when the actual intent metadata is available.
  3. Suppress WCPay's IPP receipt email for POS ordersWC_Payments_Email_IPP_Receipt::trigger() now returns early when _wcpay_ipp_channel is mobile_pos. POS orders are handled by the mobile app which manages its own receipt delivery. Orders with mobile_store_management or no ipp_channel still receive the IPP receipt email.

Note: Standard WooCommerce transactional email suppression (customer_completed_order, etc.) for POS is handled by WooCommerce core's PointOfSaleEmailHandler, not by this PR.

Testing instructions

  1. Create and pay for an order using the POS
  2. Verify the order has _wcpay_ipp_channel = mobile_pos meta
  3. Verify no WCPay IPP receipt email is sent for the POS order

  • 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

@staskus staskus added the type: enhancement The issue is a request for an enhancement. label Feb 16, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Feb 16, 2026

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 11362 or branch name woomob-2161-pos-payment-identification 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: b43f0a2
  • Build time: 2026-02-16 18:51:42 UTC

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

@github-actions
Copy link
Contributor

github-actions bot commented Feb 16, 2026

Size Change: 0 B

Total Size: 956 kB

ℹ️ 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 2.89 kB
release/woocommerce-payments/dist/blocks-checkout.css 2.89 kB
release/woocommerce-payments/dist/blocks-checkout.js 54.8 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 16.9 kB
release/woocommerce-payments/dist/cart.js 5.32 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.1 kB
release/woocommerce-payments/dist/chunks/express-checkout-previews.js 3.51 kB
release/woocommerce-payments/dist/express-checkout-rtl.css 367 B
release/woocommerce-payments/dist/express-checkout.css 367 B
release/woocommerce-payments/dist/express-checkout.js 17.4 kB
release/woocommerce-payments/dist/frontend-tracks.js 883 B
release/woocommerce-payments/dist/index-rtl.css 21.7 kB
release/woocommerce-payments/dist/index.css 21.7 kB
release/woocommerce-payments/dist/index.js 159 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.09 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 22.2 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.65 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.5 kB
release/woocommerce-payments/dist/settings-rtl.css 12.4 kB
release/woocommerce-payments/dist/settings.css 12.3 kB
release/woocommerce-payments/dist/settings.js 154 kB
release/woocommerce-payments/dist/subscription-edit-page.js 1.9 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.98 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.9 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 kB
release/woocommerce-payments/dist/wc-payments-review-prompt-rtl.css 1.66 kB
release/woocommerce-payments/dist/wc-payments-review-prompt.css 1.66 kB
release/woocommerce-payments/dist/wc-payments-review-prompt.js 14.9 kB
release/woocommerce-payments/dist/wc-payments-settings-spotlight-rtl.css 1.66 kB
release/woocommerce-payments/dist/wc-payments-settings-spotlight.css 1.66 kB
release/woocommerce-payments/dist/wc-payments-settings-spotlight.js 28.2 kB
release/woocommerce-payments/dist/woopay-direct-checkout.js 5.69 kB
release/woocommerce-payments/dist/woopay-express-button.js 22.9 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.9 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

@staskus staskus force-pushed the woomob-2161-pos-payment-identification branch from 3d96afd to b83bdb2 Compare February 16, 2026 15:07
@staskus staskus changed the title Add POS payment context meta and email suppression for terminal payments Add POS payment context meta and suppress WCPay IPP receipt for POS orders Feb 16, 2026
@staskus staskus force-pushed the woomob-2161-pos-payment-identification branch from 7d90529 to dd63bf1 Compare February 16, 2026 15:34
@staskus staskus changed the title Add POS payment context meta and suppress WCPay IPP receipt for POS orders Store ipp_channel from intent metadata and suppress IPP receipt for POS orders Feb 16, 2026
Move _wcpay_ipp_channel saving before update_order_status_from_intent()
so the POS flag is available when transactional emails fire during
status transitions.
- Add $this->get_order() call to set_ipp_channel_for_order() to match
  all other setters in WC_Payments_Order_Service
- Whitelist allowed ipp_channel values (mobile_pos, mobile_store_management)
  instead of storing arbitrary client-set Stripe metadata
- Pass explicit true to get_meta() in IPP receipt email for consistency
- Remove unnecessary comments in controller
Ensures the webhook path also persists ipp_channel before
update_order_status_from_intent() and send_customer_ipp_receipt_email(),
closing the race condition where webhook could fire before the REST
endpoint stores the meta.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

type: enhancement The issue is a request for an enhancement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant