I’m working on a Shopify store that uses a custom-coded booking form. The store offers services by appointment, and the requirement is that users must provide their credit card at the time of booking, without being charged immediately, but with the possibility of charging a penalty fee if they don’t show up.
Is it possible to implement this within Shopify without using external apps, considering the form is already custom coded?
Has anyone implemented something similar, maybe by integrating Stripe with pre-authorization on the front end?
Any technical guidance or experience would be much appreciated.
As far as I know, what you’re looking to do isn’t possible on Shopify using only the official APIs. I know this because I had to custom-code it myself for my own app, Cowlendar Booking.
Here are the main approaches you could consider:
Prepayment system : Let customers pay, for example, 50% upfront and automatically charge the remaining 50% later. This can be done using Shopify’s Draft Orders or Selling Plans, but it’s slightly different from what you’re asking for.
Deposit system : Charge customers in advance and, if needed, refund them later (e.g., if they show up). This isn’t automatic and would require manual refunds. It’s often used to cover no-shows, but it’s not a true “only charge if no-show” system.
Best of luck to you and since i’m curious…can I see the booking form you’ve coded?
What you’re describing is essentially a card authorization (hold) without capture, similar to what hotels or rental car companies do.
Shopify’s built-in payment system doesn’t natively support this for arbitrary “off-cart” scenarios — meaning you can’t just grab a card from a custom form and later charge it without either:
Going through Shopify’s checkout flow (which normally authorizes + captures automatically unless you switch to manual capture for orders)
Or using an off-Shopify payment processor (e.g., Stripe) that you control directly.
Why Shopify alone can’t fully do this
Shopify Payments / Checkout
Shopify lets you authorize without capture if you change your payment settings to Manually capture payment for orders in the admin.
But this only works for orders placed via Shopify checkout — you can’t just run a standalone form outside of checkout and store the card token.
PCI compliance
You can’t collect raw card details yourself in a Shopify-hosted page — that’s a PCI violation.
You need to use a PCI-compliant provider’s hosted fields or payment element to tokenize the card.
Two common technical approaches
1. Use Shopify checkout with manual capture
In Shopify admin: Settings → Payments → Payment capture → Manually capture payment for orders.
Your custom booking form would:
Create a hidden Shopify product “Booking placeholder”
Add it to cart and redirect to checkout
Customer enters card details → Shopify authorizes the amount → Order is created in “Authorized” state
You can capture a partial or full amount later (e.g., a no-show fee) from the Shopify admin or API.
Pros: PCI handled by Shopify, no extra gateway setup.
Cons: Still creates an “order” in Shopify for each booking, which may not match your UX.
2. Use Stripe directly for card pre-auth
Your custom form integrates Stripe Elements or Payment Element.
On submit:
Call stripe.paymentIntents.create with capture_method: 'manual' and the booking amount (or a nominal amount, like $1).
This holds funds on the card without charging them.
Later, if they no-show, capture the payment via Stripe’s API or dashboard.
If they show up, you release the hold (Stripe does it automatically if you don’t capture in time — up to 7 days for most cards).
Pros: Full control over booking UX, no Shopify checkout.
Cons: Payments are outside Shopify — sales won’t show up in Shopify reports automatically unless you sync them.
Recommendation if you want inside Shopify and no third-party app
The closest you can get without external apps or leaving Shopify’s PCI compliance umbrella is:
Turn on manual capture in Shopify payments.
Have your custom booking form:
Create a draft order via Shopify Admin API
Redirect the customer to checkout for payment authorization
Store booking details in metafields or an external DB linked to the draft order ID.
Capture the payment later only if needed.
If you want a seamless front-end only experience and no checkout redirect, you’ll need Stripe (or similar) with direct integration — but that means the payment is outside Shopify.