Transaction statuses
Each transaction row in the dashboard has one of these statuses. The status reflects the most recent event for that transaction; refunds and disputes update the existing row rather than inserting a sibling.
| Status | Meaning |
|---|---|
succeeded | Payment completed. Money is in your account (net of provider fees). |
pending | Payment is in flight. Common with async payment methods (ACH, some crypto rails) where confirmation takes minutes to hours. |
failed | Payment did not complete: card declined, expired auth, hard rejection. No money moved. |
partial | Buyer paid less than invoiced (common when a crypto buyer sends a network-fee-reduced amount). The row's amount reflects what was actually received; check metadata.invoicedAmount for what was requested. |
refunded | Money has been returned to the buyer, fully or partially. The row's amount is the refunded amount; refunds can happen days or weeks after the original payment. |
disputed | The buyer (or their bank) opened a dispute or chargeback. Check the provider's interface for the response window. The row's metadata.reason carries the provider's classification verbatim. |
pending_manual | A pay-by-mail transaction is awaiting your physical confirmation. See the next section. |
manual_canceled | You clicked Cancel on a pending pay-by-mail row before the buyer's payment arrived. |
manual_expired | A pending pay-by-mail row sat for 30 days without confirmation and auto-expired. |
manual_revoked | You confirmed receipt of a pay-by-mail payment but later undid the confirmation (e.g., the payment turned out to be invalid). The row moves from succeeded back to this terminal state. |
Refunds, disputes, partial payments
Coin Moebius listens for these provider events and updates the original transaction row in the dashboard. Specifically:
- Refunds: Stripe's
charge.refundedevent (full or partial refunds, includingamount_refundedso partial refunds show the slice that was returned). NOWPayments'refundedIPN. The row's status flips torefunded, theamountreflects the refunded amount, andmetadata.originalChargeId/metadata.originalAmountcarry the original payment context. - Disputes (chargebacks): Stripe's
charge.dispute.createdevent. The row's status flips todisputed. The provider's stated reason passes through tometadata.reasonverbatim, you can render it in your own UI however you choose. - Partial payments: NOWPayments'
partially_paidIPN. The row's status flips topartial. Theamountreflects what was actually received (actually_paid);metadata.invoicedAmountis what was requested.
These events are surfaced in the dashboard and via the /status endpoint. Set up a small polling job (see the next section) or check the dashboard. If you need your own backend to react automatically, point your provider's own webhook at your server, the same way you would without us.