Recover failed 2Checkout (Verifone) payments

2Checkout, now part of Verifone, is a merchant of record used heavily for cross-border software sales. Recovery there is dominated by cross-border declines and expired local cards, so channel choice and language matter more than retry frequency.

The 2Checkout (Verifone) events recovery depends on

RECURRING_INSTALLMENT_FAILED
A recurring installment failed — open a recovery case.
RECURRING_INSTALLMENT_SUCCESS
The installment was collected. Close the case.
RECURRING_STOPPED
The recurring billing was stopped.

Verifying 2Checkout (Verifone) webhooks

Scheme
Hash over concatenated notification fields with your secret word
Signature location
HASH field inside the IPN payload

2Checkout signs inside the payload rather than a header. Recompute the hash from the documented field order and compare timing-safely before acting.

import { createHash, timingSafeEqual } from "crypto";

// 2Checkout IPN: fields are form-encoded, the signature travels as HASH
const expected = createHash("md5")
  .update(buildIpnSigningString(fields, process.env.TWOCHECKOUT_SECRET_WORD!))
  .digest("hex")
  .toUpperCase();

if (!timingSafeEqual(Buffer.from(expected), Buffer.from(fields.HASH))) {
  return new Response("Invalid signature", { status: 401 });
}

if (fields.MESSAGE_TYPE === "RECURRING_INSTALLMENT_FAILED") {
  await rrlabs.enqueueRecovery({
    provider: "2checkout",
    externalId: fields.SALE_ID,
  });
}

Decline playbook for 2Checkout (Verifone)

Recovery actions per 2Checkout (Verifone) failure signal
Failure signalRecovery action
Cross-border declineOffer an alternative local payment method rather than retrying the same card.
Expired local cardSend the 2Checkout myAccount update link in the buyer's own language.
Repeated installment failureEscalate the channel before the recurring billing is stopped.

What happens after a payment fails

  1. T+0s

    Payment failed

    Provider webhook received and verified

  2. T+2s

    AI analysis

    Decline reason classified, amount at risk scored

  3. T+5s

    Dynamic email

    Copy generated for that decline code and customer

  4. Day 2

    Smart retry

    Retry scheduled only when the decline code is retryable

  5. Day 2

    WhatsApp push

    Second channel used when the email went unanswered

  6. On success

    Recovered

    Counted only when the provider confirms the charge

Timings describe the configured workflow, not a guaranteed outcome. Every step is skipped when the decline reason makes it counter-productive.

Frequently asked questions

Who is the merchant of record with 2Checkout?
2Checkout (Verifone) is, which means it handles the charge, tax and refunds. RRLabs only reads notifications and sends recovery messages.
Why do cross-border declines need different handling?
Retrying the same card rarely changes an issuer's cross-border decision, so the productive move is offering a different payment method.

Connect 2Checkout (Verifone) with read-only credentials

RRLabs reads failure events and orchestrates recovery. It never holds card data and never becomes the merchant of record.

Get early access