Revenue Cycle

Payment Posting Engines Fail When You Trust the Bank File

Saqib Siddiqui
Saqib Siddiqui
Revenue Cycle Technology, AST
Aug 9, 20268 min read
A billing desk with remittance pages, a calculator, and deposit paperwork under soft office light.
TL;DR A payment posting engine is not just an ERA importer. If it cannot match the payer remittance, the bank deposit, the contractual adjustment, and the patient balance into one auditable chain, you do not have reconciliation — you have a faster way to create cleanup work. I build these systems by treating every dollar as a traceable event, not a line item, and by assuming the payer file will be messy, late, duplicate, or incomplete. That assumption is usually right.

The mistake I see most often is simple: teams design payment posting as if the ERA is the source of truth. It is not. The ERA, the bank deposit, the clearinghouse file, reversals, refunds, take-backs, and unapplied cash all have to agree or at least explain why they do not. If your engine only knows how to post what it sees and cannot reason about what is missing, month-end becomes a scavenger hunt.

We learned that the hard way on a rollout where the remittance file looked clean on the surface, but a subset of payments were split across claim lines in a way the posting logic had never seen. The system posted the money, sure. It also misclassified the adjustments, and the reconciliation report said everything balanced right up until someone tried to tie it to the bank feed. That was the moment I stopped thinking about payment posting as accounting logic and started treating it like an integration system with clinical-grade audit requirements.

Pro Tip: Build the engine around immutable payment events. Postings, reversals, write-offs, recoupments, and corrections should never overwrite history. Add a new event and let the ledger tell the story. That one design choice saves you during audits, payer disputes, and internal cleanup.

At AST, when we work inside back-office RCM workflows, I want the engine to answer four questions for every dollar: where did it come from, what claim or patient balance did it touch, what rule moved it, and what proof would I show an auditor. That is the difference between a posting screen and a real reconciliation engine. The screen is the front door; the ledger is the product.


ERA files, bank deposits, and claim-level adjustments do not fail in the same way, so your architecture cannot treat them the same way either. UI teams often assume the operator can fix edge cases manually. That is a comfortable lie. Manual cleanup scales poorly, hides logic bugs, and trains staff to trust overrides instead of the system.

Key Insight: The best reconciliation engine is event-driven, not spreadsheet-driven. It ingests remits, deposits, and manual corrections separately, then resolves them through a deterministic match layer. That layer should record why a match succeeded, why it failed, and which rule was applied. If you cannot explain the match in plain language, you do not want it posting money automatically.

Here is the model I use when designing the core. Separate ingestion from posting. Separate posting from reconciliation. Separate reconciliation from exception handling. If those phases are fused together, one bad payer file can contaminate everything downstream. I like a write-once ledger, a matcher that can rerun safely, and a human review queue only for exceptions that truly need judgment.

That sounds strict because it is. Money workflows punish casual design. A claim payment that posts incorrectly may not explode until the patient gets a balance statement, the provider checks a denial bucket, or finance tries to close the month. By then the root cause has been buried under three layers of reconciliation “fixes.”

Warning: Do not let users edit posted amounts directly. If they need a correction, create a reversing event and a new posting event. Direct edits destroy traceability, make reconciliation non-repeatable, and turn support work into guesswork.

The mechanics matter more than the jargon. A strong engine usually needs these building blocks:

  • Remittance ingestion for 835/ERA, lockbox data, EOB scans, and manual payer uploads.
  • Normalization to convert different payer layouts into one canonical payment model.
  • Claim and patient matching using payer claim control numbers, account references, and service-date logic.
  • Adjustment classification so contractual allowance, deductible, coinsurance, non-covered, and recoupment do not collapse into one bucket.
  • Deposit reconciliation to tie posted dollars back to bank activity and cash application totals.
  • Exception routing for underpayments, overpayments, zero-pays, duplicates, reversals, and orphaned remits.
  • Audit trail that preserves original file, parsed record, rule used, user action, and timestamp.

That list looks obvious until you build it. The surprise is usually not in the happy path; it is in the exception logic. For example, a payer can send a valid ERA line with claim-level detail that still does not map cleanly because the service date changed after resubmission. A human can infer the relationship. Your engine cannot rely on inference where cash is involved. It needs deterministic matching rules and a way to surface ambiguity instead of pretending it resolved it.

Design choiceWhat it gets youWhat breaks if you skip it
Immutable payment eventsRepeatable audit trail and safe reprocessingHidden edits, broken reversals, impossible audits
Separate ingestion and postingCleaner failure isolationOne bad file contaminates downstream totals
Deterministic adjustment rulesConsistent financial classificationRandom write-off buckets and bad analytics
Exception queueHuman review only where neededStaff re-keying everything by hand
Deposit-level reconciliationCash ties to bank activityMonth-end imbalance that nobody can explain

One thing I disagree with is the idea that reconciliation is just a finance function. In practice, it touches billing operations, follow-up, denial management, and patient experience. If the engine misposts a payer adjustment, the patient may get billed incorrectly. If it misses a recoupment, finance thinks revenue is real when it is not. If it cannot identify a duplicate payment, the team will keep wasting time on the same account. That is why I like building payment posting as part of the broader RCM workflow, not as a separate afterthought.

And yes, the interface matters. The best back-office teams I have worked with do not want flashy dashboards. They want fast search, clear exception reasons, and the ability to drill from a bank deposit to the exact remittance line to the original claim. On a good day, the tool stays out of the way. On a bad day, it gives them a trace they can trust.

Pro Tip: Make every exception category actionable. Do not show users “unmatched payment.” Show them “claim not found,” “duplicate remittance control number,” “bank deposit short by $42.18,” or “contractual adjustment rule missing for payer X.” Specificity reduces manual back-and-forth immediately.

At AST, we have seen that the best implementation pattern is to model payment posting like a ledger-first service with a rules layer on top. The rules layer handles payer-specific quirks, but the ledger stays clean. That gives us room to support common feeds like 835s and lockbox deposits while still keeping a defensible audit trail. It is the same discipline we bring when we wire RCM workflows into existing systems instead of trying to rip and replace the whole back office.


If you are evaluating or building this kind of engine, use this checklist before you let it touch production money:

  1. Define the canonical payment object Decide what fields must exist for every posting event: payer, patient, claim, service date, deposit reference, adjustment codes, source file, and posting timestamp.
  2. Separate file ingestion from business logic Parse 835s, lockbox files, and manual uploads into normalized records first. Do not let payer format bleed into the posting engine.
  3. Design the match hierarchy Prioritize exact claim control numbers, then account references, then service-date and amount-based fallback rules. Record which tier matched.
  4. Build reversals as first-class events Every corrected post should preserve the original record and create a compensating entry.
  5. Classify adjustments deterministically Contractual, deductible, coinsurance, copay, write-off, and recoupment need explicit rules tied to payer behavior.
  6. Reconcile cash at deposit level Tie total posted dollars to the bank or lockbox total. A balanced claim ledger does not mean the cash tied out.
  7. Route only true exceptions to humans The queue should contain things the system cannot decide, not everything it is nervous about.
  8. Log every rule decision Store the file, the parsed record, the rule identifier, and the operator action so support can replay the event later.

If you are comparing build approaches, I would choose the option that makes reprocessing safe over the option that looks faster in a demo. Fast demos usually hide the ugly part: what happens when a payer sends a corrected remit, the bank posts two days late, or the same claim appears in two submissions. Production does not forgive fragile state.


What is the difference between payment posting and reconciliation in RCM?
Payment posting applies the payer payment or patient payment to the correct claim, service line, or account. Reconciliation proves that the posted money matches the remittance, the deposit, and the accounting expectation. Posting without reconciliation is bookkeeping; reconciliation without posting is just a report.
Should a payment posting engine support 835 ERA and paper EOBs?
Yes. Real back offices still get mixed feed types. You need one normalized model that can handle X12 835 ERA, lockbox data, scanned EOBs, and manual uploads without changing the downstream posting logic.
How do you handle underpayments and take-backs?
Do not bury them in a generic adjustment bucket. Underpayments should surface as exception cases tied to the payer rule or contract. Take-backs should post as reversal or recoupment events so the original payment remains auditable.
What database model works best for payment reconciliation?
A ledger-style model with immutable events works best. Store original remittance data, posted events, reversals, and audit references separately so reruns do not mutate history.
How does AST approach payment posting workflows?
We build the workflow as a traceable, rules-driven system that fits into the existing EHR and billing stack. In our delivery work, the win comes from clean event modeling, deterministic reconciliation, and exception queues that only catch what truly needs human review.

If you are thinking about RCM workflow integration or want to connect a payment engine cleanly to the systems your team already runs, that is where I would start. The hard part is never the import. It is the accounting logic that survives real payer behavior.

Build a payment engine that actually closes the books

If your posting workflow still depends on manual clean-up after every payer file, the architecture is telling you what it lacks. I can help you design the ledger, reconciliation rules, and exception flow so cash ties out without turning month-end into a fire drill.

Talk to our RCM engineering team

Saqib Siddiqui
Saqib Siddiqui
Revenue Cycle Technology, AST
Saqib runs delivery operations at AST and owns the revenue cycle practice — eligibility, charge capture, claims and denial workflows wired into the EHR, where the engineering is only as good as the reimbursement it protects.

Comments

Comments are warming up. Live, no-sign-in discussion will appear here shortly.

Have a question now? Email info@allstartech.net.

Get in touch
Work with AST

Embed a vetted engineering pod into your team and ship clinical software faster — without cutting a compliance corner.

Book a consultation
Careers at AST

We hire engineers who want to work inside real healthcare problems — EMR, FHIR, clinical AI and the compliance that holds it together.

See open roles