Learning objectives
- Understand how virtual card spend transactions work, including authorizations and settlements
- Identify the data returned from successful and failed transactions
- Monitor and store transaction history for user transparency and operational integrity
- Integrate webhook-based monitoring for real-time updates
- Handle common transaction scenarios like reversals, refunds, and declines
What is a spend transaction?
A spend transaction occurs when a virtual card is used to pay for goods or services. This includes:- Online purchases (e.g., Amazon, Jumia, Shopify)
- Subscriptions (e.g., Netflix, Spotify, Notion)
- In-app billing
- Software tools and services
The authorization flow
Every virtual card spend follows this basic authorization flow:- User enters card details at checkout
- Merchant submits an authorization request
- Card processor checks:
- Card status (active, frozen, terminated)
- Available balance
- Merchant category code (MCC) restrictions
- Velocity and fraud rules
- Authorization is approved or declined
- Bitnob (or your card provider) sends a webhook with the result
- Your system stores and displays the result
Successful transactions
When a spend transaction is successful:- The authorized amount is deducted from the card balance
- The transaction is recorded in your system
- A webhook is fired (e.g., virtualcard.transaction.settlement)
- The card remains in its current lifecycle state unless further action is taken
Declined transactions
A transaction may be declined for a number of reasons. These events will still generate a webhook and must be handled gracefully in the UI. Common decline reasons include:- Insufficient funds
- Card is frozen or terminated
- Merchant falls under a restricted MCC
- Too many recent transactions (velocity limit)
- Processor-level technical errors
Reversals, refunds, and authorizations
Not all spend-related events result in a completed payment. Your system must track the following:
Each has a different webhook and handling logic. These scenarios are especially common in subscription trials, hotel bookings, and digital advertising.
Transaction webhooks to integrate
These events allow you to update balances, send alerts, generate logs, and monitor fraud patterns.
What to track in your database
Each transaction should be stored with the following fields:- Transaction ID
- Card ID
- User reference (if applicable)
- Amount
- Currency
- Timestamp
- Status (approved, declined, refunded, reversed )
- Merchant name and MCC (if available)
- Failure reason (if applicable)
User interface recommendations
Your product should provide:- A transaction list showing:
- Merchant name or narrative
- Amount and currency
- Date and time
- Status (success, declined, reversed, refunded)
- A detailed transaction view for support and transparency:
- MCC Fees
- Status change timeline
- Original authorization reference
- A clear and human-readable explanation of failures:
- “This payment was declined because your balance was too low”
- “This merchant is not supported by your card provider”
Decline thresholds and automated termination
Bitnob (or the card processor) may automatically terminate a card if it fails repeatedly:- A card is terminated after repeated decline violations. The default is 3, and each company’s limit can be set from 1 to 10
- From the second violation, a $0.75 decline fee applies
- An approved authorization resets the count to zero
- Cards may also be frozen or terminated based on transaction velocity or fraud rules
Internal monitoring recommendations
For product, ops, and support teams:- Create alerts for cards with multiple declines in short timeframes
- Flag suspicious MCCs (e.g., gambling, money transfer)
- Monitor refunds and reversals against total spend
- Log all webhook receipts and response statuses
Recap
- Every card spend triggers a success or failure event
- You must listen to webhooks, log transactions, and update your user interface
- Successful transactions deduct balance; failed ones do not
- Track declines carefully, as they may result in card termination
- Transparency builds trust: always tell users what happened and why