We are looking into building an app which would required Payment Pre-authorization like Try Now Pay Later or pre-authorisation before purchasing a product, for Plus Stores using Shopify Payments, We found orderCreateMandatePayment - GraphQL Admin; this seems to be exactly what we would need to charge a customer; however, this is restricted to Plus merchants only, What are the alternatives for a Normal store and do we need to be a Payment App or Sales channel app to be able tp pre-authoize a payment and charge later?
Hey @Kets_Patel - thanks for reaching out.
I did some digging here and for Try Before You Buy or pre-order flows, the supported path is the deferred purchase option model. In that flow, the app creates the pre-order or TBYB selling plan, checkout stores the customer’s payment method, and Shopify creates a PaymentMandate. A mandate is the payment method plus the customer’s permission for the merchant to debit it later. It isn’t a payment-provider authorization hold, so funds aren’t reserved during the deferral period.
When the balance is due, your app uses orderCreateMandatePayment to start a new payment attempt against that vaulted method, and the app needs to handle declines or payment failures:
If you’re looking for a pre-authorization flow where funds are held now and captured later, that follows the normal payment authorization window. With Shopify Payments, the standard authorization period is 7 days, and extended authorization periods are available only on Shopify Plus for certain payment methods. That model isn’t a fit for a long Try Now Pay Later flow on a non-Plus store:
https://help.shopify.com/en/manual/payments/payment-authorization
orderCreateMandatePayment itself isn’t Plus-only. The Plus-only part mentioned in the mutation docs is the amount field. On non-Plus, omit amount and collect the remaining balance for the deferred order when a valid mandate exists; the amount argument for a custom or partial amount requires Plus: orderCreateMandatePayment - GraphQL Admin
You don’t need to be a Payment App or Sales Channel app for this path. On scopes, two different ones do two jobs: creating the pre-order/TBYB selling plan uses write_purchase_options (a standard scope, no approval step), and reading and charging the mandate uses read_payment_mandate and write_payment_mandate. Note that the payment-mandate scopes are approval-gated: unlike write_purchase_options, you can’t just declare write_payment_mandate in your app config and have it. You request it through your Partner Dashboard and Shopify determines whether the app is granted approval.
Hope this helps clarify things and let me know if you have any questions!
Thanks @Wes-Dev-Shopify for the detailed explanation. This, I think, will work for our use case. I have a follow-up question: Suppose we would like to check if the customer has stored payment details on the store and, if not, prompt them (I suppose via a Shopify standard page) to enter payment details, it this something allowed or possible?
Hey @Kets_Patel - happy to help!
In the pre-order/TBYB flow, the customer’s payment details should be collected during the initial checkout, and Shopify creates the stored payment method/mandate from that checkout. Your app can then read the available saved payment methods/mandates with the relevant access scopes, but the mandate itself is not something the app creates separately after checkout: PaymentMandate - GraphQL Admin
If the stored payment method is no longer valid, the recovery path is to have the customer update the existing payment method through Shopify’s secure payment method update flow, such as through the Send link to update card or Replace card options in the customer profile, or to collect the outstanding balance by sending an invoice/payment request for the original order. For an existing order, the Admin API has orderInvoiceSend, and in the admin the merchant can use the order’s Collect payment / Send invoice flow so the customer can enter payment details and submit payment for that order. Here’s the relevant docs for reference:
- https://help.shopify.com/en/manual/products/purchase-options/pre-orders/manage-pre-orders
- orderInvoiceSend - GraphQL Admin
- https://help.shopify.com/en/manual/fulfillment/managing-orders/payments/deferred-payments
Let me know if you have any other questions!