Skip to main content

Transactions' Lifecycle

This guide explains how financial transactions flow through Connect Financial, from the moment a card is swiped or a bank transfer is initiated, to final settlement. Whether you're building a wallet app, a financial dashboard, or automating reconciliation, this guide will help you understand exactly how to track and display transaction data.


Table of Contents

  1. Overview
  2. Core Concepts
  3. Transaction Domains
  4. Card Transaction Flows
  5. Bank Transaction Flows
  6. Crypto Transaction Flows
  7. Internal Transfer Flows
  8. Webhook Events Reference

1. Overview

Overview

Connect Financial's transaction system tracks all financial movements with:

  • Consistency: Same model across cards, bank transfers, and crypto
  • Traceability: Every external event creates an immutable record
  • Grouping: Related events share a parent*TransactionId for easy correlation
  • Dual Linking: Wallet transactions include both the specific event ID and a grouping ID

Why Does This Matter for Your Integration?

BenefitWhat It Means for You
Instant GroupingGroup all wallet transactions from a single card swipe with one filter (parentCardTransactionId)
Zero Extra API CallsGrouping IDs are included in every response, hence no need to fetch additional data
Consistent PatternsSame code patterns work for cards, bank, and crypto
About the Examples in This Guide
  1. The examples throughout this guide use human-readable IDs like tx-debit-001 and ct-child-1 instead of actual UUIDs (e.g., 550e8400-e29b-41d4-a716-446655440000) to make the flows easier to follow.

  2. Tables in this guide show only the most relevant columns for understanding each flow. Actual API responses include additional fields.

  3. Refer to the API Reference for full endpoint schemas, all available fields, and exact response formats.


2. Core Concepts

2.1 Transaction Lifecycle & Events

A single financial action (like swiping a card) creates multiple events over its lifecycle:

Card Swipe at Coffee Shop ($50)

├──► Event 1: Authorization (hold placed)

├──► Event 2: Capture (merchant settles)

└──► [Optional] Event 3: Reversal (if voided)

Key Points:

  • Each event is a separate transaction record with full details (type, status, amount)
  • Related events share a common parentCardTransactionId for easy grouping
  • Use parentCardTransactionId, parentBankTransactionId, or parentCryptoTransactionId to group related events
  • Events are immutable. New activity creates new records, never updates

2.2 Two Types of Records

Connect Financial provides two ways to view transaction data:

Record TypePurposeWhen to Use
Domain TransactionsCard/Bank/Crypto-specific detailsWhen you need merchant info, bank network, etc.
Wallet TransactionsBalance movementsWhen you need to track how balances change

Example: A $50 card authorization creates:

  • 1 Card Transaction - Contains card ID, merchant, authorization code
  • 2 Wallet Transactions - DEBIT from AVAILABLE, CREDIT to RESERVED

2.3 Grouping Transactions

Every wallet transaction includes parent*TransactionId fields that let you group related events:

{
"id": "tx-001",
"cardTransactionId": "ct-001",
"parentCardTransactionId": "ct-group-001",
"bankTransactionId": null,
"parentBankTransactionId": null,
"cryptoTransactionId": null,
"parentCryptoTransactionId": null,
"walletId": "wallet-123",
"purpose": "DEBIT_CARD_HOLD",
"operation": "DEBIT",
"balanceType": "AVAILABLE",
"amount": "50.00",
"asset": "USD",
"status": "COMPLETED",
"createdAt": "2026-01-15T14:30:00Z"
}

How to use grouping:

// Group all wallet transactions from a single card swipe
const grouped = transactions.filter(tx =>
tx.parentCardTransactionId === 'ct-group-001'
);
// Returns: authorization entries + capture entries + any reversals
FieldUse Case
cardTransactionIdLink to the specific card event
parentCardTransactionIdGroup all entries from the same card swipe
bankTransactionIdLink to the specific bank event
parentBankTransactionIdGroup all entries from the same bank transfer
cryptoTransactionIdLink to the specific crypto event
parentCryptoTransactionIdGroup all entries from the same crypto transfer

This eliminates N+1 queries - you can group without additional API calls.


3. Transaction Domains

3.1 Card Transactions

What it tracks: Debit and credit card activity (authorizations, captures, refunds, reversals)

Fields returned by GET /v1/cards/transactions?cardId=X:

FieldDescription
idUnique identifier for this event
parentCardTransactionIdUse this to group related events together
cardIdThe card involved
typePRE_AUTHORIZATION, PRE_AUTH_COMPLETION, REVERSAL_ADVICE, etc.
operationCREDIT or DEBIT
amountTransaction amount
statusCOMPLETED, FAILED, PENDING, CANCELLED

Card Transaction Types:

TypeDescriptionTriggered By
PRE_AUTHORIZATIONHold placed on cardSwiping card at terminal
PRE_AUTH_COMPLETIONHold converted to final chargeMerchant settlement
REVERSAL_ADVICEHold released or charge reversedMerchant void/refund
ONLINE_TRANSACTIONDirect charge (no prior hold)Force-post transactions
CREDITRefund or credit to cardReturns, credits
BALANCE_INQUIRYBalance check (no financial impact)ATM balance check

3.2 Bank Transactions

What it tracks: ACH/Wire deposits and withdrawals

Fields:

FieldDescription
idUnique identifier for this event
parentBankTransactionIdUse this to group related events together
walletIdThe wallet involved
typeDEPOSIT_INITIATED, DEPOSIT_SUCCESS, WITHDRAWAL_SUCCESS, etc.
operationCREDIT or DEBIT
amountTransaction amount
statusCOMPLETED, FAILED, PENDING
bankNetworkACH or SWIFT

Bank Transaction Types:

TypeDescription
DEPOSIT_INITIATEDDeposit received, pending clearing
DEPOSIT_SUCCESSDeposit cleared successfully
DEPOSIT_FAILUREDeposit failed (returned, rejected)
WITHDRAWAL_INITIATEDWithdrawal submitted
WITHDRAWAL_SUCCESSWithdrawal completed
WITHDRAWAL_FAILUREWithdrawal failed

3.3 Crypto Transactions

What it tracks: Cryptocurrency deposits and withdrawals

Fields:

FieldDescription
idUnique identifier for this event
parentCryptoTransactionIdUse this to group related events together
walletIdThe wallet involved
typeDEPOSIT_INITIATED, DEPOSIT_SUCCESS, WITHDRAWAL_SUCCESS, etc.
operationCREDIT or DEBIT
amountTransaction amount
statusCOMPLETED, FAILED, PENDING
addressOn-chain address
txHashBlockchain transaction hash

4. Card Transaction Flows

4.1 Simple Authorization to Capture ($50 Coffee)

Timeline:

  • T+0: Customer swipes card at coffee shop
  • T+2h: Merchant settles

Step 1: Authorization (Card Swiped)

When the card is swiped, you receive a webhook and can fetch transactions:

Webhook Received:

{
"eventType": "CARD_TRANSACTION_PENDING",
"data": {
"cardId": "card-123",
"cardTransactionId": "ct-001"
}
}

Card Transaction (via GET /v1/cards/transactions/ct-001):

FieldValue
idct-001
parentCardTransactionIdct-group-001
typePRE_AUTHORIZATION
amount50.00
operationDEBIT
statusCOMPLETED

Wallet Transactions (via GET /v1/transactions?parentCardTransactionId=ct-group-001):

idcardTransactionIdparentCardTransactionIdpurposeoperationbalanceTypeamount
tx-001ct-001ct-group-001DEBIT_CARD_HOLDDEBITAVAILABLE50.00
tx-002ct-001ct-group-001DEBIT_CARD_HOLDCREDITRESERVED50.00

Balance Change:

  • AVAILABLE: -$50.00
  • RESERVED: +$50.00

Step 2: Capture (Merchant Settles)

When the merchant settles, you receive another webhook:

Webhook Received:

{
"eventType": "CARD_TRANSACTION_COMPLETED",
"data": {
"cardId": "card-123",
"cardTransactionId": "ct-002"
}
}

New Card Transaction:

FieldValue
idct-002
parentCardTransactionIdct-group-001
typePRE_AUTH_COMPLETION
amount50.00
operationDEBIT
statusCOMPLETED

Note: parentCardTransactionId is the same (ct-group-001) - this groups it with the original authorization.

Updated Wallet Transactions (filtering by parentCardTransactionId=ct-group-001 now returns 4 entries):

idcardTransactionIdpurposeoperationbalanceTypeamount
tx-001ct-001DEBIT_CARD_HOLDDEBITAVAILABLE50.00
tx-002ct-001DEBIT_CARD_HOLDCREDITRESERVED50.00
tx-003ct-002DEBIT_CARD_CAPTUREDEBITRESERVED50.00
tx-004ct-002DEBIT_CARD_CAPTURECREDITCOMMITTED50.00

Final Balance Change:

  • AVAILABLE: -$50.00
  • COMMITTED: +$50.00 (funds captured, will be settled to merchant)

4.2 Reversal (Customer Cancels)

If the merchant voids the transaction before settlement, you receive:

Webhook Received:

{
"eventType": "CARD_TRANSACTION_CANCELLED",
"data": {
"cardId": "card-123",
"cardTransactionId": "ct-002"
}
}

Card Transaction:

FieldValue
idct-002
parentCardTransactionIdct-group-001
typeREVERSAL_ADVICE
amount50.00
operationCREDIT
statusCOMPLETED

New Wallet Transactions:

idcardTransactionIdpurposeoperationbalanceTypeamount
tx-003ct-002DEBIT_CARD_HOLDDEBITRESERVED50.00
tx-004ct-002DEBIT_CARD_HOLDCREDITAVAILABLE50.00

Final Balance: $0 change (funds fully returned to AVAILABLE)


4.3 Declined Authorization

When a card authorization is declined (insufficient funds, fraud, etc.):

Webhook Received:

{
"eventType": "CARD_TRANSACTION_FAILED",
"data": {
"cardId": "card-123",
"cardTransactionId": "ct-001"
}
}

Card Transaction:

FieldValue
idct-001
parentCardTransactionIdct-group-001
typePRE_AUTHORIZATION
amount500.00
operationDEBIT
statusFAILED

Wallet Transactions: NONE - Declines have no balance impact

Balance: Unchanged


4.4 Refund

When a merchant refunds a completed purchase:

Webhook Received:

{
"eventType": "CARD_TRANSACTION_COMPLETED",
"data": {
"cardId": "card-123",
"cardTransactionId": "ct-001"
}
}

Card Transaction:

FieldValue
idct-001
parentCardTransactionIdct-group-002
typeCREDIT
amount50.00
operationCREDIT
statusCOMPLETED

Note: Refunds create a new parentCardTransactionId since they are a separate transaction lifecycle.

Wallet Transactions:

idcardTransactionIdparentCardTransactionIdpurposeoperationbalanceTypeamount
tx-001ct-001ct-group-002DEBIT_CARD_REFUNDCREDITAVAILABLE50.00

Note: New funds are entering the system.

Balance Change: AVAILABLE +$50.00


5. Bank Transaction Flows

5.1 Bank Deposit ($100)

Timeline:

  • T+0: Funds received from external bank
  • T+1-3 days: Funds cleared

Step 1: Deposit Pending

Webhook Received:

{
"eventType": "BANK_DEPOSIT_TRANSACTION_PENDING",
"data": {
"walletId": "wallet-123",
"bankTransactionId": "bt-001"
}
}

Wallet Transactions (via GET /v1/transactions?parentBankTransactionId=bt-group-001):

idbankTransactionIdparentBankTransactionIdpurposeoperationbalanceTypeamount
tx-001bt-001bt-group-001BANK_DEPOSIT_INITIATEDCREDITPENDING100.00

Balance Change: PENDING +$100.00


Step 2: Deposit Completed

Webhook Received:

{
"eventType": "BANK_DEPOSIT_TRANSACTION_COMPLETED",
"data": {
"walletId": "wallet-123",
"bankTransactionId": "bt-002"
}
}

Updated Wallet Transactions (filtering by parentBankTransactionId=bt-group-001):

idbankTransactionIdparentBankTransactionIdpurposeoperationbalanceTypeamount
tx-001bt-001bt-group-001BANK_DEPOSIT_INITIATEDCREDITPENDING100.00
tx-002bt-002bt-group-001BANK_DEPOSIT_SUCCESSDEBITPENDING100.00
tx-003bt-002bt-group-001BANK_DEPOSIT_SUCCESSCREDITAVAILABLE100.00

Final Balance Change: AVAILABLE +$100.00


5.2 Bank Withdrawal ($100, $2 fee)

Step 1: Withdrawal Initiated

Webhook Received:

{
"eventType": "BANK_WITHDRAWAL_TRANSACTION_PENDING",
"data": {
"walletId": "wallet-123",
"bankTransactionId": "bt-001"
}
}

Wallet Transactions (via GET /v1/transactions?parentBankTransactionId=bt-group-001):

idbankTransactionIdparentBankTransactionIdpurposeoperationbalanceTypeamount
tx-001bt-001bt-group-001BANK_WITHDRAWAL_INITIATEDDEBITAVAILABLE102.00
tx-002bt-001bt-group-001BANK_WITHDRAWAL_INITIATEDCREDITRESERVED102.00

Balance Change: AVAILABLE -$102.00, RESERVED +$102.00


Step 2: Withdrawal Completed

Webhook Received:

{
"eventType": "BANK_WITHDRAWAL_TRANSACTION_COMPLETED",
"data": {
"walletId": "wallet-123",
"bankTransactionId": "bt-002"
}
}

Updated Wallet Transactions (filtering by parentBankTransactionId=bt-group-001):

idbankTransactionIdparentBankTransactionIdpurposeoperationbalanceTypeamount
tx-001bt-001bt-group-001BANK_WITHDRAWAL_INITIATEDDEBITAVAILABLE102.00
tx-002bt-001bt-group-001BANK_WITHDRAWAL_INITIATEDCREDITRESERVED102.00
tx-003bt-002bt-group-001BANK_WITHDRAWAL_SUCCESSDEBITRESERVED100.00
tx-004bt-002bt-group-001WITHDRAWAL_FEE_REVENUEDEBITRESERVED2.00
tx-005bt-002bt-group-001WITHDRAWAL_FEE_REVENUECREDITFEE_REVENUE2.00

Final Balance Change: AVAILABLE -$102.00 (sent $100 + $2 fee)


6. Crypto Transaction Flows

6.1 Crypto Deposit (0.5 BTC)

Step 1: Deposit Detected

Webhook Received:

{
"eventType": "CRYPTO_DEPOSIT_TRANSACTION_PENDING",
"data": {
"walletId": "wallet-123",
"cryptoTransactionId": "crt-001"
}
}

Wallet Transactions (via GET /v1/transactions?parentCryptoTransactionId=crt-group-001):

idcryptoTransactionIdparentCryptoTransactionIdpurposeoperationbalanceTypeamount
tx-001crt-001crt-group-001CRYPTO_DEPOSIT_INITIATEDCREDITPENDING0.5

Step 2: Deposit Confirmed

Webhook Received:

{
"eventType": "CRYPTO_DEPOSIT_TRANSACTION_COMPLETED",
"data": {
"walletId": "wallet-123",
"cryptoTransactionId": "crt-002"
}
}

Updated Wallet Transactions (filtering by parentCryptoTransactionId=crt-group-001):

idcryptoTransactionIdparentCryptoTransactionIdpurposeoperationbalanceTypeamount
tx-001crt-001crt-group-001CRYPTO_DEPOSIT_INITIATEDCREDITPENDING0.5
tx-002crt-002crt-group-001CRYPTO_DEPOSIT_SUCCESSDEBITPENDING0.5
tx-003crt-002crt-group-001CRYPTO_DEPOSIT_SUCCESSCREDITAVAILABLE0.5

7. Internal Transfer Flows

7.1 Wallet-to-Wallet Transfer ($50)

Internal transfers affect wallet balances directly (no card/bank/crypto domain). Each wallet owner receives their own webhook with the transaction ID that affects their wallet.

Webhook 1: Source Wallet Owner (money leaving)

{
"eventType": "INTERNAL_TRANSACTION_COMPLETED",
"data": {
"walletId": "source-wallet-123",
"transactionId": "tx-debit-001"
}
}

Webhook 2: Destination Wallet Owner (money arriving)

{
"eventType": "INTERNAL_TRANSACTION_COMPLETED",
"data": {
"walletId": "destination-wallet-456",
"transactionId": "tx-credit-002"
}
}

Wallet Transactions:

idparentTransactionIdwalletIdpurposeoperationbalanceTypeamount
tx-debit-001tx-parent-001source-wallet-123VIRTUAL_INTERNAL_TRANSFERDEBITAVAILABLE50.00
tx-credit-002tx-parent-001destination-wallet-456VIRTUAL_INTERNAL_TRANSFERCREDITAVAILABLE50.00

Grouping: Use parentTransactionId to group the debit and credit entries together.


8. Webhook Events Reference

8.1 Card Transaction Events

EventWhen FiredPayload
CARD_TRANSACTION_PENDINGAuthorization approved, hold placed{ cardId, cardTransactionId }
CARD_TRANSACTION_COMPLETEDTransaction settled/captured{ cardId, cardTransactionId }
CARD_TRANSACTION_FAILEDAuthorization declined{ cardId, cardTransactionId }
CARD_TRANSACTION_CANCELLEDTransaction reversed/voided{ cardId, cardTransactionId }

8.2 Bank Transaction Events

EventWhen FiredPayload
BANK_DEPOSIT_TRANSACTION_PENDINGDeposit received, pending{ walletId, bankTransactionId }
BANK_DEPOSIT_TRANSACTION_COMPLETEDDeposit cleared{ walletId, bankTransactionId }
BANK_DEPOSIT_TRANSACTION_FAILEDDeposit failed/returned{ walletId, bankTransactionId }
BANK_WITHDRAWAL_TRANSACTION_PENDINGWithdrawal initiated{ walletId, bankTransactionId }
BANK_WITHDRAWAL_TRANSACTION_COMPLETEDWithdrawal completed{ walletId, bankTransactionId }
BANK_WITHDRAWAL_TRANSACTION_FAILEDWithdrawal failed{ walletId, bankTransactionId }

8.3 Crypto Transaction Events

EventWhen FiredPayload
CRYPTO_DEPOSIT_TRANSACTION_PENDINGDeposit detected on-chain{ walletId, cryptoTransactionId }
CRYPTO_DEPOSIT_TRANSACTION_COMPLETEDDeposit confirmed{ walletId, cryptoTransactionId }
CRYPTO_DEPOSIT_TRANSACTION_FAILEDDeposit failed{ walletId, cryptoTransactionId }
CRYPTO_WITHDRAWAL_TRANSACTION_PENDINGWithdrawal initiated{ walletId, cryptoTransactionId }
CRYPTO_WITHDRAWAL_TRANSACTION_COMPLETEDWithdrawal confirmed{ walletId, cryptoTransactionId }
CRYPTO_WITHDRAWAL_TRANSACTION_FAILEDWithdrawal failed{ walletId, cryptoTransactionId }

8.4 Internal Transfer Events

EventWhen FiredPayloadNotes
INTERNAL_TRANSACTION_COMPLETEDTransfer completed{ walletId, transactionId }2 webhooks sent - one per wallet

Important: Internal transfers send two separate webhooks:

  • Source wallet owner receives webhook with debit transaction ID
  • Destination wallet owner receives webhook with credit transaction ID