Fintech push notifications are the most time-sensitive notifications on a user's phone. A fraud alert needs to open the card freeze screen instantly. A payment reminder needs to open the payment form. A price alert needs to open the asset page while the price is still relevant. Deep links make these notifications actionable.
This guide covers push notification deep linking patterns for fintech apps. For general push notification strategy, see push notification strategy. For fintech deep linking, see deep linking for fintech and banking apps.
Notification Categories
Security Notifications (Critical)
These require immediate action and should deep link to the relevant security screen:
{
"title": "Suspicious activity detected",
"body": "Unusual login attempt from a new device in Berlin, Germany",
"deep_link": "https://links.finapp.com/settings/security",
"category": "security_alert",
"priority": "critical",
"sound": "alert"
}
{
"title": "Card frozen",
"body": "Your card ending in 4589 was frozen due to suspicious activity",
"deep_link": "https://links.finapp.com/cards/CARD-456",
"category": "card_frozen",
"priority": "critical"
}
Transaction Notifications (High)
{
"title": "Purchase: $45.00",
"body": "Whole Foods Market - Debit card ending in 4589",
"deep_link": "https://links.finapp.com/transactions/TXN-12345",
"category": "transaction",
"priority": "high"
}
{
"title": "Direct deposit received",
"body": "$3,200.00 from Acme Corp",
"deep_link": "https://links.finapp.com/accounts/ACC-789/transactions",
"category": "deposit",
"priority": "high"
}
Payment Notifications (High)
{
"title": "Payment due tomorrow",
"body": "Credit card payment of $850.00 is due July 15",
"deep_link": "https://links.finapp.com/payments/make",
"category": "payment_due",
"priority": "high"
}
{
"title": "Payment successful",
"body": "Your payment of $850.00 was processed",
"deep_link": "https://links.finapp.com/payments",
"category": "payment_confirmed",
"priority": "normal"
}
Investment Notifications (Normal)
{
"title": "AAPL hit your price target",
"body": "Apple Inc. reached $195.00 (+2.3%)",
"deep_link": "https://links.finapp.com/stocks/AAPL",
"category": "price_alert",
"priority": "normal"
}
{
"title": "Dividend received",
"body": "$12.50 dividend from VTI added to your account",
"deep_link": "https://links.finapp.com/portfolio",
"category": "dividend",
"priority": "normal"
}
Engagement Notifications (Low)
{
"title": "Weekly spending summary",
"body": "You spent $620 this week. Tap to see the breakdown.",
"deep_link": "https://links.finapp.com/transactions/categories",
"category": "spending_summary",
"priority": "low"
}
Handling Deep Links from Notifications
iOS Implementation
// In AppDelegate or SceneDelegate
func userNotificationCenter(_ center: UNUserNotificationCenter,
didReceive response: UNNotificationResponse,
withCompletionHandler completionHandler: @escaping () -> Void) {
let userInfo = response.notification.request.content.userInfo
guard let deepLinkString = userInfo["deep_link"] as? String,
let deepLinkUrl = URL(string: deepLinkString) else {
completionHandler()
return
}
let category = userInfo["category"] as? String ?? "unknown"
// Security notifications require biometric before showing content
if category.hasPrefix("security") || category == "card_frozen" {
requestBiometric { success in
if success {
self.handleDeepLink(deepLinkUrl)
}
completionHandler()
}
} else {
handleDeepLink(deepLinkUrl)
completionHandler()
}
}
Android Implementation
class NotificationDeepLinkReceiver : FirebaseMessagingService() {
override fun onMessageReceived(message: RemoteMessage) {
val deepLink = message.data["deep_link"] ?: return
val category = message.data["category"] ?: "unknown"
val priority = message.data["priority"] ?: "normal"
val channelId = when (priority) {
"critical" -> "security_channel"
"high" -> "transactions_channel"
else -> "general_channel"
}
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(deepLink)).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
}
val pendingIntent = PendingIntent.getActivity(
this, 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
showNotification(
channelId = channelId,
title = message.notification?.title ?: "",
body = message.notification?.body ?: "",
pendingIntent = pendingIntent,
priority = priority
)
}
}
Notification Channels and Priority
Android Notification Channels
Fintech apps should use separate channels for different notification types:
fun createNotificationChannels(context: Context) {
val manager = context.getSystemService(NotificationManager::class.java)
// Critical: Security alerts (cannot be silenced)
val security = NotificationChannel("security_channel", "Security Alerts",
NotificationManager.IMPORTANCE_HIGH).apply {
description = "Fraud alerts and security notifications"
setBypassDnd(true)
}
// High: Transaction alerts
val transactions = NotificationChannel("transactions_channel", "Transactions",
NotificationManager.IMPORTANCE_DEFAULT).apply {
description = "Transaction confirmations and alerts"
}
// Normal: Account updates
val account = NotificationChannel("account_channel", "Account Updates",
NotificationManager.IMPORTANCE_LOW).apply {
description = "Statements, balances, and account activity"
}
manager.createNotificationChannels(listOf(security, transactions, account))
}
iOS Notification Categories with Actions
Add actions directly to fintech notifications:
let freezeAction = UNNotificationAction(identifier: "FREEZE_CARD",
title: "Freeze Card", options: [.destructive])
let reviewAction = UNNotificationAction(identifier: "REVIEW_ACTIVITY",
title: "Review Activity", options: [.foreground])
let fraudCategory = UNNotificationCategory(identifier: "fraud_alert",
actions: [freezeAction, reviewAction],
intentIdentifiers: [])
When the user taps "Freeze Card," the app deep links to the card management screen with the freeze action pre-triggered.
Security Considerations
Sensitive Data in Notifications
Never include full account numbers, balances, or PII in push notification text:
BAD: "Account 1234567890 balance: $5,430.50"
GOOD: "Account ending in 7890: new transaction"
The notification text is visible on the lock screen. The deep link opens the app where the user can see full details after authentication.
Authentication After Notification Tap
Security-sensitive notifications should require authentication before showing content:
- User taps notification.
- App opens with a biometric/PIN prompt.
- After authentication, navigate to the deep linked screen.
Do not skip authentication even though the user "just tapped a notification." The phone could be in someone else's hands.
Rate Limiting
Rate limit notifications to prevent notification fatigue and potential abuse:
| Category | Maximum Frequency |
|---|---|
| Transaction alerts | Every transaction (user-controlled) |
| Security alerts | No limit (always send) |
| Payment reminders | 1 per payment, 3 max reminders |
| Spending summaries | Weekly |
| Promotional | 2-3 per week max |
Measuring Notification Performance
| Metric | What It Measures |
|---|---|
| Delivery rate | Notifications successfully delivered |
| Open rate | Notifications tapped by the user |
| Deep link success rate | Taps that successfully opened the correct screen |
| Action completion rate | Users who completed the intended action (e.g., made a payment) |
| Opt-out rate | Users who disabled notifications |
Track the deep link success rate separately from the open rate. If users tap notifications but do not land on the correct screen, the deep linking implementation has issues.
Tolinku for Fintech Notifications
Tolinku deep links work in push notification payloads. Include the Tolinku link URL as the deep_link parameter in your notification payload. The app's Tolinku SDK handles routing to the correct screen. Configure your routes in the Tolinku dashboard.
For e-commerce push deep links, see e-commerce push deep links. For fintech deep linking, see deep linking for fintech and banking apps.
Get deep linking tips in your inbox
One email per week. No spam.