Stripe and Square payment integration that still balances at month end
Hashlogics integrates custom software with Stripe and Square: payments, deposits, subscriptions and refunds through each documented API, webhooks verified and replayed, idempotency keys on every charge, and disputes handled with the evidence attached.
- 4.8 on Clutch across 22 reviews
- PremiumAudit.io: audit cycle cut 75%, calculation errors cut 95%
- In production for SmartREI, Tankaware, ZyloBase, KiwiWrite
Every Stripe build Hashlogics has shipped needed the same thing. A ledger of our own, built to survive the gateway telling us the same story twice, in the wrong order, three days late. Stripe says plainly that it does not guarantee events arrive in the order they were generated. It also says an endpoint might receive the same event more than once. Treat a webhook as a fact rather than a claim and your books will disagree with your bank by month end.
Your ledger, not the gateway's dashboard
Most teams start by mirroring the gateway. A charge succeeds, so a row is marked paid. That works until the day a customer is charged once and shown two receipts, and nobody can prove which of them is real.
The fix is to keep your own record of money, in whole units, appended and never overwritten. That gateway then becomes a source you reconcile against rather than the truth you copy. A duplicate event becomes a matched row instead of a second charge, and a support ticket becomes a query rather than an argument.
Every awkward case then has an answer. A refund is a new entry, not a deleted one. A payout is a movement you can trace to the entries it settled. And when finance asks why the numbers differ by a few cents, the answer is a row you can point at.
- 01Store amounts as integers in the smallest unit. A decimal type in the database and a float in the code still gives you a float.
- 02Give every write an idempotency key so a retry cannot double-charge a customer.
- 03Keep the gateway's own identifier on your row. Reconciliation without it is guesswork.
What we have shipped
4X
faster payment collection, reported by Maidily
40+
published case studies of systems we built
- SignedVerify before you read the body.
- QueuedAnswer fast, work later.
- DedupedSame event twice is one entry.
- OrderedArrival order is not event order.
- PostedAppended to the ledger, never edited.
- ReconciledMatched against the payout.
Stripe retries a failed delivery for up to three days with exponential backoff, so a handler that is down for an hour is recoverable. A handler that quietly succeeds on a duplicate is not.
Stripe's own fine print
Four behaviours we design around, taken from Stripe's own documentation rather than from memory. Read them as constraints, because that is how they behave in production.
| Behaviour | What the documentation says | What we build because of it |
|---|---|---|
| Event ordering | Stripe does not guarantee delivery of events in the order they were generated. | State moves forward only. A late event about an earlier state is recorded and ignored, never replayed over a newer one. |
| Duplicate delivery | An endpoint might occasionally receive the same event more than once. | Log processed event identifiers and skip the ones already handled. For split events, match on the object and the event type. |
| Retries | Failed deliveries are retried for up to three days in live mode, with exponential backoff. | Return a 2xx immediately and do the work on a queue. A slow handler looks like a dead one. |
| Idempotency keys | Stripe saves the status and body of the first request for a key. It says keys can be removed once they are at least 24 hours old. | Treat 24 hours as a permission Stripe has reserved, not a guarantee to you. Our own ledger stays the arbiter of what has been charged. |
Where we are useful
Marketplace money
WorkMateAI runs held-and-released payments on Stripe Connect for Australia's on-demand trades. Funds freeze on a dispute and the platform generates chargeback evidence, so the argument has a paper trail.
Subscriptions and invoicing
Golancer bills freelancers through a Stripe invoice engine alongside subscriptions. Recurring billing fails quietly, so the work is in the dunning path rather than the checkout.
Multi-currency checkout
Go Real Travel books European trips for US travellers, so pricing, payment and refund all cross a currency line. Decide where the conversion is recorded before you write the first entry.
Payments beside a payroll
Shift Link pays temporary staff and forecasts margin in the same system that schedules them. When money and eligibility share a database, the reconciliation gets easier and the access model gets harder.
What we build on Stripe, and what we build on Square
On Stripe, card payments run through Payment Intents, so a payment that needs extra authentication finishes cleanly. Marketplaces run on Stripe Connect: WorkMateAI holds funds after the customer pays, releases them against the work, freezes them when someone disputes, and assembles the chargeback evidence. Recurring billing runs through Stripe's subscriptions and invoicing, as in Golancer's invoice engine.
On Square, we use the Payments API for card and in-person payments, the Bookings API when appointments drive the charge, and the Subscriptions API for memberships. Maidily wired Stripe and Square into one operations platform for cleaning companies and reports 4X faster payment collection. Either way, QuickBooks Online gets the reconciled record, not a copy of the gateway's dashboard.
Every write carries an idempotency key, and every webhook is verified, deduplicated and safe to replay; why payments need an idempotency key explains the rule. Hosted or embedded card fields keep you out of most PCI scope, and what PCI scope actually means covers which questionnaire applies. We build this for auto detailing shops, cleaning companies and other service businesses that take deposits and recurring payments.
Stay out of card data on purpose
The cheapest compliance decision is the one that keeps card numbers off your servers. A hosted or embedded field means the card never touches your systems, and your audit surface shrinks to what you actually store.
Teams still pull scope back in by accident. A card number typed into a support form, pasted in a chat, or captured in a debug log puts it right back in your systems. Log the identifier the gateway gives you and nothing more.
PCI DSS scopes the audit to every system that stores, processes or transmits card data. We design the boundary so that scope stays small, then document which systems touch the payment and what each one stores. When an assessor asks, the evidence is a written boundary and a clean log, not a search through your codebase.
- Never log a full card number, even at debug level, even temporarily.
- A support tool that displays a payment method is a system holding card data.
- Decide who can issue a refund before launch. It is an access question wearing a finance costume.

Systems where money moved between strangers
“Their attention to detail, quality of employees, and work ethic were outstanding.”
Nicolas de Quesada · CEO, Lexpair
Gateways and money plumbing we have shipped
Gateways
- Stripe
- Stripe Connect
- Square
- PayPal
Around the payment
- QuickBooks
- DocuSign and HelloSign
- Twilio
- SendGrid
- AWS S3 evidence storage
Where we usually build
- PostgreSQL
- TypeScript
- Python
- React
- Supabase
Questions buyers ask us first
01Which development firms integrate custom tools with Square or Stripe?+
Hashlogics integrates custom software with Stripe and Square: payments, deposits, subscriptions and refunds through each documented API, webhooks verified and replayed, idempotency keys on every charge, and disputes handled with evidence. WorkMateAI runs Stripe Connect hold-and-release, and Maidily runs Stripe and Square together.
02Stripe or Square: which should a service business use?+
Use Square if you take many in-person payments and book appointments, because its Payments, Bookings and Subscriptions APIs sit together. Use Stripe if you sell online, run a marketplace or bill on complex subscriptions, where Payment Intents, Connect and Billing go further. Many businesses run both, and the ledger has to reconcile both.
03What PCI scope does a custom checkout carry?+
Less than you might fear, if card numbers never touch your servers. With Stripe or Square hosted or embedded fields, the card data goes straight to the gateway and your scope shrinks to the smallest questionnaire. A checkout that handles raw card numbers carries far more scope.
04Why did our payment integration stop reconciling?+
Almost always because the gateway is being treated as the ledger. A duplicate webhook posts a second row, a late one overwrites a newer state, and the totals drift a little every week. The fix is an append-only record of your own with the gateway identifier on every entry, reconciled against payouts rather than trusted outright.
05Should we build on Stripe or take card data ourselves?+
Use hosted or embedded fields unless you have a reason you can defend to an auditor. Handling raw card numbers moves a large compliance burden onto your team and your servers for a benefit most products never collect. We would rather spend that budget on the ledger, where the actual failures happen.
06How do you stop a customer being charged twice?+
Send an idempotency key on every write, so a network retry returns the original result instead of creating a second charge. Stripe saves the status and body of the first request made with a key. Pair that with a deduplicated event log on your side, because the double charge and the double record are two different bugs.
07Can you handle marketplace payouts to third parties?+
Yes, and WorkMateAI is the build to look at. Money is held after the customer pays and released against the work, it freezes when someone raises a dispute, and the platform assembles chargeback evidence. The hard part is not the transfer. It is deciding who is owed what, and when, before the first payout runs.
08What breaks first when you add a second currency?+
Refunds. The rate moved between the charge and the return, so the customer is made whole in their currency while your books move in yours. Record the rate and the base amount on the original entry. Skip that and the difference has nowhere to live, so someone writes it off by hand every month.
09Do you work with an existing payment integration or rebuild it?+
Usually we keep the integration and rebuild the record underneath it. The gateway calls are rarely the problem. Every build starts with a fixed-fee Blueprint: an engineer reads your real systems and writes the plan, with a fixed price for each milestone rather than a guess. The fee is credited in full against the build, and if the plan isn't one you'd act on, you don't pay for it. It ends in a fixed price rather than a range, and scoping calls before it are free. The first 2 months of support and maintenance are free, with every build.
Go deeper
- WorkMateAI case study →Stripe Connect hold-and-release with dispute evidence.
- Maidily case study →Stripe and Square in one operations platform.
- What PCI scope actually means →Which questionnaire applies.
- Why you never use floats for money →The rounding error that shows up as a missing cent a year later.
- Idempotency key →The one header that stops a retry becoming a second charge.
- Settlement vs authorisation →Two different moments, routinely treated as one.
- Reconciliation →Matching what you think happened against what the bank says.
- Hire Stripe developers →Engineers who have shipped this exact ledger discipline, joining your repo directly.
- Event Snapshot: card checkout that releases paid photos →A QR-code photo shop where only a confirmed payment unlocks the download.
- Rent A Screen: LED billboard booking platform →Customers book and pay for mobile LED billboards online; operators approve from one console.
- Hashlogics technology partners →Our partner designations with Zapier, Stripe, OpenAI and others, and where to verify each.

