Stripe, wired in so every payment reconciles
Stripe Checkout or the Payment Element, subscriptions and invoices, wallets, 3-D Secure, tax settings and webhooks that update your orders reliably. Card data stays on Stripe's side. I test failed payments and refunds before go-live. From €690.
- CheckoutThe customer presses Pay €43.90. The Payment Element sends the test card straight to Stripe; your server never sees the number.
- StripeThe PaymentIntent pi_test_3PqR8 moves from processing to succeeded.
- Your siteThe return page says "Thanks, confirming your payment" but does not mark the order paid: redirects get missed, reloaded or faked.
- Webhookpayment_intent.succeeded reaches /webhooks/stripe. Signature checked, event stored, 200 returned in 142 ms.
- OrderTEST-1042 is set to Paid by the webhook, and the payment id pi_test_3PqR8 is saved on the order for reconciliation.
- EmailOne receipt goes to [email protected] and stock is reduced once.
Paid, reconciled, one receipt. The order changed only when the signed webhook arrived.
Wire this into my sitePICK A TEST OUTCOME
TEST MODEno real money moves
- Wool socks, 2 pairs€38.00
- Shipping€5.90
Paid by webhook evt_test_1042a. Payment id saved.
POST /webhooks/stripe
evt_test_1042a payment_intent.succeeded
200 OK in 142 ms
Stripe's published test cards: 4242 for success, 0002 for a generic decline, 3184 for a card that always asks for 3-D Secure. Event and payment ids here are made up and only look like test ids. Nothing on this page connects to Stripe.
Five stations between Stripe and your order table
The webhook is the only message that reliably says "this payment happened". Every one I build passes through the same five stations. Send a delivery through and watch what each station does.
Event received
passedPOST from Stripe: evt_test_7Hn2, type payment_intent.succeeded.
Signature checked
passedThe Stripe-Signature header matches the endpoint secret and the timestamp is fresh.
Stored
passedSaved to a webhook_events table before any work starts.
Processed once
passedOrder TEST-1042 set to Paid, event id marked done.
Retried if it fails
not neededNot needed: the endpoint answered 200 in 120 ms.
12:00:01 POST /webhooks/stripe evt_test_7Hn2
payment_intent.succeeded
12:00:01 signature ok, stored
12:00:01 order TEST-1042 -> paid
12:00:01 200 OK 120 ms
One event, one order update, one receipt.
IDEMPOTENCY, IN TWO SENTENCES
Stripe can deliver the same event more than once, so the handler records each event id and does nothing the second time it sees one. In the other direction, every refund or charge request my code sends carries an idempotency key, so a retried request still happens only once.
Retry behaviour follows Stripe's webhook documentation at the time of writing (in live mode, failed deliveries are retried with growing gaps for up to three days). Check the provider's current pages.
Checkout, Payment Element or Payment Links
Three ways to put Stripe on a site. I recommend one in the quote, with the reason in writing.
| compare | CheckoutStripe-hosted or embedded page | Payment Elementfields inside your own checkout | Payment Linksa link or QR code |
|---|---|---|---|
| Where it lives | A payment page run by Stripe, opened from your cart or embedded in it. | Your page and layout; Stripe supplies the secure fields. | A shareable link. No code on your site. |
| Build effort | Lowest: configuration, branding and webhooks. | Highest: your page, confirmation and return handling. | Minutes, in the Stripe dashboard. |
| Card data on your server | No. It stays with Stripe. | No. The fields are Stripe frames. | No. |
| Subscriptions | Yes, in subscription mode. | Yes, with Stripe Billing. | Yes, for simple recurring prices. |
| Webhooks still needed | Yes, to mark orders paid. | Yes, to mark orders paid. | Yes, if anything should happen automatically. |
| Best for | Most stores and sign-ups that want speed and fewer moving parts. | Custom checkouts where the steps and design matter. | A few products, deposits or invoices without a store. |
Summary of Stripe's own documentation at the time of writing. Payment methods shown at checkout depend on your account settings, country and the customer's device. Check the provider's current pages.
What the integration covers
Set up in test mode first, then switched to live keys once every failure case behaves.
Checkout or Payment Element
The right surface for your site, styled to match, with the return page handled so a reload never charges twice.
Wallets
Apple Pay and Google Pay where your account and customers support them, including registering your domain so the buttons appear.
3-D Secure
Strong customer authentication for UK and EU cards, tested with challenge cards on phone and desktop, in-app browsers included.
Subscriptions and invoices
Plans, trials, proration, the customer portal and failed-payment emails, with access on your site following invoice events.
Tax settings
Stripe Tax configured to the registrations you tell me about. Which ones you need is a question to confirm with your accountant.
Refunds and reconciliation
Refunds from your store reach Stripe and back, and payouts match orders through the payment id saved on each one.
Tell me where Stripe needs to plug in. You get a fixed price tomorrow.
Get a Stripe quoteFrom test keys to the first real payout
Usually one to two weeks for a plugin set-up, longer for custom code. owner to confirm
- 1
Access
You own the Stripe account. I join as a team member with a developer role. No passwords by email.
- 2
Build in test mode
Test keys, a test webhook endpoint and the Stripe CLI forwarding events to staging.
- 3
Failure drill
Declines, 3-D Secure, a refund, a test dispute, a replayed webhook and a duplicate one.
- 4
Go live
Live keys stored on the server, a live endpoint with its own signing secret, one small real payment refunded.
- 5
First payouts
I check webhook deliveries and the first payouts against orders, then hand over written notes.
Packages
Prices in euros, excluding VAT 25.5 %. Stripe's own fees are between you and Stripe and depend on your contract; I never add to them.
Plugin set-up
- Stripe on WooCommerce, Magento or OpenCart through the maintained extension
- Wallets and 3-D Secure checked
- Webhook endpoint verified with a test event
- Failure drill and handover notes
Custom integration
- Checkout or Payment Element in your own code
- Idempotent webhook handler with an event log
- Refunds and disputes flowing into your orders
- Daily payments-to-orders check
Subscriptions and billing
- Plans, trials and proration
- Customer portal for cards and cancellations
- Invoices and failed-payment emails
- Access on your site driven by invoice events
Extra work at €95 an hour. If the integration does not pass the failure drill in test mode, it does not go live and you do not pay the balance. owner to confirm
When I would not recommend Stripe
Stripe is a strong default, not the answer to every checkout.
- 01Most of your buyers are in Finland and expect online bank buttons. Compare a Finnish provider first: Finnish payment methods.
- 02Your bank or acquirer already requires another gateway. Then Worldpay integration or your existing provider is the shorter path.
- 03You sell a handful of things. Payment Links on their own may be enough, and you do not need a developer to set them up.
Questions about Stripe
Checkout or Payment Element: which should I use?
Use Checkout unless the payment step must sit inside your own page design. Checkout is a Stripe-hosted page that needs less code and picks up new payment methods with little work. The Payment Element lives inside your checkout and gives full control over layout and steps, at the cost of more code to build and maintain.
Can Stripe handle subscriptions and invoices?
Yes. Stripe Billing handles recurring plans, trials, upgrades with proration and one-off invoices, and a hosted customer portal lets subscribers update cards or cancel. I connect it to your site so access and orders follow webhook events such as invoice.paid and invoice.payment_failed, rather than whatever page the customer happened to land on.
How do you make sure webhooks never lose an order?
Each event is verified by its signature, saved before any work starts and processed once by its event id, so a repeat delivery changes nothing. The endpoint answers fast and does slow work afterwards, so Stripe's retries cover outages. A daily check compares Stripe payments with orders and flags any that do not match.
Get a Stripe quote
Your platform, what you sell and whether you need subscriptions. You get a written fixed price within one working day.
Pikselipolku is an independent studio and is not affiliated with Stripe, PayPal, Worldpay, Klarna, Paytrail or any other provider named here.
Or email [email protected]
Also: Shopify developer and store setup. Card data never touches Pikselipolku: you contract with the provider and it holds the card details.