
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
2
2
Last modified
8 days 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"}}