UK-registered +44 7367 067226
WhatsApp FOLLOW f in X
  1. Home
  2. Blog
  3. Why Do Some Payments Stay Pending in Our App Even Though the Provider Says They Completed?
Problems We Solve

Why Do Some Payments Stay Pending in Our App Even Though the Provider Says They Completed?

Fintech apps leave payments stuck pending when provider webhooks are missed or arrive out of order. We build webhook handling with replay and status sweeps.

Updated 3 min readBy SpiderHunts Technologies

Free estimateNo obligation

Get a free estimate

Tell us what you need. A senior engineer reads every enquiry.

Takes under a minute. We never share your details.

  • Free consultation
  • No commitment
  • NDA on request

Prefer to talk? Book a free 30-minute call →

Quick answer: TL;DR

Payments get stuck in pending because your app relies on a webhook that sometimes fails, arrives twice or arrives out of order, and nothing checks afterwards. We build webhook intake that stores every event before processing, handles duplicates and ordering, and runs a scheduled sweep that asks the provider for the status of anything stuck too long.

Pending, for the third day

A customer writes in: their payment left their account two days ago, the recipient has it, and your app still says pending. Support checks the admin panel, which also says pending. They check the provider portal, which says completed. They post in the ops channel, and an engineer eventually runs a script to update it.

It happens a few times a week. Nobody knows how many other payments are in the same state, because only the customers who notice write in.

How events go missing

Most providers tell you about status changes through webhooks, and they are reliable most of the time. The problems are at the edges, and a fintech sees enough volume to meet every edge.

What happensWhyResult in your app
Webhook arrives while your service is deployingEndpoint briefly unavailable, provider gives up after retriesStatus never updates
Handler throws an error part wayUnexpected field or a database timeoutEvent acknowledged but not applied
Events arrive out of orderCompleted arrives before processingStatus goes backwards to processing
Same event arrives twiceProvider retries after a slow responseDuplicate ledger entry or notification
Signature check fails after a key rotationOld secret still configuredEvery event rejected quietly

The common thread is that the handler both receives and processes the event in one step. If processing fails, the event is often gone.

The cost of trusting a single webhook

Customers see wrong statuses and lose confidence in the app. Support spends time on tickets that are really data problems. Engineers run one-off scripts, which fix the symptom but leave no record. And your ledger may disagree with the provider, which shows up later in reconciliation as a break someone has to explain.

Webhook intake that does not lose things

What we build separates receiving an event from acting on it, and adds a safety net behind both.

  1. A small intake endpoint verifies the signature, stores the raw event and returns success immediately. It does nothing else, so it rarely fails.
  2. A worker processes stored events from a queue, such as AWS SQS or a database queue, and retries on failure without losing the event.
  3. Each event is checked against an event ID and your own record, so duplicates are ignored and a status never moves backwards.
  4. Events that still fail after retries go to a dead-letter list that ops or engineers can see and replay with one click.
  5. A scheduled sweep finds payments that have been pending longer than a threshold you set, asks the provider's API for the current status, and applies it through the same processing path.
  6. An alert fires if no events have arrived from a provider for longer than normal, which catches expired secrets and endpoint changes.

Because every raw event is stored, you can see exactly what the provider sent and when, which is useful when a partner or your own engineers ask.

What support sees afterwards

Stuck payments are rare, and when one does stick, the sweep usually corrects it before the customer notices. When it cannot, the payment appears in the dead-letter list with the reason, rather than in a customer email.

Support stops relaying status questions to engineering. Engineers stop running scripts in production, and the few manual replays that happen are logged.

Could this be your problem?

  • Customers report payments stuck in pending that the provider shows as done.
  • Engineers fix statuses with scripts.
  • Your webhook handler does its processing inline.
  • Duplicate notifications or ledger entries appear occasionally.
  • Nobody would notice if a provider stopped sending events for an hour.

FAQ

Frequently asked questions

The questions readers ask us after this guide.

Still have a question?

Ask us directly. A senior engineer reads every question.

Ask about your project

Do we need to change providers?

No. This works with the webhooks and status APIs most payment, banking and card providers already offer.

Will the sweep hit the provider's rate limits?

It is designed to check only stuck items, in batches and within the provider's documented limits.

Can you fix the payments already stuck?

Yes. The first run of the sweep lists everything stuck, and we apply the corrections through the same logged path.

Is this a big change to our codebase?

Usually not. The intake and worker are small, and the processing logic you already have is moved behind them.

What drives the cost?

How many providers and event types you handle, and how much of your current processing needs untangling.

Keep reading

More on Problems We Solve

Start here

Tell us where your fintech ops team loses the day

Describe the queue or the report that eats your ops team's week, the providers and partner bank you sit on, and the admin tools people use now. We will tell you what we would build, what we would leave to your own engineers, and if a setting in your provider's dashboard already solves it, we will say so instead.

  1. You tell us what you needTwo minutes on the form, or a message on WhatsApp.
  2. A senior engineer reviews itAnd comes back with questions, a realistic range and an honest view on fit.
  3. Free 30-minute scoping callWe talk through scope, options and a realistic estimate, with no obligation.
Free estimateNo obligation

Talk to someone who builds this

Send a short brief and we will come back with an honest view and a realistic range.

Takes under a minute. We never share your details.

  • Free consultation
  • No commitment
  • NDA on request

Prefer to talk? Book a free 30-minute call →