SignalEHR · Billing & Revenue Cycle · Maturity Briefing

Nobody becomes a therapist to argue with insurance companies.

Yet denials, corrections, and chasing money are where a practice's evenings go. This briefing shows how far SignalEHR's billing engine has matured, how it is verified, and what that maturity removes from a therapist's week.

Prepared 2026-08-06 · updated 2026-08-10 · derived from the 26-document billing specification, three executable audits, and the live test suite

0
automated tests, green — 406 of them run against a real PostgreSQL on every deploy
0 states
in the claim lifecycle, with 22 guarded transitions — an illegal move is refused and recorded
2 countries
United States and Canada on one shared core — one claim table, one money ledger
$199/mo
per practitioner, with unlimited insurance claims included — no per-claim fees, no percentage of collections
01 The problem

Billing is a second job therapists never applied for

A clinician is trained to treat. The revenue cycle asks them to be a coder, a compliance officer, and a collections agent, in the gaps between sessions.

Industry surveys consistently put first-pass claim denials near one in ten. Every one of those is unpaid work: find the reason code, decode it, fix the claim, resubmit, wait, and repeat, while the money for a session already delivered sits with the payer.

The deeper cost is the uncertainty. Was the client's coverage even active that day? Did the claim go out clean? Did the remittance ever arrive? In most small practices these questions have no system. They have a person, and that person is the therapist.

SignalEHR's answer is not a prettier claims screen. It is a billing engine built so that every claim ends somewhere on purpose, every denial becomes one guided decision, and every dollar is accounted for in a ledger that must balance.

The loop, without an engine
1Session delivered. Coverage assumed, not verified.
2Claim submitted with whatever the intake form said.
3Weeks pass. Status unknown; nobody is assigned to ask.
4Denial arrives as a code — CO-27 — with no instructions.
5An evening goes to phone trees, portals, and guesswork.
6Or nothing happens — and the claim quietly becomes a write-off nobody chose.
Step 6 is the expensive one: revenue that leaks without an error message. Most of SignalEHR's billing architecture exists to make step 6 impossible.
02 The pipeline

One guarded path from session to settled

Every claim, American or Canadian, walks the same rail. Each hop is a guarded state transition: work that must complete before the next step is reachable.

Scroll sideways if needed. The two GUARD hops are where most therapist pain used to live: bad claims now stop before submission, and bad remittances stop before they corrupt the books.

03 No dead ends

A denial is a fork, not a dead end

The state machine's central rule: a claim entering denied must exit to exactly one of four places. There is no fifth option, and "forgotten" is not a state.

Correct & resubmit
For fixable codes. A child claim is created carrying the payer's control number; the original is closed as superseded, so it can never be resubmitted twice.
Staff · Amelia L4
Appeal
An appeal letter is drafted from the denial's specifics. Filing is irreversible, so it always waits for a human click, capped at two levels, no infinite loops.
Always human-approved
Bill the client
The amount is derived from the platform's own arithmetic, never taken from the payer's word. One invoice, linked to the claim, issued through the normal delivery path.
Owner · admin · Amelia L3
Write off
A deliberate decision by an owner or admin, posted to the adjustment ledger and fed to the leakage report, so forgiven money stays visible.
Owner · admin only
The dead-end guard, enforced three ways
On the day of denial, the system either takes an exit automatically or opens a review item whose choices are exactly the four exits. A claim still sitting in denied after 7 days with no open path escalates to the owner. And the amount behind "bill the client" is always derived:
patient_owes = max(0, chargespayer_paidcontractual_adjustmentalready_paid) — the payer's own figure is kept only as a cross-check; a disagreement is recorded, never silently resolved
Illegal moves get the same discipline everywhere: the transition is refused, the attempt is logged with who tried it, and the row stays byte-identical. Amelia receives a structured refusal and re-plans instead of retry-looping.
04 Amelia

Autonomy with ceilings, learning with proof

Amelia, SignalEHR's AI biller, does the repetitive work. What she may do alone is governed by a four-level autonomy framework with hard, unoverridable ceilings.

L5act
Fully autonomous. Read-only and bookkeeping work: eligibility checks, claim-status polls, posting a clean remittance.
L4act + notify
Acts, tells you after. Reversible work at high confidence: scrubbing fixes, claim submission, invoice delivery.
L3queue
Prepares, then waits for your click. Anything irreversible is capped here forever — appeals, denial-balance invoices, new billing rules. No confidence score, setting, or override can raise it.
L2suggest
Suggestion only. The default for anything new or uncertain — a capability earns autonomy; it never gets it by omission.

Confidence is calibrated, not vibes. Amelia's decisions carry a confidence score with a stated basis. Platform defaults: at or above 0.98 an action is eligible to run under its policy level; between 0.95 and 0.98 it goes to office review; below 0.95 a human decides. A missing confidence counts as zero.

And she learns from your denials. Each real denial feeds a learning loop that turns payer behavior into candidate rules. But a learned rule cannot touch a claim until it survives the gauntlet below.

No promotion without measured lift. The marketing sentence "your denial rate falls over time" is backed by this pipeline, not by hope.

05 Maturity

Four stages, two complete, two underway

The billing program is staged like the spec that governs it. A stage is "complete" only when its exit criterion runs as a CI-gated test on every commit. A criterion that isn't executed is a claim, not a criterion.

Stage 1 — Revenue-critical floor

Complete · both countries

The loop that keeps a practice solvent: eligibility → claim → submission → remittance → denial → derived patient balance → invoice → payment → ledger → reporting. The exit scenario (insurance refused, client pays, books balance) passes on a real database in both US and Canadian flavors.

denial → invoice bridgepayment recording + receiptseligibility acted ondouble-bill guardCA reimbursement pathmoney conservation

Stage 2 — Lifecycle & rules enforcement

Complete

The engine stops trusting good intentions: state-machine guards go live, billing behavior becomes data-driven rules, failures become records that alert, and events flow through a transactional outbox that cannot lie about what happened.

guarded transitionsrule engine v1claim scrubbingerror catalog + alertingevent outboxfee-fallback chainremittance canary

Stage 3 — Enterprise layer

In progress

What distinguishes a billing engine from a mature revenue-cycle product: contracts and fee schedules, enrollment, estimates, collections, statements, plus the Canada-specific blocks. Most have shipped since; insurance discovery and several Canadian programs are deferred by choice, not stalled.

payer enrollment + nightly syncprovider identities (group NPI)fee schedules + variancecard payouts (practice as merchant)estimates (GFE)payment plansstatements — compute done, delivery deferredcollections + aged-balance routinginsurance discovery — deferred by choiceCA: WCB-AlbertaCA: benefit maximumsCA: consent recordsCA: live health-card · NIHB · Québec — market-scope deferred

Stage 4 — Intelligence & learning

In progress

The learning half is wired end to end and gate-proven; the measurement half reports six KPI families. The shadow-lift readout, knowledge-graph, and forecasting layers remain open.

denial learning loopshadow evaluationrule graduation (human-gated)KPI suite — 6 familiesbilling knowledge graphforecastingleakage reports
shipped & tested partial — renders, but thin behind open deferred by choice

Stage bars count the spec's blocks for that stage (shipped = 1, partial = ½), not engineering effort.

The gap register: opened honestly, closed with proof
27 revenue-affecting gaps deliberately opened by audit, 2026-07-31 → 08-06. A gap closes only when a regression test merges — never by assertion.
Cumulative gaps opened versus closed, July 31 to August 6 2026. Opened rises from 17 to 27; closed rises from 0 to 19; 8 remain open.
Gaps opened (cumulative) Gaps closed — every one locked by a merged test
View as table
Date (2026)OpenedClosedStill open
Jul 3117017
Aug 1271116
Aug 3271611
Aug 427198
Aug 627198
"Why did earlier audits miss these gaps? Because audits test what exists. A missing bridge produces no failing endpoint and no log line — absence is invisible. So every requirement now resolves to a passing test or an explicit, dated gap." — the discipline behind the register, 00-INDEX §2

Built to travel: the next country is an adapter, not a rewrite

The core is deliberately country-blind: roughly 90% shared engine, 10% country adapter behind one conformance-tested interface. The US and Canada already run on it; the United Kingdom and Australia hook up through the same socket when their markets are opened.

Signal Billing Core
claims · state machines · rules · scrubbing · ledger · pricing · submission · learning · reporting — no country logic inside
COUNTRYADAPTER INTERFACE — one contract, every adapter must pass the same conformance suite
USUnited States
Live
API-direct: 837P claims, eligibility and remittances through the Stedi clearinghouse; CMS-1500 artifacts.
CACanada
Live
API-partner + assisted: TELUS eClaims (~29 insurers), portal-assisted for Sun Life and predeterminations, receipt fallback for the rest. Alberta WCB rides the same rails, assisted-submission, worker never billed.
UKUnited Kingdom
Future hookup
API-partner: private medical insurers (Bupa, AXA Health, Vitality, Aviva) bill electronically via Healthcode. NHS talking-therapies work is block-commissioned, not claim-based, an honest NO on day one. Self-pay invoicing works immediately: the core is country-independent.
AUAustralia
Future hookup
API-partner: Medicare Better Access rebates and DVA via Medicare Web Services; private health funds via HICAPS; NDIS runs on the core's own invoicing. Receipt fallback covers everything else.
API-DIRECT — wire claims straight to a clearinghouse API-PARTNER — claims through a national partner rail PORTAL-ASSISTED — staged package, human submits, real outcome recorded RECEIPT-FALLBACK — client reimbursement, tracked to outcome

The submission-channel spectrum: every country — current or future — maps onto these four. One claim state machine serves all of them.

Adding a country = 8 artifacts, zero core edits
The contract (CO1-050): an adapter implementation, a capability seed (honest NOs are acceptable day one), insurer routing, rule packs, a credential schema, privacy-regime config, document templates, and a green run of the adapter conformance suite. If a new country forces a core change, the architecture failed, and a CI boundary test says so before a human has to notice.
Honest scoping, already in the product's vocabulary
UK and Australia adapters are explicitly non-goals today. The sketches here are pre-discovery, not commitments. But the capability matrix the product ships already renders FUTURE as a first-class badge beside YES / NO / LIMITED / ASSISTED, and the checklist is validated by a template-adapter dry run before any market launch.
06 Evidence

How we know it works

Maturity claims are cheap. These are the mechanisms that make this one expensive to fake.

3,152 automated tests, decomposed
Unit — 2,591 Integration — 561 ↳ of the total, 406 run against a real PostgreSQL sidecar and gate every production deploy
Money must balance — by construction
Every payment, adjustment, and write-off posts to an append-only journal; a conservation check proves rollups equal the journal inside one database. Amounts are integer cents. Replaying a payment moves no money.
Two countries, one engine — really
US and Canadian claims are rows in the same table, with the same guards and the same ledger. The Canadian vocabulary is a projection, not a fork, so money conservation holds for Canadian dollars, and Canadian denials teach the same learning loop.
Proven against the real world
A real 835 remittance from the clearinghouse's test payer parses end to end. The parser was corrected against observed reality, not our own fixtures. Card payments prove out through Stripe test mode in both countries, 18/18, with the practice as merchant of record at a 1% platform fee.
Honest by design
An unreadable remittance is refused, never recorded as $0.00. An invoice is "sent" only on confirmed delivery. An empty dashboard says "nothing yet," never a fabricated zero. The system prefers admitting ignorance to inventing a number.
Access control, audited mechanically
An AST audit walked every mutating endpoint: 45 move money or decide who receives it. All now carry role guards, held in place by a ratchet test. A receptionist can stage work but can trigger zero claim transitions.
A spec you can diff against code
26 documents; every normative sentence carries a requirement ID; every ID resolves to a passing test or a dated gap. 21 billing screens in the product, and a mechanical audit found zero dead links between frontend and backend.
07 The payoff

What actually changes in a therapist's week

WITHOUT AN ENGINE
  • Coverage problems surface at denial time, six weeks after the session.
  • A denial means an evening of reason codes, portals, and hold music.
  • Typos and missing modifiers bounce claims after the payer sees them.
  • "Did that claim ever pay?" has no answer — and no owner.
  • The same payer denies the same thing every month.
  • Billing software takes per-claim fees or a percentage of collections.
WITH SIGNALEHR
  • Coverage is verified and classified before the visit; terminated policies are flagged against the actual date of service.
  • A denial is one decision — four buttons, amounts already derived, prepared by Amelia.
  • The scrubber blocks defective claims before submission.
  • Nothing sits in denied past 7 days without an open path — the system escalates itself.
  • Amelia learns the pattern, proves the fix in shadow, and you approve it once.
  • Unlimited claims inside the $199 flat subscription.

And the numbers a practice owner finally gets

Six KPI families, live on the analytics page — each defined the honest way, because a flattering metric is worse than none.

First-pass acceptance
The headline number. A claim that had to be reworked cost staff time whether or not it eventually paid. Collection rates can't see that at all.
Days in A/R
How long money sits with payers and clients before it becomes cash.
Clean-claim rate
Share of claims that pass scrubbing untouched: the leading indicator denials lag.
Net vs gross collection
Gross is meaninglessly low for any contracted practice; net removes contractual write-offs and measures what you can actually influence.
Payer scorecards
Ranked by volume, not by rate, so a payer with two claims and one fluke doesn't outrank the one quietly costing you thousands.
Rule effectiveness
For every learned rule: untested, helped, or didn't. That's the distinction the "denial rate falls over time" claim rests on.

What we will not claim yet

A maturity briefing that hides its open items isn't one. These are open by design, tracked in the same register, and each will close the same way — with a merged test.

PRODUCTIONPre-revenue. Everything above is gate-proven — against the test suite and the vendors' sandboxes — but not one real payer claim has been filed yet. Filing the first live claims is the next milestone, and we expect them to surface things no test can.
STAGE 3 · USStatement delivery (the compute is done); insurance discovery is deferred by choice — a per-patient-value feature, buildable on demand, not needed at this stage.
STAGE 3 · CAAlberta WCB, benefit-maximum tracking and consent records have shipped. Live health-card validation (needs ministry access), NIHB (needs provider enrolment), workers'-comp beyond Alberta, and Québec/Law-25 are deferred on market scope, not capability.
STAGE 4Shadow-lift readout (data captured, reader not wired yet), billing knowledge graph, forecasting, leakage reporting — the measurement half beyond the six live KPI families. The learning pass runs on demand; the scheduled cadence is an operator opt-in.
SURFACESScreens for engines that already run: why an invoice is held, what a learned rule measured in shadow.
"Billing, invoicing and BI are functional end to end for the United States and Canada at Stage 1, on one shared core, proven against a real database including the money-conservation invariant." — the sentence the audit will sign, 2026-08-04