Finance & Fintech Event Spec
This page defines the recommended event taxonomy for finance and fintech products — including retail banking, payments, lending, and investment platforms.
Privacy requirement. Financial products handle highly sensitive personal data. Never send raw PII as event properties. Email addresses and phone numbers must be SHA-256 hashed before tracking. Do not send account numbers, sort codes, card numbers, or national insurance / social security numbers in any form.
All event names use snake_case. Monetary amounts should be sent as numbers (not strings) with a separate currency property using ISO 4217 codes (e.g. 'GBP', 'EUR', 'USD').
Onboarding & KYC
Events covering account creation and identity verification flows.
account_opened
A customer has successfully opened a new account.
| Property | Type | Required | Description |
|---|---|---|---|
account_type | string | No | Type of account: 'current', 'savings', 'investment', 'business' |
channel | string | No | Channel used to open the account: 'web', 'mobile', 'branch' |
_df.track('account_opened', {
account_type: 'current',
channel: 'mobile'
})account_closed
A customer has closed an account.
| Property | Type | Required | Description |
|---|---|---|---|
account_type | string | No | Type of account closed |
reason | string | No | Closure reason code (e.g. 'switching_provider', 'no_longer_needed') |
_df.track('account_closed', {
account_type: 'savings',
reason: 'switching_provider'
})kyc_started
A customer has started an identity or compliance verification flow.
| Property | Type | Required | Description |
|---|---|---|---|
verification_type | string | No | Type of check: 'identity', 'address', 'income' |
_df.track('kyc_started', {
verification_type: 'identity'
})kyc_completed
A KYC verification step has been completed and a result returned.
| Property | Type | Required | Description |
|---|---|---|---|
verification_type | string | No | Type of check performed |
outcome | string | No | Result of the check: 'approved', 'pending', 'rejected' |
_df.track('kyc_completed', {
verification_type: 'identity',
outcome: 'approved'
})kyc_failed
A KYC verification step has failed.
| Property | Type | Required | Description |
|---|---|---|---|
verification_type | string | No | Type of check that failed |
failure_reason | string | No | Reason code for the failure (e.g. 'document_expired', 'name_mismatch') |
Do not include failure details that could expose personally identifiable information. Use reason codes rather than free-text descriptions from the verification provider.
_df.track('kyc_failed', {
verification_type: 'address',
failure_reason: 'document_unreadable'
})Authentication
Events covering secure login and access attempts.
login_attempted
A user has submitted credentials or initiated a login flow.
| Property | Type | Required | Description |
|---|---|---|---|
method | string | No | Authentication method: 'password', 'biometric', 'sms_otp', 'totp' |
_df.track('login_attempted', {
method: 'biometric'
})login_succeeded
Authentication was successful.
| Property | Type | Required | Description |
|---|---|---|---|
method | string | No | Authentication method used |
_df.track('login_succeeded', {
method: 'biometric'
})login_failed
Authentication attempt failed.
| Property | Type | Required | Description |
|---|---|---|---|
method | string | No | Authentication method attempted |
failure_reason | string | No | Reason code (e.g. 'wrong_password', 'otp_expired', 'account_locked') |
_df.track('login_failed', {
method: 'sms_otp',
failure_reason: 'otp_expired'
})Transactions
Events covering payment initiation, completion, and failure.
transaction_initiated
A financial transaction has been submitted by the customer.
| Property | Type | Required | Description |
|---|---|---|---|
transaction_type | string | No | Type of transaction: 'payment', 'transfer', 'withdrawal', 'deposit' |
amount | number | No | Transaction amount |
currency | string | No | ISO 4217 currency code |
channel | string | No | Originating channel: 'web', 'mobile', 'api' |
_df.track('transaction_initiated', {
transaction_type: 'payment',
amount: 89.50,
currency: 'GBP',
channel: 'mobile'
})transaction_completed
A transaction has been processed successfully.
| Property | Type | Required | Description |
|---|---|---|---|
transaction_id | string | No | Unique transaction reference |
transaction_type | string | No | Type of transaction |
amount | number | No | Transaction amount |
currency | string | No | ISO 4217 currency code |
_df.track('transaction_completed', {
transaction_id: 'txn_8f3a2b1c',
transaction_type: 'payment',
amount: 89.50,
currency: 'GBP'
})transaction_failed
A transaction could not be processed.
| Property | Type | Required | Description |
|---|---|---|---|
transaction_type | string | No | Type of transaction |
amount | number | No | Attempted amount |
currency | string | No | ISO 4217 currency code |
failure_reason | string | No | Reason code (e.g. 'insufficient_funds', 'card_declined', 'fraud_block') |
_df.track('transaction_failed', {
transaction_type: 'payment',
amount: 350.00,
currency: 'GBP',
failure_reason: 'insufficient_funds'
})payment_made
A payment to a merchant or payee has been made.
| Property | Type | Required | Description |
|---|---|---|---|
payment_id | string | No | Unique payment reference |
amount | number | No | Payment amount |
currency | string | No | ISO 4217 currency code |
payment_method | string | No | Method used (e.g. 'card', 'direct_debit', 'open_banking') |
merchant_category | string | No | Merchant category code or label (e.g. 'groceries', 'travel') |
_df.track('payment_made', {
payment_id: 'pay_9d2c1a3e',
amount: 24.99,
currency: 'GBP',
payment_method: 'card',
merchant_category: 'groceries'
})payment_failed
A payment attempt failed.
| Property | Type | Required | Description |
|---|---|---|---|
payment_id | string | No | Payment reference |
amount | number | No | Attempted amount |
currency | string | No | ISO 4217 currency code |
failure_reason | string | No | Reason code for the failure |
_df.track('payment_failed', {
payment_id: 'pay_4b7e9f0d',
amount: 199.00,
currency: 'GBP',
failure_reason: 'card_declined'
})transfer_initiated
A funds transfer between accounts has been initiated.
| Property | Type | Required | Description |
|---|---|---|---|
transfer_id | string | No | Unique transfer reference |
amount | number | No | Transfer amount |
currency | string | No | ISO 4217 currency code |
destination_type | string | No | Destination type: 'internal', 'external', 'international' |
_df.track('transfer_initiated', {
transfer_id: 'trf_c3d5e8f2',
amount: 500.00,
currency: 'GBP',
destination_type: 'external'
})transfer_completed
A transfer has settled successfully.
| Property | Type | Required | Description |
|---|---|---|---|
transfer_id | string | No | Unique transfer reference |
amount | number | No | Transferred amount |
currency | string | No | ISO 4217 currency code |
_df.track('transfer_completed', {
transfer_id: 'trf_c3d5e8f2',
amount: 500.00,
currency: 'GBP'
})Cards & Lending
Events covering card applications and loan lifecycle.
card_applied
A customer has submitted an application for a card product.
| Property | Type | Required | Description |
|---|---|---|---|
card_type | string | No | Card type: 'credit', 'debit', 'prepaid' |
credit_limit_requested | number | No | Requested credit limit (credit cards only) |
_df.track('card_applied', {
card_type: 'credit',
credit_limit_requested: 3000
})card_approved
A card application has been approved.
| Property | Type | Required | Description |
|---|---|---|---|
card_type | string | No | Card type approved |
credit_limit | number | No | Approved credit limit |
_df.track('card_approved', {
card_type: 'credit',
credit_limit: 2500
})card_activated
A card has been activated by the customer.
| Property | Type | Required | Description |
|---|---|---|---|
card_type | string | No | Type of card activated |
channel | string | No | Activation channel: 'app', 'web', 'ivr' |
_df.track('card_activated', {
card_type: 'credit',
channel: 'app'
})loan_applied
A customer has submitted a loan application.
| Property | Type | Required | Description |
|---|---|---|---|
loan_type | string | No | Loan type: 'personal', 'mortgage', 'auto', 'business' |
amount_requested | number | No | Amount requested |
currency | string | No | ISO 4217 currency code |
term_months | number | No | Requested loan term in months |
_df.track('loan_applied', {
loan_type: 'personal',
amount_requested: 10000,
currency: 'GBP',
term_months: 36
})loan_approved
A loan application has been approved.
| Property | Type | Required | Description |
|---|---|---|---|
loan_type | string | No | Loan type |
amount_approved | number | No | Approved loan amount |
currency | string | No | ISO 4217 currency code |
interest_rate | number | No | Annual interest rate as a percentage (e.g. 6.9 for 6.9% APR) |
term_months | number | No | Approved loan term in months |
_df.track('loan_approved', {
loan_type: 'personal',
amount_approved: 8000,
currency: 'GBP',
interest_rate: 6.9,
term_months: 36
})loan_funded
The approved loan amount has been disbursed to the customer.
| Property | Type | Required | Description |
|---|---|---|---|
loan_id | string | No | Unique loan identifier |
amount | number | No | Disbursed amount |
currency | string | No | ISO 4217 currency code |
_df.track('loan_funded', {
loan_id: 'loan_7e4a1f2b',
amount: 8000,
currency: 'GBP'
})Account Management
Events covering account self-service and financial management features.
statement_viewed
A customer has viewed an account statement.
| Property | Type | Required | Description |
|---|---|---|---|
account_type | string | No | Type of account the statement relates to |
period | string | No | Statement period in YYYY-MM format (e.g. '2026-02') |
_df.track('statement_viewed', {
account_type: 'current',
period: '2026-02'
})alert_created
A customer has set up a balance or activity alert.
| Property | Type | Required | Description |
|---|---|---|---|
alert_type | string | No | Alert type: 'low_balance', 'large_transaction', 'unusual_activity' |
threshold | number | No | Amount threshold that triggers the alert |
_df.track('alert_created', {
alert_type: 'low_balance',
threshold: 100
})budget_created
A customer has created a spending budget for a category.
| Property | Type | Required | Description |
|---|---|---|---|
budget_id | string | No | Unique identifier for the budget |
category | string | No | Spending category (e.g. 'eating_out', 'transport', 'subscriptions') |
amount | number | No | Budget limit |
currency | string | No | ISO 4217 currency code |
_df.track('budget_created', {
budget_id: 'bgt_2a3f9c1d',
category: 'eating_out',
amount: 200,
currency: 'GBP'
})