Skip to content
Robnu
Live for Ajio

The claim lifecycle in five states.

Robnu's return_claims table walks five states. Each transition is an append-only row. Each evidence is an S3-backed StorageObject. Each win writes a recovery Adjustment back to reconciliation.

Free during early access · Forever free under 25 orders/day
app.robnu.com/claims/CLM-7891Claim lifecyclereturn_claims state machine, auditable + idempotentPending60d sweepFiledauto-evidenceAcknowledgedAjio readsWon→ adjustmentEvidence packetPacking slip · pre-attachedCustomer invoiceVendor invoiceManifest PDF + AWBScan event auditResolution₹4,127recovered to MarketplacePayoutadjustment · type=chargeback
TL;DR
  • Pending → filed → acknowledged → resolved-won | resolved-lost. Five states. Append-only events.
  • The daily claim sweeper (BullMQ, 0 2 * * *) promotes overdue OrderReturn rows to claim_pending.
  • Won claims write a recovery Adjustment of type=chargeback against the source MarketplacePayout.

What you get.

States are explicit

No 'in_progress' soup. Each state is a typed transition with a typed event in return_claim_events. Build dashboards on this; they stay accurate as the schema evolves.

Sweeper is idempotent

The sweeper promotes overdue returns once. A second sweep on the same hour is a no-op. The kill switch WORKER_ENABLE_CLAIM_SWEEPER governs whether it runs at all.

Won and lost are equal citizens

Lost claims are not failures, they're feedback. The lost reason is logged so the discrepancy taxonomy can shift its default posture if a reason is consistently un-disputable.

Endpoints behind the UI

Public claim API surface.

  • GET /v1/claims, list with filters (status, marketplace, period).
  • GET /v1/claims/:id, single claim with events + evidences.
  • GET /v1/claims/stats, counts by state for dashboards.
  • POST /v1/claims/:id/file, transition pending → filed.
  • POST /v1/claims/:id/acknowledge, transition filed → acknowledged.
  • POST /v1/claims/:id/resolve-won, transition → resolved-won, write recovery Adjustment.
  • POST /v1/claims/:id/resolve-lost, transition → resolved-lost with lost_reason.
  • POST /v1/claims/:id/evidence, attach a StorageObject as evidence.
FAQ

Practical answers.

Yes. Reopening writes a new event with a reopen reason and transitions the claim back to filed. The audit log preserves the full history.

RBAC controls the resolve transitions. By default OWNER/ADMIN/FINANCE roles can resolve; OPERATOR can file but not resolve. SuperAdmins act through ImpersonationSession with full audit.

Try it inside your own dashboard.

Free during early access. No card. Forever free under 25 orders/day.

build fba03d73452a892f2461c7ae52979487cbd65f55 · 2026-09-09T17:59:30Z