Skip to main content

Documentation Index

Fetch the complete documentation index at: https://developer.tazapay.com/llms.txt

Use this file to discover all available pages before exploring further.

Release type: Enhancement (Backward-compatible) Applies to: Payin, Payment Attempt

What’s new

A new terminal state reversed 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. The reversed 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 the reversed 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_name in 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)
Transactions that do not meet all conditions proceed directly to succeeded with no change to the existing flow.

Updated Payin State Flow

After PSP approval, an internal risk check runs between processing and the terminal state. This check is not visible as a separate state — it completes within seconds.
processing → succeeded   Name match: FULL_MATCH, PARTIAL_MATCH
processing → reversed    Name match: NO_MATCH (refund auto-initiated)
reversed is a terminal state. A payin that reaches reversed will never emit payin.succeeded.

Name Match Outcomes

Match ResultTerminal StateOutcome
FULL_MATCHsucceededNormal flow — funds credited to merchant
PARTIAL_MATCHsucceededNormal flow — funds credited to merchant
NO_MATCHreversedRefund 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:
  1. Payin credit — merchant balance is credited (same as succeeded)
  2. Refund debit — full amount is immediately debited back via a system-initiated refund
The net merchant balance impact is zero. Tazapay bears both the payin processing fee and the refund processing fee — no fees are charged to the merchant or the buyer.

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:
FieldValue
sourcepayin_reversal
reasonPayin Reversal
initiated_bysystem
fee_bearertazapay
Merchants will receive a 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

RecipientChannelConfigurable
BuyerEmailNo — always sent
MerchantEmailYes — requires email event to be enabled at account level
MerchantWebhook (payment_attempt.reversed)Yes — enabled by default
The buyer receives an email notifying them that their payment was reversed and a full refund has been initiated. The merchant email (if enabled) includes the transaction amount, buyer details, and a link to view the transaction in the dashboard.

Webhook Events

EventTriggerNew?Default (on/off)
payment_attempt.reversedPayment attempt status changes to reversedYesOn
refund.createdRefund created for the reversed paymentNo — existing eventOff

API Changes

Get Payin — GET /v3/payin/{id}

Two new fields have been added to the response:
FieldTypeDescription
reversed_atstring (ISO timestamp)Timestamp when the payin was reversed. null unless status is reversed.
risk_checkobject / nullRisk check result that determined the terminal state. null when no name match check was performed.
risk_check.resultstringMatch outcome: FULL_MATCH, PARTIAL_MATCH, NO_MATCH, or EMAIL.
risk_check.buyer_namestringName provided by the buyer at checkout.
risk_check.payer_namestringName returned by the PSP after payment.
risk_check.checked_atstring (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.
  • succeeded and cancelled state semantics and flows are unchanged.
  • reversed_at is null in the response for payins that are not in reversed status. risk_check is null for payins that were not subject to a name match check.
  • payment_attempt.reversed is a new webhook event type, enabled by default. Merchants who have configured a webhook endpoint will begin receiving it automatically.