Finance & Fintech Event Spec
This page defines all standard finance and fintech events for Datafly Signal — covering retail banking, payments, lending, cards, and investment platforms. Implement these events to enable accurate server-side delivery to advertising and analytics platforms across the full customer lifecycle: discovery, lead generation, onboarding, conversion, and retention.
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 and reuse GA4’s recommended event names where an equivalent exists (view_item, search, sign_up, login, generate_lead, purchase). Monetary amounts should be sent as numbers (not strings) with a separate currency property using ISO 4217 codes (e.g. 'GBP', 'EUR', 'USD').
All events are sent via datafly.track(). Properties are passed as a flat object in the second argument.
Discovery & Engagement
Events covering how prospects discover and engage with financial products before applying or signing up.
search
Fired when a user searches for a product, branch, ATM, or help article.
datafly.track('search', {
search_term: 'fixed rate savings'
})| Property | Type | Required | Description |
|---|---|---|---|
search_term | string | Required | The search term entered by the user |
view_item
Fired when a user views a product detail page (e.g. a specific savings account, credit card, or loan product). Also accepted as view_content.
datafly.track('view_item', {
currency: 'GBP',
value: 0,
items: [
{
item_id: 'sav-fixed-1yr',
item_name: '1 Year Fixed Saver',
item_category: 'Savings',
item_brand: 'Acme Bank'
}
]
})| Property | Type | Required | Description |
|---|---|---|---|
currency | string | Optional | ISO 4217 currency code |
value | number | Optional | Indicative monetary value of the product, if applicable |
items | array | Optional | Array containing the viewed product (see Items Array Schema) |
view_item_list
Fired when a user views a list of products, such as a comparison table or product category page.
datafly.track('view_item_list', {
item_list_id: 'credit-cards',
item_list_name: 'Credit Cards',
items: [
{ item_id: 'cc-rewards', item_name: 'Rewards Credit Card', index: 0, item_category: 'Credit Cards' },
{ item_id: 'cc-balance', item_name: 'Balance Transfer Card', index: 1, item_category: 'Credit Cards' }
]
})| Property | Type | Required | Description |
|---|---|---|---|
item_list_id | string | Optional | Machine-readable identifier for the list |
item_list_name | string | Optional | Human-readable name of the list or category |
items | array | Optional | Array of products displayed in the list (see Items Array Schema) |
select_item
Fired when a user clicks into a product from a list or comparison page.
datafly.track('select_item', {
item_list_id: 'credit-cards',
item_list_name: 'Credit Cards',
items: [
{ item_id: 'cc-rewards', item_name: 'Rewards Credit Card', index: 0, item_category: 'Credit Cards' }
]
})| Property | Type | Required | Description |
|---|---|---|---|
item_list_id | string | Optional | Identifier of the list the product was selected from |
item_list_name | string | Optional | Name of the list the product was selected from |
items | array | Optional | Array containing the selected product (see Items Array Schema) |
quote_requested
Fired when a prospect requests an indicative quote, rate, or eligibility result.
datafly.track('quote_requested', {
product_type: 'personal_loan',
amount: 10000,
currency: 'GBP',
term_months: 36
})| Property | Type | Required | Description |
|---|---|---|---|
product_type | string | Optional | Product the quote relates to (e.g. 'personal_loan', 'mortgage', 'home_insurance') |
amount | number | Optional | Amount requested in the quote |
currency | string | Optional | ISO 4217 currency code |
term_months | number | Optional | Requested term in months, where applicable |
eligibility_checked
Fired when a soft eligibility or affordability check returns a result, typically without affecting the customer’s credit score.
datafly.track('eligibility_checked', {
product_type: 'credit_card',
outcome: 'eligible',
pre_approved: true
})| Property | Type | Required | Description |
|---|---|---|---|
product_type | string | Optional | Product checked (e.g. 'credit_card', 'personal_loan') |
outcome | string | Optional | Result: 'eligible', 'ineligible', 'more_info_needed' |
pre_approved | boolean | Optional | Whether the customer was pre-approved |
Lead Generation
Events covering marketing-led capture of prospect interest. These are the primary conversion signals for paid acquisition campaigns.
generate_lead
Fired when a prospect submits a lead form, requests a callback, or otherwise expresses qualified intent. This is the core acquisition conversion for finance campaigns — ensure it fires reliably.
datafly.track('generate_lead', {
currency: 'GBP',
value: 50,
lead_type: 'mortgage_enquiry',
product_type: 'mortgage'
})| Property | Type | Required | Description |
|---|---|---|---|
currency | string | Optional | ISO 4217 currency code for value |
value | number | Optional | Estimated lead value to the business |
lead_type | string | Optional | Nature of the lead (e.g. 'mortgage_enquiry', 'callback_request', 'newsletter') |
product_type | string | Optional | Product the lead relates to |
Never include the prospect’s email, phone number, or name in generate_lead properties. Identity is attached server-side from hashed identifiers, never from raw form values.
application_started
Fired when a prospect begins a product application (loan, card, account, mortgage).
datafly.track('application_started', {
product_type: 'personal_loan',
amount: 10000,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
product_type | string | Optional | Product being applied for |
amount | number | Optional | Amount requested, where applicable |
currency | string | Optional | ISO 4217 currency code |
application_submitted
Fired when a prospect completes and submits a product application for decisioning.
datafly.track('application_submitted', {
application_id: 'app_5c2e9a4f',
product_type: 'personal_loan',
amount: 10000,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
application_id | string | Optional | Unique application reference |
product_type | string | Optional | Product being applied for |
amount | number | Optional | Amount requested |
currency | string | Optional | ISO 4217 currency code |
Onboarding & KYC
Events covering account creation and identity verification flows.
sign_up
Fired when a user completes registration and creates login credentials, before or alongside account opening.
datafly.track('sign_up', {
method: 'email'
})| Property | Type | Required | Description |
|---|---|---|---|
method | string | Optional | Registration method (e.g. email, google, apple) |
account_opened
A customer has successfully opened a new account.
datafly.track('account_opened', {
account_type: 'current',
channel: 'mobile'
})| 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' |
account_closed
A customer has closed an account.
datafly.track('account_closed', {
account_type: 'savings',
reason: 'switching_provider'
})| 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') |
kyc_started
A customer has started an identity or compliance verification flow.
datafly.track('kyc_started', {
verification_type: 'identity'
})| Property | Type | Required | Description |
|---|---|---|---|
verification_type | string | No | Type of check: 'identity', 'address', 'income' |
kyc_completed
A KYC verification step has been completed and a result returned.
datafly.track('kyc_completed', {
verification_type: 'identity',
outcome: 'approved'
})| Property | Type | Required | Description |
|---|---|---|---|
verification_type | string | No | Type of check performed |
outcome | string | No | Result of the check: 'approved', 'pending', 'rejected' |
kyc_failed
A KYC verification step has failed.
Do not include failure details that could expose personally identifiable information. Use reason codes rather than free-text descriptions from the verification provider.
datafly.track('kyc_failed', {
verification_type: 'address',
failure_reason: 'document_unreadable'
})| 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') |
Authentication
Events covering secure login and access attempts.
login
Fired when a user successfully signs in to their account. Equivalent to login_succeeded; use whichever fits your taxonomy.
datafly.track('login', {
method: 'biometric'
})| Property | Type | Required | Description |
|---|---|---|---|
method | string | Optional | Authentication method (e.g. password, biometric, sms_otp, totp) |
login_attempted
A user has submitted credentials or initiated a login flow.
datafly.track('login_attempted', {
method: 'biometric'
})| Property | Type | Required | Description |
|---|---|---|---|
method | string | No | Authentication method: 'password', 'biometric', 'sms_otp', 'totp' |
login_succeeded
Authentication was successful.
datafly.track('login_succeeded', {
method: 'biometric'
})| Property | Type | Required | Description |
|---|---|---|---|
method | string | No | Authentication method used |
login_failed
Authentication attempt failed.
datafly.track('login_failed', {
method: 'sms_otp',
failure_reason: 'otp_expired'
})| Property | Type | Required | Description |
|---|---|---|---|
method | string | No | Authentication method attempted |
failure_reason | string | No | Reason code (e.g. 'wrong_password', 'otp_expired', 'account_locked') |
Transactions
Events covering payment initiation, completion, and failure.
transaction_initiated
A financial transaction has been submitted by the customer.
datafly.track('transaction_initiated', {
transaction_type: 'payment',
amount: 89.50,
currency: 'GBP',
channel: 'mobile'
})| 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' |
transaction_completed
A transaction has been processed successfully.
datafly.track('transaction_completed', {
transaction_id: 'txn_8f3a2b1c',
transaction_type: 'payment',
amount: 89.50,
currency: 'GBP'
})| 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 |
transaction_failed
A transaction could not be processed.
datafly.track('transaction_failed', {
transaction_type: 'payment',
amount: 350.00,
currency: 'GBP',
failure_reason: 'insufficient_funds'
})| 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') |
payment_made
A payment to a merchant or payee has been made.
datafly.track('payment_made', {
payment_id: 'pay_9d2c1a3e',
amount: 24.99,
currency: 'GBP',
payment_method: 'card',
merchant_category: 'groceries'
})| 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') |
payment_completed
A payment has settled successfully end-to-end. Use this as the canonical “money received” conversion when delivering payment success to advertising platforms.
datafly.track('payment_completed', {
payment_id: 'pay_9d2c1a3e',
amount: 24.99,
currency: 'GBP',
payment_method: 'card'
})| Property | Type | Required | Description |
|---|---|---|---|
payment_id | string | No | Unique payment reference — used for deduplication |
amount | number | No | Settled payment amount |
currency | string | No | ISO 4217 currency code |
payment_method | string | No | Method used (e.g. 'card', 'direct_debit', 'open_banking') |
payment_failed
A payment attempt failed.
datafly.track('payment_failed', {
payment_id: 'pay_4b7e9f0d',
amount: 199.00,
currency: 'GBP',
failure_reason: 'card_declined'
})| 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 |
invoice_paid
Fired when a customer pays an invoice (common in business banking, accounting, and B2B fintech). Counts as a revenue conversion.
datafly.track('invoice_paid', {
invoice_id: 'inv_7a1c4e9d',
amount: 1250.00,
currency: 'GBP',
payment_method: 'open_banking'
})| Property | Type | Required | Description |
|---|---|---|---|
invoice_id | string | No | Unique invoice reference — used for deduplication |
amount | number | No | Invoice amount paid |
currency | string | No | ISO 4217 currency code |
payment_method | string | No | Method used (e.g. 'card', 'direct_debit', 'open_banking') |
transfer_initiated
A funds transfer between accounts has been initiated.
datafly.track('transfer_initiated', {
transfer_id: 'trf_c3d5e8f2',
amount: 500.00,
currency: 'GBP',
destination_type: 'external'
})| 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' |
transfer_completed
A transfer has settled successfully.
datafly.track('transfer_completed', {
transfer_id: 'trf_c3d5e8f2',
amount: 500.00,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
transfer_id | string | No | Unique transfer reference |
amount | number | No | Transferred amount |
currency | string | No | ISO 4217 currency code |
Cards & Lending
Events covering card applications and loan lifecycle.
card_applied
A customer has submitted an application for a card product.
datafly.track('card_applied', {
card_type: 'credit',
credit_limit_requested: 3000
})| Property | Type | Required | Description |
|---|---|---|---|
card_type | string | No | Card type: 'credit', 'debit', 'prepaid' |
credit_limit_requested | number | No | Requested credit limit (credit cards only) |
card_approved
A card application has been approved.
datafly.track('card_approved', {
card_type: 'credit',
credit_limit: 2500
})| Property | Type | Required | Description |
|---|---|---|---|
card_type | string | No | Card type approved |
credit_limit | number | No | Approved credit limit |
card_activated
A card has been activated by the customer.
datafly.track('card_activated', {
card_type: 'credit',
channel: 'app'
})| Property | Type | Required | Description |
|---|---|---|---|
card_type | string | No | Type of card activated |
channel | string | No | Activation channel: 'app', 'web', 'ivr' |
loan_applied
A customer has submitted a loan application.
datafly.track('loan_applied', {
loan_type: 'personal',
amount_requested: 10000,
currency: 'GBP',
term_months: 36
})| 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 |
loan_approved
A loan application has been approved.
datafly.track('loan_approved', {
loan_type: 'personal',
amount_approved: 8000,
currency: 'GBP',
interest_rate: 6.9,
term_months: 36
})| 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 |
loan_funded
The approved loan amount has been disbursed to the customer. This is typically the revenue-recognised conversion for lending campaigns.
datafly.track('loan_funded', {
loan_id: 'loan_7e4a1f2b',
amount: 8000,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
loan_id | string | No | Unique loan identifier |
amount | number | No | Disbursed amount |
currency | string | No | ISO 4217 currency code |
Investments & Trading
Events covering funding, trading, and portfolio activity on investment and wealth platforms.
deposit_made
A customer has funded their account or wallet.
datafly.track('deposit_made', {
deposit_id: 'dep_1f9a3c7e',
amount: 1000.00,
currency: 'GBP',
funding_method: 'bank_transfer'
})| Property | Type | Required | Description |
|---|---|---|---|
deposit_id | string | No | Unique deposit reference — used for deduplication |
amount | number | No | Amount deposited |
currency | string | No | ISO 4217 currency code |
funding_method | string | No | Funding method (e.g. 'card', 'bank_transfer', 'open_banking') |
withdrawal_made
A customer has withdrawn funds from their account or wallet.
datafly.track('withdrawal_made', {
withdrawal_id: 'wdr_4b2e8d1a',
amount: 250.00,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
withdrawal_id | string | No | Unique withdrawal reference |
amount | number | No | Amount withdrawn |
currency | string | No | ISO 4217 currency code |
trade_executed
A buy or sell order has been executed.
datafly.track('trade_executed', {
trade_id: 'trd_6c9f2a4b',
side: 'buy',
instrument_type: 'equity',
symbol: 'VWRL',
amount: 500.00,
currency: 'GBP'
})| Property | Type | Required | Description |
|---|---|---|---|
trade_id | string | No | Unique trade reference |
side | string | No | Direction: 'buy', 'sell' |
instrument_type | string | No | Asset type: 'equity', 'etf', 'crypto', 'fund', 'bond' |
symbol | string | No | Ticker or instrument symbol |
amount | number | No | Trade value |
currency | string | No | ISO 4217 currency code |
portfolio_funded
A customer has funded a portfolio or investment product for the first time. Often the key activation conversion for wealth platforms.
datafly.track('portfolio_funded', {
portfolio_id: 'pf_8d3a1c6e',
amount: 5000.00,
currency: 'GBP',
product_type: 'stocks_and_shares_isa'
})| Property | Type | Required | Description |
|---|---|---|---|
portfolio_id | string | No | Unique portfolio reference |
amount | number | No | Amount funded |
currency | string | No | ISO 4217 currency code |
product_type | string | No | Product wrapper (e.g. 'stocks_and_shares_isa', 'general_investment', 'pension') |
subscription_started
A customer has started a recurring subscription or premium plan (e.g. a paid account tier or advice service).
datafly.track('subscription_started', {
plan: 'premium',
amount: 9.99,
currency: 'GBP',
billing_period: 'monthly'
})| Property | Type | Required | Description |
|---|---|---|---|
plan | string | No | Plan name or tier (e.g. 'premium', 'metal') |
amount | number | No | Recurring charge amount |
currency | string | No | ISO 4217 currency code |
billing_period | string | No | Billing cadence: 'monthly', 'annual' |
Account Management
Events covering account self-service and financial management features that drive retention and engagement.
statement_viewed
A customer has viewed an account statement.
datafly.track('statement_viewed', {
account_type: 'current',
period: '2026-02'
})| 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') |
alert_created
A customer has set up a balance or activity alert.
datafly.track('alert_created', {
alert_type: 'low_balance',
threshold: 100
})| 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 |
budget_created
A customer has created a spending budget for a category.
datafly.track('budget_created', {
budget_id: 'bgt_2a3f9c1d',
category: 'eating_out',
amount: 200,
currency: 'GBP'
})| 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 |
Items Array Schema
Several discovery events accept an items array describing the financial products being viewed or compared. Each object can include the following properties using GA4-style field names. Signal’s server-side blueprints automatically transform these to vendor-specific formats (e.g., Meta’s contents[] with id/title fields).
| Property | Type | Description |
|---|---|---|
item_id | string | Your internal product ID (e.g. sav-fixed-1yr) |
item_name | string | Product display name |
item_category | string | Product category (e.g. Savings, Credit Cards, Loans) |
item_brand | string | Brand or sub-brand name |
item_variant | string | Product variant (e.g. term, tier) |
price | number | Indicative price, fee, or rate where applicable |
index | number | Position in list (0-indexed, relevant in list/comparison contexts) |
currency | string | ISO 4217 currency code |
item_list_id | string | Identifier of the list the product was shown in |
item_list_name | string | Name of the list the product was shown in |
Vendor Mapping
The table below shows how Datafly Signal maps finance events to the native event names expected by each vendor’s server-side API. Signal uses the GA4-style event names as its canonical format, and blueprints handle the transformation to vendor-specific payloads. Where a vendor has no native equivalent, the event is delivered as a custom event, shown as (custom).
| Signal Event | GA4 | Meta CAPI | TikTok Events API |
|---|---|---|---|
search | search | Search | Search |
view_item | view_item | ViewContent | ViewContent |
view_item_list | view_item_list | ViewContent | ViewContent |
select_item | select_item | ViewContent | ClickButton |
quote_requested | quote_requested (custom) | Lead | SubmitForm |
eligibility_checked | eligibility_checked (custom) | Lead | SubmitForm |
generate_lead | generate_lead | Lead | SubmitForm |
application_started | application_started (custom) | InitiateCheckout | InitiateCheckout |
application_submitted | application_submitted (custom) | SubmitApplication | SubmitForm |
sign_up | sign_up | CompleteRegistration | CompleteRegistration |
account_opened | account_opened (custom) | CompleteRegistration | CompleteRegistration |
account_closed | account_closed (custom) | (custom) | (custom) |
kyc_started | kyc_started (custom) | (custom) | (custom) |
kyc_completed | kyc_completed (custom) | (custom) | (custom) |
kyc_failed | kyc_failed (custom) | (custom) | (custom) |
login | login | (custom) | (custom) |
login_attempted | login_attempted (custom) | (custom) | (custom) |
login_succeeded | login_succeeded (custom) | (custom) | (custom) |
login_failed | login_failed (custom) | (custom) | (custom) |
transaction_initiated | transaction_initiated (custom) | InitiateCheckout | InitiateCheckout |
transaction_completed | transaction_completed (custom) | Purchase | CompletePayment |
transaction_failed | transaction_failed (custom) | (custom) | (custom) |
payment_made | payment_made (custom) | Purchase | CompletePayment |
payment_completed | payment_completed (custom) | Purchase | CompletePayment |
payment_failed | payment_failed (custom) | (custom) | (custom) |
invoice_paid | invoice_paid (custom) | Purchase | CompletePayment |
transfer_initiated | transfer_initiated (custom) | (custom) | (custom) |
transfer_completed | transfer_completed (custom) | (custom) | (custom) |
card_applied | card_applied (custom) | InitiateCheckout | InitiateCheckout |
card_approved | card_approved (custom) | SubmitApplication | SubmitForm |
card_activated | card_activated (custom) | (custom) | (custom) |
loan_applied | loan_applied (custom) | InitiateCheckout | InitiateCheckout |
loan_approved | loan_approved (custom) | SubmitApplication | SubmitForm |
loan_funded | loan_funded (custom) | Purchase | CompletePayment |
deposit_made | deposit_made (custom) | Purchase | CompletePayment |
withdrawal_made | withdrawal_made (custom) | (custom) | (custom) |
trade_executed | trade_executed (custom) | Purchase | CompletePayment |
portfolio_funded | portfolio_funded (custom) | Purchase | CompletePayment |
subscription_started | subscription_started (custom) | Subscribe | Subscribe |
statement_viewed | statement_viewed (custom) | (custom) | (custom) |
alert_created | alert_created (custom) | (custom) | (custom) |
budget_created | budget_created (custom) | (custom) | (custom) |