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.
In v1, these events are surfaced in the dashboard and via the /status endpoint. A future release will add email notifications and an outbound webhook forwarder so your own backend can react automatically. For now, set up a small polling job (see the next section) or check the dashboard.