Denmark SMS Best Practices, Compliance, and Features
Denmark SMS Market Overview
Locale name: | Denmark |
---|---|
ISO code: | DK |
Region | Europe |
Mobile country code (MCC) | 238 |
Dialing Code | +45 |
Market Conditions: Denmark has a highly developed mobile market with near-universal smartphone penetration. While OTT messaging apps like WhatsApp and Facebook Messenger are popular for personal communications, SMS remains crucial for business communications, particularly for authentication, notifications, and marketing. The market is dominated by three major operators: TDC, Telenor, and Telia, with Android and iOS having roughly equal market share.
Key SMS Features and Capabilities in Denmark
Denmark offers comprehensive SMS capabilities including two-way messaging, concatenated messages, and number portability, though MMS is handled through SMS conversion with embedded URLs.
Two-way SMS Support
Denmark fully supports two-way SMS communications with no special restrictions. This enables interactive messaging campaigns and customer service applications through SMS.
Concatenated Messages (Segmented SMS)
Support: Yes, concatenated messages are fully supported across all Danish mobile networks.
Message length rules: Standard GSM-7 encoding allows 160 characters per segment, while Unicode (UCS-2) allows 70 characters per segment.
Encoding considerations: GSM-7 is recommended for basic Latin alphabet messages to maximize character count. UCS-2 should be used when sending messages containing special characters or non-Latin alphabets.
MMS Support
MMS messages are automatically converted to SMS with an embedded URL link to the multimedia content. This ensures reliable delivery while maintaining the ability to share rich media content. Best practice is to use short, branded URLs and include clear instructions for accessing the content.
Recipient Phone Number Compatibility
Number Portability
Number portability is fully available in Denmark, allowing users to keep their phone numbers when switching carriers. This feature doesn't impact SMS delivery or routing as the Danish telecommunications infrastructure handles porting transparently.
Sending SMS to Landlines
Sending SMS to landline numbers is not supported in Denmark. Attempts to send messages to landline numbers will result in a failed delivery and a 400 response error (code 21614) from the API. These messages won't appear in logs and won't incur charges.
Compliance and Regulatory Guidelines for SMS in Denmark
Denmark follows strict GDPR compliance requirements and is regulated by the Danish Business Authority (Erhvervsstyrelsen) and the Danish Data Protection Agency (Datatilsynet). SMS marketing must comply with both the Danish Marketing Practices Act and EU privacy regulations.
Consent and Opt-In
Explicit Consent Requirements:
- Written or digital confirmation of opt-in is mandatory before sending marketing messages
- Consent must be freely given, specific, and informed
- Double opt-in is recommended for marketing campaigns
- Records of consent must be maintained and easily accessible
- Purpose of messaging must be clearly stated during opt-in
HELP/STOP and Other Commands
- All marketing messages must include clear opt-out instructions
- STOP command must be supported in both Danish ("STOP") and English
- HELP command must provide information in Danish about the service
- Common Danish keywords like "AFMELD" (unsubscribe) should also be supported
- Response to opt-out commands must be immediate and confirmed
Do Not Call / Do Not Disturb Registries
Denmark maintains the Robinson List (Robinson-listen), a national do-not-contact registry. Best practices include:
- Regular checking against the Robinson List
- Maintaining internal suppression lists
- Immediate processing of opt-out requests
- Proactive filtering of registered numbers
- Keeping opt-out records for at least 2 years
Time Zone Sensitivity
Denmark observes Central European Time (CET/CEST). Recommended sending hours:
- Business days: 8:00 AM to 8:00 PM CET
- Weekends: 9:00 AM to 6:00 PM CET
- Avoid sending during major holidays
- Emergency messages exempt from time restrictions
Phone Numbers Options and SMS Sender Types for Denmark
Alphanumeric Sender ID
Operator network capability: Fully supported
Registration requirements: No pre-registration required, dynamic usage allowed
Sender ID preservation: Yes, sender IDs are preserved as-is across all major networks
Long Codes
Domestic vs. International: Both supported with full functionality
Sender ID preservation: Yes, Denmark preserves original Sender IDs
Provisioning time: Immediate to 24 hours
Use cases: Ideal for two-way communication, customer service, and transactional messages
Short Codes
Support: Not currently supported in Denmark
Provisioning time: N/A
Use cases: N/A
Restricted SMS Content, Industries, and Use Cases
Prohibited Content and Industries:
- Gambling and lottery services
- Adult content
- Unauthorized financial services
- Political messaging without proper disclosure
- Cryptocurrency promotions without proper authorization
Content Filtering
Known Carrier Filtering Rules:
- URLs must be pre-registered to avoid filtering
- URL shorteners are generally blocked
- Keywords related to restricted industries trigger filters
- Multiple exclamation marks or all-caps messages may be filtered
Tips to Avoid Filtering:
- Register all domains and URLs
- Use approved sender IDs
- Avoid spam-like language
- Maintain consistent sending patterns
- Include clear company identification
Best Practices for Sending SMS in Denmark
Messaging Strategy
- Keep messages under 160 characters when possible
- Include clear call-to-actions
- Personalize using recipient's name or relevant data
- Maintain consistent branding
- Use clear, professional language
Sending Frequency and Timing
- Limit to 2-4 messages per month per recipient
- Respect Danish holidays and vacation periods
- Avoid sending during weekend evenings
- Space out bulk campaigns to prevent network congestion
Localization
- Primary language should be Danish
- Consider bilingual messages (Danish/English) for international audiences
- Use proper Danish character encoding
- Respect local cultural norms and expressions
Opt-Out Management
- Process opt-outs within 24 hours
- Maintain centralized opt-out database
- Confirm opt-out with one final message
- Regular audit of opt-out lists
- Train staff on opt-out procedures
Testing and Monitoring
- Test across all major Danish carriers
- Monitor delivery rates by carrier
- Track engagement metrics
- Regular content and URL testing
- A/B test message formats and timing
SMS API integrations for Denmark
Twilio
Twilio provides a robust SMS API with comprehensive support for Danish numbers and messaging requirements.
import { Twilio } from 'twilio';
// Initialize Twilio client with your credentials
const client = new Twilio(
process.env.TWILIO_ACCOUNT_SID,
process.env.TWILIO_AUTH_TOKEN
);
// Function to validate Danish phone numbers
const validateDanishNumber = (phoneNumber: string): boolean => {
return /^\+45[0-9]{8}$/.test(phoneNumber);
};
// Send SMS to Denmark with error handling
async function sendDanishSMS(
to: string,
message: string,
senderId: string
): Promise<void> {
try {
if (!validateDanishNumber(to)) {
throw new Error('Invalid Danish phone number format');
}
const response = await client.messages.create({
body: message,
from: senderId, // Alphanumeric or long code
to: to,
// Optional parameters for delivery tracking
statusCallback: 'https://your-webhook.com/status'
});
console.log(`Message sent successfully: ${response.sid}`);
} catch (error) {
console.error('SMS sending failed:', error);
throw error;
}
}
Sinch
Sinch offers direct operator connections in Denmark with high delivery rates.
import axios from 'axios';
interface SinchSMSResponse {
id: string;
status: string;
}
class SinchSMSClient {
private readonly baseUrl: string;
private readonly apiToken: string;
constructor(serviceId: string, apiToken: string) {
this.baseUrl = `https://sms.api.sinch.com/xms/v1/${serviceId}`;
this.apiToken = apiToken;
}
async sendSMS(
to: string,
message: string,
senderId: string
): Promise<SinchSMSResponse> {
try {
const response = await axios.post(
`${this.baseUrl}/batches`,
{
from: senderId,
to: [to],
body: message,
delivery_report: 'summary'
},
{
headers: {
'Authorization': `Bearer ${this.apiToken}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
} catch (error) {
console.error('Sinch SMS error:', error);
throw error;
}
}
}
MessageBird
MessageBird provides reliable SMS delivery with detailed delivery reporting.
import { MessageBird } from 'messagebird';
class MessageBirdClient {
private client: MessageBird;
constructor(apiKey: string) {
this.client = new MessageBird(apiKey);
}
async sendSMS(
to: string,
message: string,
originator: string
): Promise<void> {
return new Promise((resolve, reject) => {
this.client.messages.create({
originator,
recipients: [to],
body: message,
datacoding: 'auto' // Automatic handling of special characters
}, (err, response) => {
if (err) {
reject(err);
return;
}
resolve(response);
});
});
}
}
Plivo
Plivo offers competitive pricing and good coverage in Denmark.
import plivo from 'plivo';
class PlivoSMSClient {
private client: plivo.Client;
constructor(authId: string, authToken: string) {
this.client = new plivo.Client(authId, authToken);
}
async sendSMS(
to: string,
message: string,
senderId: string
): Promise<any> {
try {
const response = await this.client.messages.create({
src: senderId,
dst: to,
text: message,
url: 'https://your-webhook.com/delivery-report'
});
return response;
} catch (error) {
console.error('Plivo SMS error:', error);
throw error;
}
}
}
API Rate Limits and Throughput
- Twilio: 100 messages per second
- Sinch: 250 messages per second
- MessageBird: 60 messages per second
- Plivo: 50 messages per second
Strategies for Large-Scale Sending:
- Implement queue systems (Redis/RabbitMQ)
- Use batch APIs where available
- Implement exponential backoff for retries
- Monitor throughput and adjust accordingly
Error Handling and Reporting
- Implement comprehensive logging with Winston or Bunyan
- Track delivery rates and failures by carrier
- Set up automated alerts for error thresholds
- Store delivery receipts for analysis
- Implement retry logic for temporary failures
Recap and Additional Resources
Key Takeaways
- Compliance First: Always obtain explicit consent and honor opt-outs
- Technical Setup: Use proper phone number formatting (+45) and character encoding
- Content Guidelines: Register URLs and avoid restricted content
- Timing: Respect Danish business hours and holidays
- Testing: Verify delivery across all major carriers
Next Steps
- Review the Danish Marketing Practices Act
- Implement proper consent management
- Set up monitoring and reporting systems
- Test thoroughly before full deployment