Module 7: Freezing, Unfreezing, and Terminating Cards

🧠 Learning Objectives

By the end of this module, you will:

Understand the lifecycle states of a virtual card

Learn what causes transitions between active, frozen, and terminated states

Know how to implement these operations through your backend and API

Design a clear user experience around lifecycle events

Handle edge cases and system-triggered freezes or terminations confidently

Card Lifecycle: A Quick Review

Virtual cards generally exist in one of three mutually exclusive states:

StateDescription
ActiveThe card is operational and can be used for payments
FrozenTemporarily suspended; cannot be used or funded
TerminatedPermanently deactivated; no longer usable or recoverable

Cards may transition between these states due to:

User actions (e.g., tapping “freeze” in your UI)

Risk systems detecting anomalies

Automatic rules defined by the processor or issuing bank

Freezing a Card

What Freezing Means

Freezing a virtual card disables all spend activity temporarily, but preserves the card and its balance. It is typically used:

To protect against fraud or unauthorized activity

As a user-triggered pause during suspicious activity

To prevent further failed transactions

While conducting internal reviews or KYC validation

Frozen cards:

Cannot be used for payments

Cannot be topped up

Remain visible in the user’s dashboard

Can be unfrozen (if permitted by platform or rules)

Example API Call

Unfreezing a Card

Unfreezing restores a card to its active state, allowing it to be used again.

Unfreezing should be:

Controlled by user action (with optional PIN or biometric confirmation)

Logged internally with timestamp and initiator

Denied if the card is already in a terminated state

Example API Call

Only active or frozen cards can transition — terminated cards are final.

Terminating a Card

What Termination Means

Termination is a permanent deactivation. Once a card is terminated, it:

Cannot be used for any further transactions

Cannot be unfrozen

Will not accept new top-ups

May still receive pending refunds or reversals

Termination is typically triggered by:

ReasonExample
User requestUser closes the card from the app
Fraud detectionSystem flags suspicious activity, followed by escalation
Repeated declinesCard exceeds decline thresholds
Compliance actionKYC expired, identity unverifiable
Operational expiryCard expired or balance exhausted and unused

Automatic Termination Rules (Example)

ConditionResult
Card has ≥1 successful transaction and then 4 consecutive declinesCard is terminated
Card has no successful transactions and gets 3 declinesCard is terminated
Frozen card continues to receive failed attemptsMay be escalated to termination

Your backend should track decline history and enforce these limits, or respond to Bitnob webhooks accordingly.

Refunds on Terminated Cards If a terminated card receives a refund:

The funds are credited to your platform’s float or master wallet

Users must be notified via your support or automated system

A webhook (virtualcard.transaction.terminated.refund) will fire with the amount and card details

Cards may still receive reversals or refunds even after termination, depending on merchant behavior.

Withdrawal Behavior Before and After Lifecycle Changes Some platforms support ATM withdrawals or cash-out via virtual cards. If this applies:

Frozen cards cannot be used for withdrawal

Terminated cards must maintain a minimum balance (e.g. $1) prior to closure

Residual balance may be refunded or forfeited based on policy

Webhooks to Monitor

EventDescription
virtualcard.transaction.declined.frozenSpend declined due to freeze
virtualcard.transaction.declined.terminatedFinal failed attempt led to termination
virtualcard.transaction.terminated.refundRefund processed after termination
virtualcard.withdrawal.failedWithdrawal attempt failed (often due to status)

Always notify your support team or alerting system when these webhooks are received.

UI and Product Design Guidelines

StateWhat to Show
ActiveGreen status, “Top up” and “Freeze” buttons
FrozenYellow warning, disabled buttons, “Unfreeze” CTA
TerminatedGreyed-out card, final balance, “Create new card” option
System-triggered changeExplain clearly what happened and why (e.g., "Card terminated after 4 failed payments")

Never hide cards or delete terminated cards from the user’s view — always display a history for trust and support.

👩🏽‍💻 Developer Considerations

Log all lifecycle transitions (who triggered them and when)

Deny any transactions or API calls for terminated cards

Ensure top-up logic validates the current card status

Build idempotency and timestamp-based reconciliation to handle race conditions

If cards are terminated in a batch or via automated logic, enqueue for notification and refund processing

Recap

Cards exist in one of three states: Active, Frozen, or Terminated

Freezing is temporary and reversible; termination is permanent

Platform rules and card processors define when cards are auto-terminated

Refunds after termination are redirected to your platform wallet

User-facing and admin-facing tools should always reflect the true state