What is payment processing?
Payment processing lets your app accept money from users — credit and debit cards, Apple Pay, Google Pay, and saved payment methods. For one-off or ad-hoc payments (as opposed to recurring subscriptions), this means capturing a payment amount, showing a checkout UI, processing the charge, and confirming the result to both the user and your system.
Stripe is the dominant payment gateway for Australian startups and software products. Its developer experience is excellent, it handles PCI DSS compliance (so you're not storing raw card data), and it supports Australian payment methods well. Stripe charges approximately 1.7% + 30¢ per domestic card transaction for Australian accounts — lower than many alternatives.
For Australian apps, there are also local alternatives: Pin Payments (Sydney-based, simple API), eWAY (widely used in retail and e-commerce), and Tyro (strong in hospitality and healthcare, with EFTPOS integration). These are worth considering if Stripe's pricing doesn't suit your volume or if you need specific local integrations.
When does your app need it?
- Your app involves commerce — users buy something, book a service, or pay a fee
- You charge customers on a per-transaction basis rather than a recurring subscription
- You want to accept Apple Pay and Google Pay to reduce payment friction on mobile
- You need to store payment methods for future charges (e.g., charging after a service is delivered)
- You need to issue refunds programmatically, not manually through a payment dashboard
- You're replacing a manual invoicing process with in-app payments
How much does it cost?
Adding one-off payment processing typically adds 5–11 hours of development — roughly $1,000–$2,000 AUD.
At the lower end: using Stripe Checkout — a hosted payment page that Stripe provides. You create a checkout session server-side, redirect the user to Stripe's hosted page, and handle the success/cancel redirect. Stripe handles the card UI, Apple Pay, Google Pay, and validation. Fast to build, limited branding.
At the higher end: a custom payment UI embedded in your app using Stripe Elements or Payment Element, saved payment methods, Apple Pay and Google Pay with domain verification, refund logic, webhook handling for asynchronous payment events (failed charges, disputes), and a payment history view for users. Webhooks in particular need careful implementation — Stripe sends events asynchronously and your app must handle them idempotently.
How it's typically built
Stripe Checkout (hosted): create a Checkout Session server-side with line items and pricing, return the session URL to the client, redirect the user. Stripe handles everything. On completion, Stripe redirects to your success URL and sends a checkout.session.completed webhook.
Stripe Payment Element (embedded): renders a complete payment form inside your app using a pre-built React component. Supports cards, Apple Pay, Google Pay, and local payment methods. Your server creates a PaymentIntent, the client confirms it using the Payment Element, and the result is verified server-side.
Webhooks are essential: network failures mean the user's browser may not always reach your success page. Webhooks ensure your database reflects the actual payment outcome regardless of what the browser does. Every Stripe integration should handle payment_intent.succeeded and payment_intent.payment_failed at minimum.
Apple Pay / Google Pay work automatically with the Payment Element on eligible devices. On the web, Apple Pay requires domain verification (a file served from your domain). On iOS native apps, this is handled through Stripe's iOS SDK.
Questions to ask your developer
- Stripe Checkout (hosted) or Payment Element (embedded)? Hosted is faster and simpler; embedded matches your app's look and feel. Which fits your priorities?
- How are webhooks handled? Payments confirmed by webhooks should be idempotent — processing the same webhook twice shouldn't create duplicate records.
- Are refunds supported in the app, or manually via the Stripe dashboard? If refunds are frequent, in-app refund functionality saves admin time.
- How are failed payments surfaced to the user? Card declines need a clear error message — "your card was declined" is more helpful than a generic error.
- Is the Stripe account in Australia? Payments processed through an Australian Stripe account settle in AUD and attract local transaction fees. Ensure it's set up correctly from the start.
See also: Subscription billing · Usage-based billing · Invoicing and PDF generation · App cost calculator