IOSOR Learn

OTP delivery debit is not the verify session: two ledger lines, one user

An OTP SMS segment and a verification session are two prepaid events on one signup. Do not double-count them as “one OTP cost,” and do not hide the second line from finance.

A user asked for a code. Product saw one OTP. The prepaid wallet posted two lines: a messaging debit for the SMS (segments, destination, DLR path) and a Verify debit for the session (create, TTL window, check). Teams that merge those into “OTP cost” either double-count in the board pack or hide a line until month-end. Neither is a control.

IOSOR runs white-label prepaid Verify next to SMS on one ledger. Catalog live is a real channel; in setup is not a free session. Near USD 1,000+ monthly usage, SMS lines and Verify session lines become commercial review material. No platform subscription to keep Verify available.

One user session, two prepaid lines

The journey is one. The money is two.

  1. Delivery debit — SMS (or voice/email fallback) that carried the code: encoding, segments, destination, terminal DLR.
  2. Verify session debit — issued, waited, checked, expired, or resend policy.

If finance only sees SMS, Verify looks “free.” If product only sees Verify, SMS pumping looks like “more sessions.” Operating picture: OTP without chaos. Keep both wallet rows visible.

Delivery debit is not the verify session debit

Event What the wallet should show Typical failure if merged
Code SMS sent Segment debit, destination, encoding “One OTP” hides UCS-2 multipart
DLR terminal Same SMS line, updated status Retry billed twice with no session
Session created Verify debit, TTL, channel Session looks like another SMS
Check / expire Same Verify line, terminal reason Expired codes blamed on “SMS cost”
User resend New SMS ± new session per policy Cooldown skipped, double burn

Resend policy: OTP TTL and resend cooldown. A cooldown that blocks a session but still fires SMS (or the reverse) is how two ledgers disagree. Voice fallback is a third money shape if that channel is live — never an invisible extra on the SMS row.

How teams double-count or bury the second line

  • Board pack adds SMS OTP spend plus Verify units that already include those sends.
  • Finance refunds undelivered SMS and also voids the session.
  • Dashboards show session success while SMS is still pending DLR.
  • Verify in setup while SMS is live — sessions promised, SMS still debiting.

A prepaid wallet that cannot explain two debits from one human is a receipt printer. Export both lines with a shared correlation id. Stop rules: prepaid spend control.

Reconciling SMS, DLR, and the verify attempt

Weekly recon, one corridor:

Red flags

  • A single blended “OTP fee” with no SMS vs session split
  • Verify billed like a marketing blast
  • SMS refunded without touching the session row (or the reverse) with no policy
  • Resend button that ignores cooldown on one of the two paths
  • Upstream brand names in client-facing errors
  • Verify promised while the channel is in setup

Start with IOSOR

Audit your console webhooks to ensure SMS segment charges and DLR updates generate distinct ledger events from session verification attempts. Configure your billing gate to map session checks and transport charges to separate transaction IDs before finalizing prepaid balances. Set an immediate reconciliation hold on any account where resends register transport debits without updating the active session state.

IOSOR takeaway

This article proved that blending SMS segment transport costs with verification logic obscures true unit economics and creates reconciliation errors across board packs and finance logs. Tracking delivery debits independently from verify sessions is essential for accurate margin visibility and clean billing operations.

Was this guide helpful?

Related guides