Businesses today have multiple mobile communication channels. SMS and push notifications both reach users on their phones, but they serve different purposes. This guide helps you choose the right channel for each use case.
Understanding the Differences
SMS (Short Message Service)
Pros:
- Works on all phones (98% delivery rate)
- No app installation required
- Very high open rates (98%)
- Works without internet
- Professional and trusted
Cons:
- Cost per message
- 160-character limit
- No rich media
- Regulatory compliance required
Push Notifications
Pros:
- Free to send
- Rich media support
- No character limit
- Deep linking capabilities
- Action buttons
- Higher engagement when app is installed
Cons:
- Requires app installation
- Can be disabled by users
- Lower delivery rates
- Requires internet connection
- Platform-specific (iOS/Android)
When to Use SMS
Critical Communications
Use SMS for messages that must reach every user:
Transaction Codes
- 2FA verification codes
- Password reset links
- Order confirmations
- Shipping notifications
Time-Sensitive Alerts
- Appointment reminders
- Flight updates
- Emergency notifications
- Payment due dates
High-Value Communications
- Account security alerts
- Financial transaction confirmations
- Legal notifications
- Important updates
SMS Implementation
// Use SMS for critical updates
export async function sendCriticalAlert(userId: string, message: string) {
const user = await db.users.findUnique({ where: { id: userId } });
// SMS ensures delivery even if app isn't installed
await sendSMS(user.phoneNumber, message);
// Also send push if app is installed
if (user.hasAppInstalled) {
await sendPushNotification(userId, message);
}
}When to Use Push Notifications
Engagement and Retention
Use push for app engagement and retention:
Feature Updates
- New feature announcements
- Product updates
- Content recommendations
- Social interactions
Behavioral Triggers
- "You haven't visited in a while"
- "New items matching your interests"
- "Your friend just joined"
- "Sale starting soon"
Rich Content
- Image-rich notifications
- Video previews
- Interactive buttons
- Deep links to specific app screens
Push Implementation
// Use push for engagement
export async function sendNewFeatureAnnouncement(userId: string) {
const pushPayload = {
notification: {
title: 'New Feature Available!',
body: 'Check out our latest update',
icon: 'icon.png',
image: 'feature-preview.png',
},
data: {
deepLink: '/features/new',
action: 'view_feature',
},
actions: [
{ action: 'view', title: 'View Now' },
{ action: 'dismiss', title: 'Later' },
],
};
await sendPushNotification(userId, pushPayload);
}Comparative Use Cases
E-commerce
Order Confirmation
- ✅ SMS: Required for receipt
- ✅ Push: Nice to have, but not critical
Shipping Update
- ✅ SMS: Essential for delivery updates
- ✅ Push: Optional, provides tracking link
Cart Abandonment
- ✅ SMS: High recovery rate
- ✅ Push: Good for app users
Sale Announcement
- ✅ SMS: For VIP customers
- ✅ Push: For broader audience
Finance
Transaction Alert
- ✅ SMS: Required for security
- ✅ Push: Quick access to app
Bill Due Reminder
- ✅ SMS: Ensures delivery
- ✅ Push: Easy payment access
Large Purchase Detection
- ✅ SMS: Fraud prevention
- ✅ Push: App deep link
Healthcare
Appointment Reminder
- ✅ SMS: High reliability
- ✅ Push: Easy rescheduling
Prescription Ready
- ✅ SMS: Pickup notification
- ✅ Push: Link to pharmacy details
Test Results
- ✅ SMS: Privacy-focused delivery
- ✅ Push: Secure app access
User Preferences
Let Users Choose
interface NotificationPreferences {
transactionalSMS: boolean;
transactionalPush: boolean;
marketingSMS: boolean;
marketingPush: boolean;
quietHours: {
enabled: boolean;
start: string; // "22:00"
end: string; // "08:00"
};
}
export async function respectUserPreferences(
userId: string,
message: string,
type: 'transactional' | 'marketing'
) {
const prefs = await getNotificationPreferences(userId);
// Check quiet hours for marketing
if (type === 'marketing' && prefs.quietHours.enabled) {
if (isInQuietHours(prefs.quietHours)) {
return; // Skip sending
}
}
// Send based on preferences
if (type === 'transactional') {
if (prefs.transactionalSMS) {
await sendSMS(userId, message);
}
if (prefs.transactionalPush) {
await sendPushNotification(userId, message);
}
} else {
if (prefs.marketingSMS) {
await sendSMS(userId, message);
}
if (prefs.marketingPush) {
await sendPushNotification(userId, message);
}
}
}Cost Considerations
SMS Costs
- United States: ~$0.0075 per message
- International: $0.05 - $0.10 per message
- Volume discounts available
Push Costs
- Free to send
- Development and maintenance costs
- Infrastructure costs
Cost-Effective Strategy
export async function optimizeCosts(userId: string, message: string) {
const user = await db.users.findUnique({ where: { id: userId } });
// Use push for app users (free)
if (user.hasAppInstalled && user.lastAppOpen > thirtyDaysAgo) {
await sendPushNotification(userId, message);
return { method: 'push', cost: 0 };
}
// Use SMS for non-app users (costs money)
await sendSMS(user.phoneNumber, message);
return { method: 'sms', cost: 0.0075 };
}Best Practices
For SMS
- 1Keep it concise: Respect 160-character limit
- 2Personalize: Use recipient's name when appropriate
- 3Include opt-out: Always provide unsubscribe option
- 4Time wisely: Send during business hours
- 5Value over volume: Send only important messages
For Push Notifications
- 1Rich content: Use images, videos, and action buttons
- 2Deep links: Link directly to relevant content
- 3Personalize: Base on user behavior and preferences
- 4Segment: Send relevant content to specific groups
- 5Test: A/B test messages and timing
Combined Strategy
The most effective approach uses both channels:
export async function optimalNotificationStrategy(
userId: string,
message: string,
priority: 'critical' | 'high' | 'normal' | 'low'
) {
const user = await db.users.findUnique({ where: { id: userId } });
switch (priority) {
case 'critical':
// Send both SMS and push
await sendSMS(user.phoneNumber, message);
if (user.hasAppInstalled) {
await sendPushNotification(userId, message);
}
break;
case 'high':
// Send SMS first, push as backup
const smsResult = await sendSMS(user.phoneNumber, message);
if (!smsResult.success && user.hasAppInstalled) {
await sendPushNotification(userId, message);
}
break;
case 'normal':
// Send push if app installed, otherwise SMS
if (user.hasAppInstalled && user.lastAppOpen > thirtyDaysAgo) {
await sendPushNotification(userId, message);
} else {
await sendSMS(user.phoneNumber, message);
}
break;
case 'low':
// Send push only
if (user.hasAppInstalled) {
await sendPushNotification(userId, message);
}
break;
}
}Conclusion
Neither SMS nor push notifications are universally better. The right choice depends on:
- Message importance: Critical messages need SMS
- User app usage: Active app users prefer push
- Cost considerations: Push is free, SMS costs money
- Rich media needs: Push supports images, videos
- Regulatory requirements: Some messages require SMS
The optimal strategy often uses both channels strategically:
- SMS for critical, transactional messages
- Push for engagement, retention, and rich content
Let user preferences guide your choice, and always provide value over volume.