What’s new
A new terminal statereversed has been introduced for Payin and Payment Attempt objects. This state is triggered by an automated payer name verification check run after PSP payment approval on eligible push-based Alternative Payment Methods (APMs).
When the name provided by the buyer at checkout does not match the name returned by the PSP after payment (a NO_MATCH result), the transaction is moved to reversed and a full refund is automatically initiated back to the buyer. The net impact on the merchant balance is zero.
Why this was introduced
Push-based APMs (PayNow, PIX, UPI, Promptpay, etc.) debit funds immediately, and the payer’s identity is only confirmed after PSP approval. This creates exposure to social-engineering fraud where a payment is made by a third party on behalf of the buyer. Thereversed state is Tazapay’s automated response to this pattern — transactions where the payer identity cannot be verified are reversed before they reach succeeded.
Eligibility
The name match check — and therefore thereversed state — only applies when all of the following conditions are true:
- The payment method is a push-based APM in Tazapay’s risk-check allowlist
- The PSP returns a
payer_namein its success response - The merchant has Name Match Check enabled (configured via the Tazapay Ops dashboard)
- The customer’s total payin volume over the trailing 30 days exceeds the configured threshold (default: 0 USD, meaning the check applies to every eligible transaction)
succeeded with no change to the existing flow.
Updated Payin State Flow
After PSP approval, an internal risk check runs betweenprocessing and the terminal state. This check is not visible as a separate state — it completes within seconds.
reversed is a terminal state. A payin that reaches reversed will never emit payin.succeeded.
Name Match Outcomes
| Match Result | Terminal State | Outcome |
|---|---|---|
FULL_MATCH | succeeded | Normal flow — funds credited to merchant |
PARTIAL_MATCH | succeeded | Normal flow — funds credited to merchant |
NO_MATCH | reversed | Refund initiated — net merchant impact is zero |
Balance & Fee Impact for reversed Transactions
Funds flow through the merchant balance even for reversed transactions to maintain ledger consistency:
- Payin credit — merchant balance is credited (same as
succeeded) - Refund debit — full amount is immediately debited back via a system-initiated refund
Automatic Refund
When a payment attempt is reversed, Tazapay automatically creates a refund and initiates it with the PSP. Merchants do not need to take any action. The refund is created with:| Field | Value |
|---|---|
source | payin_reversal |
reason | Payin Reversal |
initiated_by | system |
fee_bearer | tazapay |
refund.created webhook immediately after the refund is saved. The refund ID is only available in that webhook payload — it is not included in the payment_attempt.reversed payload or the Get Payin response. Merchants should capture the refund.id from refund.created to track the refund status via GET /v3/refund/{refund_id}.
Notifications
| Recipient | Channel | Configurable |
|---|---|---|
| Buyer | No — always sent | |
| Merchant | Yes — requires email event to be enabled at account level | |
| Merchant | Webhook (payment_attempt.reversed) | Yes — enabled by default |
Webhook Events
| Event | Trigger | New? | Default (on/off) |
|---|---|---|---|
payment_attempt.reversed | Payment attempt status changes to reversed | Yes | On |
refund.created | Refund created for the reversed payment | No — existing event | Off |
API Changes
Get Payin — GET /v3/payin/{id}
Two new fields have been added to the response:
| Field | Type | Description |
|---|---|---|
reversed_at | string (ISO timestamp) | Timestamp when the payin was reversed. null unless status is reversed. |
risk_check | object / null | Risk check result that determined the terminal state. null when no name match check was performed. |
risk_check.result | string | Match outcome: FULL_MATCH, PARTIAL_MATCH, NO_MATCH, or EMAIL. |
risk_check.buyer_name | string | Name provided by the buyer at checkout. |
risk_check.payer_name | string | Name returned by the PSP after payment. |
risk_check.checked_at | string (ISO timestamp) | Timestamp when the risk check was performed. |
Backward Compatibility
This enhancement is non-breaking:- Transactions on payment methods not in the APM allowlist, or for merchants without Name Match Check enabled, continue to flow directly to
succeeded— no change. succeededandcancelledstate semantics and flows are unchanged.reversed_atisnullin the response for payins that are not inreversedstatus.risk_checkisnullfor payins that were not subject to a name match check.payment_attempt.reversedis a new webhook event type, enabled by default. Merchants who have configured a webhook endpoint will begin receiving it automatically.
