CSV Message Generator – Personalised WhatsApp & SMS Campaigns
Pricing
$9.00/month + usage
Go to Apify Store
CSV Message Generator – Personalised WhatsApp & SMS Campaigns
Upload a CSV and instantly create ready-to-send personalized WhatsApp and SMS messages. Perfect for invoice reminders, promotions, and client updates. No APIs or WhatsApp Business required.
0.0 (0)
Pricing
$9.00/month + usage
0
3
2
Last modified
2 months ago
CSV Message Generator – Personalized WhatsApp & SMS Campaigns
Upload a CSV and instantly create ready-to-send personalized WhatsApp and SMS messages.
Perfect for invoice reminders, promotions, and client updates. No APIs or WhatsApp Business required.
🚀 Features
- Works with WhatsApp or SMS
 - Merge two CSVs (e.g. Contacts + Invoices) on a shared field
 - Use placeholders like 
{{name}}or{{amount}}directly in your messages - Generate a shareable results dashboard with clickable buttons
 - Track message status as you or your team send them
 - No coding or APIs needed – just CSV input and a few clicks
 
💡 Example Use Cases
- Invoice reminders: “Hi {{name}}, your invoice for €{{amount}} is due.”
 - Appointment confirmations: “Hi {{name}}, your appointment is booked for {{date}} at {{time}}.”
 - Promotions: “Hi {{name}}, enjoy 10% off this week at our store.”
 - Customer updates: “Hi {{name}}, your order {{order_id}} has been shipped.”
 
📂 Input
- Upload a CSV file with your contacts (phone numbers required).
 - Optionally, upload a second CSV (e.g. invoices, bookings).
 - Select a matching field (e.g. 
name,email, orcustomer_id) to merge both files. - Write your message template with placeholders like 
{{name}}or{{amount}}. 
📊 Output
- Interactive results page: clickable WhatsApp/SMS links for each row
 - Status column: track which messages have been sent
 - Downloadable CSV: for archiving or sharing
 
💰 Pricing
- Free tier: up to 25 messages per run
 - Paid tier: unlimited messages + full dashboard access
 - Model: Monthly rental pricing
 
🌍 Why Use This Tool?
- No WhatsApp Business or API setup required
 - Works worldwide (just include the correct country dialing codes)
 - Uses simple CSV input — compatible with Sage, Xero, QuickBooks, HubSpot, Excel, Google Sheets, and more
 - Provides a friendly dashboard, not just raw data
 
📸 Screenshots (recommended)
Add screenshots here to show users what they’ll get:
- CSV upload screen
 - Template builder with placeholders
 - Final dashboard with “Click to Send” buttons + status updates
 
⚙️ How It Works
- Upload your CSV(s)
 - Choose your matching field (if merging two files)
 - Write your message with placeholders
 - Get instant, personalized WhatsApp/SMS links
 - Share the results dashboard with your team
 
🔒 Notes
- Phone numbers must be in international format (e.g. 
353871234567) - Works with personal WhatsApp accounts (not WhatsApp Business API)
 - SMS deep links depend on the user’s phone carrier and messaging app
 
📑 Dataset Schema
Each generated message is stored as a dataset item.
You can download the dataset as JSON, CSV, or Excel from the Actor run.
| Field | Type | Description | 
|---|---|---|
id | string | Stable unique ID for this result (UUID or hash). | 
channel | string | Either whatsapp or sms. | 
phone_e164 | string | Normalized phone number in E.164 format, e.g. +353873685787. | 
phone_display | string | Original/raw phone from the CSV. | 
country_dial | string | Dialing code used (e.g. 353). | 
merge_key | string | Field used to join CSVs (e.g. name, customer_id). | 
merge_matched | boolean | true if a secondary row was matched and merged. | 
row_index_primary | integer | Index of the row in the primary CSV. | 
row_index_secondary | integer/null | Index of the row in the secondary CSV (if any). | 
data | object | Merged row data used for template rendering (safe fields only). | 
placeholders_used | array | List of placeholders replaced, e.g. ["name","amount"]. | 
message_template | string | Template text before rendering, with {{placeholders}}. | 
message_rendered | string | Final personalized message text. | 
message_preview | string | Shortened preview (first ~120 chars). | 
link_url | string | Ready-to-click WhatsApp or SMS link. | 
link_length | integer | Length of the generated link (bytes). | 
result_status | string | One of ready, skipped_invalid_phone, skipped_missing_data, error. | 
error_message | string/null | Details if result_status = error. | 
sent_status | string | pending or sent. | 
sent_at | datetime/null | Timestamp when the message was clicked/sent. | 
utm | object | Optional UTM tracking fields (source, medium, campaign). | 
audit | object | Metadata: generated_at (ISO datetime), actor_run_id, version. | 
Example Item
{"id": "c1b2c3d4-9a7e-4f0b-98a1-2fbc21a5b9aa","channel": "whatsapp","phone_e164": "+353873685787","phone_display": "0873685787","country_dial": "353","merge_key": "name","merge_matched": true,"row_index_primary": 12,"row_index_secondary": 12,"data": {"name": "Mary Smith","invoice_number": "INV-1042","amount": "€70.00","due_date": "2025-09-30"},"placeholders_used": ["name","invoice_number","amount","due_date"],"message_template": "Hi {{name}}, your invoice {{invoice_number}} for {{amount}} is due {{due_date}}.","message_rendered": "Hi Mary Smith, your invoice INV-1042 for €70.00 is due 2025-09-30.","message_preview": "Hi Mary Smith, your invoice INV-1042 for €70.00…","link_url": "https://wa.me/353873685787?text=Hi%20Mary%20Smith%2C%20your%20invoice...","link_length": 164,"result_status": "ready","error_message": null,"sent_status": "pending","sent_at": null,"utm": {"source": "admindone","medium": "whatsapp","campaign": "invoice-reminder"},"audit": {"generated_at": "2025-09-16T18:10:45Z","actor_run_id": "qwer1234","version": "1.0.0"}}
