Skip to content

Read the transactions view

Payments → Transactions shows every completed or in-flight payment across all 5 rails in one table. This is the finance surface of the app.

TwistCue’s payment stack is multi-rail. Every transaction lands here regardless of source:

RailPlatform tagWhat it is
Store IAPapple / googleApple / Google in-app purchase for coin packs or subscriptions. Recognized via RevenueCat.
Cards (web)card_webDirect credit/debit via Charbel’s own card MID. Subs + top-ups, recurring via tokenization.
dLocaldlocal_* (e.g. dlocal_fawry_eg)Local wallets & cash vouchers: Fawry (EG), OVO/DANA (ID), GCash (PH).
pawaPaypawapay_* (e.g. pawapay_mpesa_ke)Mobile money: M-Pesa, MTN MoMo, Airtel Money.
VAS / DCBvas_* (e.g. vas_etisalat_eg)Direct-carrier-billing via adbilling.me stack: MSISDN + PIN funnel grants app entitlements.

Side panel:

FilterValues
Railmulti-select from the 5 rails
Statuscompleted / pending / refunded / failed / disputed
CountryISO-2
Date rangeUTC
CurrencyUSD, IDR, EGP, PHP, KES, …
Usersearch by user id / email

Every filter is URL-state. Shareable views.

ColumnMeaning
CreatedPurchase/subscription event timestamp (UTC, local on hover).
UserEmail or phone, clickable → User 360. Guest = “Guest (device:…)”.
RailPlatform tag.
Kindcoin_pack / subscription / vas_entitlement / refund
ProductProduct ID / SKU.
AmountNative currency + USD equivalent in parens.
Coins grantedFor coin packs: base coins + bonus coins.
StatusSee below.
Transaction IDProvider-side ID (Apple original_transaction_id, Stripe pi_…, dLocal payment_id, etc.).
StatusMeaning
completedPayment cleared. Ledger credited. User has coins/access.
pendingWebhook received but not confirmed (rare: usually a stuck async provider).
failedPayment rejected. No ledger movement.
refundedFull refund executed. Ledger reversed via sink_refund.
partial_refundedPartial refund (rare; some providers). Ledger reversed by the refunded amount.
disputedChargeback opened at the card MID. Investigation pending.

Click a row → transaction detail:

  • All fields from the list
  • User 360 link
  • Full webhook payload (for debugging)
  • Ledger entries created by this transaction (double-entry pairs)
  • Related unlocks (if the user spent from this purchase)
  • Refund history if applicable

Export CSV button (top-right), downloads the current filtered view. Uses /v1/admin/payments/transactions/export.csv. Rows are streamed, even a year of history is fine.

Compare our view against provider reports at Reconciliation CSV.

  • Store IAP transactions can arrive minutes late: RevenueCat webhook delivery isn’t instant. If a support ticket says “I bought coins but they’re missing”, wait 2 minutes and refresh before assuming failure.
  • VAS entitlements may not have a transaction_id: adbilling.me passes an opaque token instead. The link back to the LP funnel is via the region + subscription_id fields.
  • Currency conversion uses a daily rate stored server-side. USD amounts on the list page are informational; the ledger stores native cents.
ActionEndpoint
List transactionsGET /v1/admin/payments/transactions
Export CSVGET /v1/admin/payments/transactions/export.csv
Transaction detailGET /v1/admin/payments/transactions/:id

Full details in API: Payments.