Skip to main content

Delivery Reports & Logs

Track message delivery status, analyze performance metrics, and troubleshoot delivery issues with comprehensive reporting and logging.

Delivery Status Typesโ€‹

Status Codesโ€‹

  • Sent: Message submitted to carrier
  • Delivered: Successfully delivered to recipient
  • Failed: Delivery failed (invalid number, blocked, etc.)
  • Pending: Awaiting delivery confirmation
  • Expired: Message expired before delivery

Detailed Status Codesโ€‹

# Get detailed status information
lineserve messaging get-delivery-status \
--message-id msg-12345 \
--include-details
CodeStatusDescription
1000DeliveredSuccessfully delivered
2000FailedInvalid phone number
2001FailedBlocked by carrier
2002FailedInsufficient credit
3000PendingQueued for delivery

Real-time Delivery Trackingโ€‹

Webhooksโ€‹

# Configure delivery webhooks
lineserve messaging set-webhook \
--url "https://yourapp.com/webhook/delivery" \
--events "delivered,failed,pending" \
--secret "your-webhook-secret"

Webhook Payloadโ€‹

{
"event": "message.delivered",
"timestamp": "2024-01-15T10:30:00Z",
"message_id": "msg-12345",
"campaign_id": "camp-67890",
"phone": "+1234567890",
"status": "delivered",
"carrier": "Verizon",
"cost": 0.0075,
"delivery_time": "2024-01-15T10:30:15Z"
}

Processing Webhooksโ€‹

# Python webhook handler
from flask import Flask, request
import hmac
import hashlib

app = Flask(__name__)

@app.route('/webhook/delivery', methods=['POST'])
def delivery_webhook():
# Verify webhook signature
signature = request.headers.get('X-Lineserve-Signature')
payload = request.get_data()

expected = hmac.new(
b'your-webhook-secret',
payload,
hashlib.sha256
).hexdigest()

if signature == expected:
data = request.json

if data['event'] == 'message.delivered':
# Update delivery status in your database
update_message_status(data['message_id'], 'delivered')
elif data['event'] == 'message.failed':
# Handle failed delivery
handle_failed_delivery(data)

return 'OK'

Delivery Reportsโ€‹

Campaign Reportsโ€‹

# Generate campaign delivery report
lineserve messaging get-campaign-report \
--campaign-id camp-12345 \
--format json \
--include-details

# Export to CSV
lineserve messaging export-campaign-report \
--campaign-id camp-12345 \
--format csv \
--output campaign-report.csv

Bulk Message Reportsโ€‹

# Get delivery report for multiple messages
lineserve messaging get-bulk-report \
--message-ids "msg-1,msg-2,msg-3" \
--format json

# Get report by date range
lineserve messaging get-delivery-report \
--start-date "2024-01-01" \
--end-date "2024-01-31" \
--status "all"

Report Data Structureโ€‹

{
"campaign_id": "camp-12345",
"campaign_name": "Summer Sale",
"total_messages": 10000,
"delivered": 9850,
"failed": 150,
"pending": 0,
"delivery_rate": 98.5,
"average_delivery_time": "00:00:45",
"cost_total": 75.00,
"messages": [
{
"message_id": "msg-12345",
"phone": "+1234567890",
"status": "delivered",
"sent_at": "2024-01-15T10:00:00Z",
"delivered_at": "2024-01-15T10:00:30Z",
"carrier": "Verizon",
"cost": 0.0075
}
]
}

Message Logsโ€‹

Accessing Logsโ€‹

# View recent message logs
lineserve messaging get-logs \
--limit 100 \
--status "failed"

# Search logs by phone number
lineserve messaging search-logs \
--phone "+1234567890" \
--start-date "2024-01-01"

# Filter logs by campaign
lineserve messaging get-logs \
--campaign-id camp-12345 \
--include-content

Log Entry Formatโ€‹

{
"log_id": "log-67890",
"timestamp": "2024-01-15T10:00:00Z",
"message_id": "msg-12345",
"campaign_id": "camp-67890",
"phone": "+1234567890",
"sender_id": "YourBrand",
"message": "Your order has shipped!",
"status": "delivered",
"carrier": "Verizon",
"country": "US",
"cost": 0.0075,
"delivery_time": 30,
"error_code": null,
"error_message": null
}

Analytics Dashboardโ€‹

Key Metricsโ€‹

# Get delivery analytics
lineserve messaging get-analytics \
--metric "delivery_rate" \
--period "last_30_days" \
--group-by "day"

# Carrier performance analysis
lineserve messaging analyze-carriers \
--start-date "2024-01-01" \
--end-date "2024-01-31"

Performance Metricsโ€‹

  • Delivery Rate: Percentage of successfully delivered messages
  • Average Delivery Time: Time from send to delivery
  • Failure Rate: Percentage of failed deliveries
  • Cost per Message: Average cost per delivered message
  • Carrier Performance: Delivery rates by carrier

Custom Analyticsโ€‹

# Python analytics example
import requests
import pandas as pd

def get_delivery_analytics(start_date, end_date):
response = requests.get(
'https://api.lineserve.com/v1/messaging/analytics/delivery',
headers={'Authorization': 'Bearer YOUR_TOKEN'},
params={
'start_date': start_date,
'end_date': end_date,
'group_by': 'hour'
}
)

data = response.json()
df = pd.DataFrame(data['metrics'])

# Calculate delivery rate trends
df['delivery_rate'] = (df['delivered'] / df['total']) * 100

return df

# Generate analytics report
analytics = get_delivery_analytics('2024-01-01', '2024-01-31')
print(analytics.describe())

Troubleshooting Failed Deliveriesโ€‹

Common Failure Reasonsโ€‹

# Analyze failure reasons
lineserve messaging analyze-failures \
--start-date "2024-01-01" \
--end-date "2024-01-31" \
--group-by "error_code"

Failure Categoriesโ€‹

  • Invalid Numbers: Incorrect or non-existent phone numbers
  • Carrier Blocks: Messages blocked by carrier filters
  • Content Issues: Spam-like content or prohibited keywords
  • Rate Limits: Exceeded sending rate limits
  • Account Issues: Insufficient balance or suspended account

Retry Logicโ€‹

# Configure automatic retries
lineserve messaging set-retry-policy \
--max-retries 3 \
--retry-interval "5m,15m,1h" \
--retry-codes "3000,3001"

# Manual retry for failed messages
lineserve messaging retry-failed \
--campaign-id camp-12345 \
--error-codes "2001,3000"

Monitoring & Alertsโ€‹

Delivery Monitoringโ€‹

# Set up delivery rate alerts
lineserve messaging create-alert \
--name "Low Delivery Rate" \
--condition "delivery_rate < 95" \
--period "15m" \
--notification "email:admin@company.com"

# Monitor specific campaigns
lineserve messaging monitor-campaign \
--campaign-id camp-12345 \
--alert-threshold 90 \
--notification "slack:ops-channel"

Real-time Monitoringโ€‹

# Python monitoring script
import requests
import time

def monitor_delivery_rates():
while True:
response = requests.get(
'https://api.lineserve.com/v1/messaging/analytics/realtime',
headers={'Authorization': 'Bearer YOUR_TOKEN'}
)

data = response.json()
delivery_rate = data['delivery_rate']

if delivery_rate < 95:
send_alert(f"Delivery rate dropped to {delivery_rate}%")

time.sleep(300) # Check every 5 minutes

def send_alert(message):
# Send alert via email, Slack, etc.
pass

Data Export & Integrationโ€‹

Export Optionsโ€‹

# Export delivery data to CSV
lineserve messaging export-delivery-data \
--start-date "2024-01-01" \
--end-date "2024-01-31" \
--format csv \
--output delivery-report.csv

# Export to JSON for API integration
lineserve messaging export-delivery-data \
--campaign-id camp-12345 \
--format json \
--compress

Database Integrationโ€‹

-- SQL schema for delivery tracking
CREATE TABLE message_deliveries (
message_id VARCHAR(50) PRIMARY KEY,
campaign_id VARCHAR(50),
phone VARCHAR(20),
status VARCHAR(20),
sent_at TIMESTAMP,
delivered_at TIMESTAMP,
carrier VARCHAR(50),
cost DECIMAL(10,4),
error_code VARCHAR(10),
error_message TEXT
);

-- Index for performance
CREATE INDEX idx_campaign_status ON message_deliveries(campaign_id, status);
CREATE INDEX idx_phone_date ON message_deliveries(phone, sent_at);

API Integrationโ€‹

# Sync delivery data to your database
import requests
import sqlite3

def sync_delivery_data():
# Get recent delivery updates
response = requests.get(
'https://api.lineserve.com/v1/messaging/delivery-updates',
headers={'Authorization': 'Bearer YOUR_TOKEN'},
params={'since': get_last_sync_time()}
)

updates = response.json()

# Update local database
conn = sqlite3.connect('deliveries.db')
for update in updates['data']:
conn.execute('''
INSERT OR REPLACE INTO message_deliveries
(message_id, status, delivered_at, carrier, cost)
VALUES (?, ?, ?, ?, ?)
''', (
update['message_id'],
update['status'],
update['delivered_at'],
update['carrier'],
update['cost']
))

conn.commit()
conn.close()

Compliance & Reportingโ€‹

Regulatory Reportingโ€‹

# Generate compliance report
lineserve messaging generate-compliance-report \
--type "tcpa" \
--start-date "2024-01-01" \
--end-date "2024-12-31" \
--include-opt-outs

# Export audit trail
lineserve messaging export-audit-trail \
--start-date "2024-01-01" \
--format json \
--include-metadata

Data Retentionโ€‹

# Configure log retention
lineserve messaging set-retention-policy \
--delivery-logs 90 \
--message-content 30 \
--analytics-data 365

API Referenceโ€‹

Get Delivery Statusโ€‹

GET /v1/messaging/messages/{message_id}/delivery

Delivery Reportsโ€‹

GET /v1/messaging/campaigns/{campaign_id}/delivery-report

Message Logsโ€‹

GET /v1/messaging/logs?start_date=2024-01-01&end_date=2024-01-31

Webhook Configurationโ€‹

POST /v1/messaging/webhooks
{
"url": "https://yourapp.com/webhook",
"events": ["delivered", "failed"],
"secret": "webhook-secret"
}

Best Practicesโ€‹

Monitoring Setupโ€‹

  • Set up real-time delivery monitoring
  • Configure alerts for delivery rate drops
  • Monitor carrier-specific performance
  • Track cost trends and optimization opportunities

Data Managementโ€‹

  • Implement proper data retention policies
  • Regular backup of delivery logs
  • Efficient database indexing for queries
  • Automated reporting and analytics

Troubleshootingโ€‹

  • Monitor failure patterns and trends
  • Implement retry logic for transient failures
  • Regular review of blocked numbers
  • Carrier relationship management

Next Stepsโ€‹