Documentation v2.1

Updated 2026-06-01

SplitSMS platform documentation

Professional guides for sending bulk SMS, operating the dashboard, integrating the REST API, connecting WordPress & WooCommerce, and resolving delivery issues — from first signup to production.

9 chapters · 41 sections · Maintained by Tecunit

Table of contents

Chapter 01

Getting started

Create an account, verify your phone, and send your first SMS.

What is SplitSMS?

SplitSMS is an enterprise-grade bulk and transactional SMS platform operated by Tecunit. Businesses use it for marketing campaigns, OTP verification, order notifications, and API-driven messaging across Ghana, Nigeria, and 190+ countries — with transparent pay-as-you-go pricing and no annual contracts.

CapabilityDescription
DashboardCampaigns, contacts, sender IDs, wallet, reports, and support
REST API v1Send SMS, OTP, contacts, campaigns, webhooks, WordPress sync
WordPress pluginWooCommerce, CF7, WPForms, Elementor Pro, Crocoblock / JetEngine (v1.7.2)
RoutingInfobip, Twilio, and mNotify with automatic failover
BillingPrepaid wallet — Paystack, Flutterwave, MoMo, Stripe where enabled

Who this documentation is for

Account owners and marketers should start with Getting started and Dashboard guide. Developers should read REST API and SDKs. WordPress site owners should read the WordPress plugin chapter.

Create your account

  1. Go to splitsms.com/signup and enter your name, email, and phone number.
  2. Verify your phone with the 6-digit OTP sent by SMS.
  3. Set a password and log in to the dashboard.
  4. Your wallet starts with 5 free SMS credits for testing.

Login options

You can log in with your email or phone number. Password login uses either identifier; OTP login accepts email or phone but always sends the code to your registered phone.

Keep your phone number verified

OTP login and security alerts are sent to your registered mobile number. Update it under Dashboard → Settings if you change phones.

Pricing & credits

SplitSMS bills per SMS segment based on destination country and encoding (GSM-7 vs Unicode). Ghana rates start around GHS 0.029 per segment. View live rates on the Pricing page or Dashboard → Pricing.

  • Wallet holds funds in your account currency (typically GHS)
  • SMS credits are purchased from wallet balance at country-specific rates
  • Each send deducts credits before the message is queued
  • New accounts receive 5 free SMS credits for testing delivery

Send your first message

  1. Open Dashboard → Send SMS.
  2. Enter one or more phone numbers (international format, e.g. 233201234567).
  3. Choose an approved Sender ID or request a new one under Sender IDs.
  4. Write your message — GSM-7 is 160 characters per segment; Unicode uses 70.
  5. Review the cost preview and click Send.

Delivery status appears in Dashboard → Message results and Transactions. Failed messages show the provider reason so you can fix balance, sender ID, or number format issues.

Next: connect WordPress

Install the official plugin from [Integrations → WordPress](/integrations/wordpress), create an API key under Developers → API Keys with sms.send permission, and paste it under SplitSMS → Settings in wp-admin. Your site appears under Dashboard → Integrations → WordPress.

Connect WordPress (overview)

  1. Download or install the plugin from the WordPress.org directory (search SplitSMS).
  2. In wp-admin, click **Create free account** if you signed up from the website already, skip to API key.
  3. Developers → API Keys — create key with **sms.send** and copy the full secret.
  4. SplitSMS → Settings — paste key, select Sender ID, Test connection → Save.
  5. SplitSMS → Forms or Integrations — enable the events you need.
  6. Monitor sends on splitsms.com Dashboard → Integrations → WordPress.

Full step-by-step instructions are in the WordPress plugin chapter of this documentation.

Chapter 02

Dashboard guide

Navigate the member dashboard and core workflows.

Wallet & billing

SplitSMS uses a prepaid wallet. Every sent SMS deducts credits based on destination country and message segments. Top up from Dashboard → Wallet using Paystack, Flutterwave, or MTN MoMo when enabled on your account.

  • Pending payments complete after the provider webhook confirms funds.
  • Transaction history lists top-ups and SMS debits.
  • Invoices are available for accounting and reseller accounts.
  • Insufficient balance blocks sends until you top up.

Sender IDs

Recipients see your Sender ID as the message origin (e.g. MYBRAND). Each ID is submitted for approval and may be pending, approved, or rejected depending on carrier rules in Ghana and other routes.

  1. Request a Sender ID from Dashboard → Sender IDs.
  2. Wait for admin approval (typically 1–2 business days).
  3. Use only approved IDs in the dashboard, API, and WordPress plugin.

WordPress integration

When a WordPress site saves a valid API key, it registers under **Dashboard → Integrations → WordPress**. You see each connected site URL, plugin version, WordPress and PHP versions, and recent SMS activity synced from the plugin.

  • Outdated plugin versions are flagged — update from wp-admin when a new release is available
  • Skip logs explain why an SMS was not sent (no phone, disabled event, insufficient balance)
  • Delivery status updates when the carrier confirms DLR (Sent → Delivered)
  • Create API keys under Developers → API Keys — one key per site or environment is recommended

Chapter 03

Campaigns & contacts

Organize audiences and run bulk SMS campaigns.

Managing contacts

Contacts store phone numbers with optional name, email, country, and tags. Import a CSV with columns for phone, name, and email — invalid rows are reported before import.

  • Search and filter by name, phone, or tag
  • Bulk tag, delete, or add to groups
  • Export contacts as CSV for backup
  • API: GET/POST /api/v1/contacts for programmatic sync

Running a campaign

  1. Create a contact group and add members (or import first).
  2. Go to Campaigns → New campaign.
  3. Select the group, message, sender ID, and optional schedule time.
  4. Confirm segment count and estimated cost.
  5. Launch — messages queue and process in the background worker.

Campaign detail pages show sent, delivered, failed, and pending counts. You can retry failed recipients where the platform supports it.

Message placeholders

In campaigns, use {name} and {phone} in the message body to personalize each recipient. Preview shows a sample substitution before send.

Chapter 04

Messaging standards

Phone formats, encoding, segments, and delivery lifecycle.

Phone number format

Always use international format without the plus sign. Ghana numbers start with 233 followed by 9 digits (e.g. 233201234567). Nigeria uses 234. The platform validates and normalizes numbers before routing.

CountryExampleNotes
Ghana233201234567Drop leading 0 from local 020… numbers
Nigeria2348012345678Include full national number after 234
International441234567890Use country code + subscriber number

Encoding & segments

EncodingChars / segmentWhen used
GSM-7160 (153 for multi-part)Standard Latin letters and basic symbols
Unicode (UCS-2)70 (67 for multi-part)Emojis, Arabic, extended accents

Long messages are split into multiple billable segments. The Send SMS screen and API responses show segment count before you confirm. Unicode in a single word switches the entire message to UCS-2.

Delivery lifecycle

  • Queued — accepted by SplitSMS, awaiting worker dispatch
  • Sent — handed to upstream carrier
  • Delivered — handset or carrier confirmed delivery (where supported)
  • Failed — rejected or expired; reason shown in reports
  • Pending — in transit; may update via webhook or polling

Chapter 05

REST API

Production HTTPS JSON API for developers and integrations.

Overview

All requests use HTTPS and JSON. Authenticate with Authorization: Bearer YOUR_API_KEY. Production API base: https://www.splitsms.com/api/v1. See the full API reference for every endpoint, schema, and cURL example.

HeaderValue
AuthorizationBearer sk_live_… or sk_test_…
Content-Typeapplication/json
Acceptapplication/json

API keys & permissions

PermissionAllows
sms.sendPOST /sms/send, OTP send/verify
sms.readGET messages, reports, logs
wallet.readGET balance and transactions
contacts.readList and search contacts
contacts.writeCreate, update, import contacts
campaigns.readRead campaign status and stats

Key security

API keys are shown only once at creation (~56 characters). Store in server-side environment variables. Never commit keys to Git, expose in browser JavaScript, or paste into WordPress page content.

Send SMS

bash
curl -X POST 'https://www.splitsms.com/api/v1/sms/send' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "sender": "MYBRAND",
    "recipients": ["233201234567"],
    "message": "Hello from SplitSMS"
  }'

Successful responses include message IDs and initial status. Poll GET /api/v1/messages or configure webhooks for delivery updates.

OTP verification

  1. POST /api/v1/otp/send — sends a one-time code to the recipient
  2. Store the returned reference server-side
  3. POST /api/v1/otp/verify — submit the code the user entered
  4. Use sk_test_ keys in development to validate without billing

Webhooks

Register HTTPS endpoints under Developers → Webhooks. Payloads include event type, message ID, status, and timestamp. Each request is signed with HMAC-SHA256 using your webhook secret.

javascript
// Verify X-SplitSMS-Signature (pseudocode)
const crypto = require("crypto");
const expected = crypto
  .createHmac("sha256", WEBHOOK_SECRET)
  .update(rawBody)
  .digest("hex");
if (expected !== signature) throw new Error("Invalid signature");

Chapter 06

WordPress plugin

Official plugin (v1.7.2) for WooCommerce, forms, WordPress core, and Crocoblock.

How it works

SplitSMS is a cloud SMS platform at splitsms.com. The WordPress plugin connects your site to your SplitSMS account using an API key. When an event happens (order placed, form submitted, user registered), the plugin builds a message from your template, sends it through the SplitSMS API, and logs the result in wp-admin and your SplitSMS dashboard.

  1. Create a free account on splitsms.com — starter SMS credits included.
  2. Generate an API key (Developers → API Keys) with **sms.send** permission.
  3. Install the plugin on WordPress and paste the key under SplitSMS → Settings.
  4. Enable integrations (WooCommerce, WordPress core, Crocoblock) or configure per-form SMS.
  5. Messages debit your SplitSMS wallet; delivery status syncs back to SplitSMS → Logs and Dashboard → WordPress.

No custom code required

Every feature is configured in the plugin admin — toggles, templates, form actions, and the Forms manager. You never need to add PHP hooks or edit theme files.

Installation

  1. **WordPress.org:** Plugins → Add New → search “SplitSMS” → Install → Activate.
  2. **Manual:** Download [SplitSMS-v1.7.2.zip](https://www.splitsms.com/wordpress-plugin/SplitSMS-v1.7.2.zip) from [Integrations → WordPress](/integrations/wordpress).
  3. Plugins → Add New → Upload Plugin → choose the zip → Activate.
  4. If upgrading from an old manual install, deactivate and remove any splitsms* folders under wp-content/plugins/ first.
  5. Open **SplitSMS** in wp-admin. If you do not have an account yet, click **Create free account**.
  6. Paste your API key under **Settings** → Test connection → Save → send a test SMS on **Dashboard**.

Plugin file not found?

WordPress extracted the zip into a nested folder because an old version existed. Delete every splitsms* folder under wp-content/plugins/, then upload a fresh zip from splitsms.com. Or use **Replace from splitsms.com** on Settings when available.

Create account & API key

WordPress.org installs show **Create free account** links in the plugin sidebar, Settings page, Dashboard banner, and Plugins list. These open splitsms.com/signup with UTM tracking so you can return and paste your API key.

  1. Sign up at splitsms.com — verify email and log in.
  2. Dashboard → Wallet — add credits or use starter balance.
  3. Dashboard → Sender IDs — register or select your sender name (required for most routes).
  4. Developers → API Keys → Create key — enable **sms.send** (and **sender_ids.read** for the sender picker).
  5. Copy the **full** key at creation (~56 characters). The dashboard only shows a prefix afterward.
  6. WordPress → SplitSMS → Settings — paste key, pick Sender ID, set admin phone → Test connection → Save.

Partial API keys fail

Pasting only the visible prefix (e.g. sk_test_99a064) causes not_configured errors. Always paste the complete secret from the creation screen.

Plugin admin menu

PagePurpose
DashboardBalance, send test SMS, activity stats, connection status, update alerts
SettingsAPI key, Sender ID, admin phone, country code, replace-from-cloud reinstall
FormsAuto-detected forms — toggle SMS, phone field, message, admin copy per form
IntegrationsWooCommerce events, WordPress core, CF7/WPForms/Elementor global toggles, Paystack tips
CrocoblockJetEngine CPTs, JetBooking, JetAppointment templates and reminders
LogsEvery send, skip, and failure with delivery status (Sent → Delivered when DLR arrives)
HelpQuick start, update guide, and in-plugin documentation

When connected, the top banner shows your SplitSMS account status, plugin version vs splitsms.com, WordPress version, and PHP version. Outdated plugin versions show an update notice.

API key & connection

The plugin stores your API key in WordPress options. On save, it validates against splitsms.com/account/status. Connected sites register with Dashboard → WordPress integration so you can monitor version and activity from the cloud.

  • Test connection before save — invalid keys are rejected
  • Settings merge on plugin update — keys and templates are preserved
  • Skip reasons (no phone, disabled event) sync to your SplitSMS dashboard
  • Delivery status polls splitsms.com/messages/{id} — logs update from Sent to Delivered
  • Local dev: API base URL auto-suggests http://127.0.0.1:3000 on .local sites when WP_DEBUG is on

Forms manager (no code)

**SplitSMS → Forms** scans your site for Contact Form 7, WPForms, Elementor Pro forms, JetFormBuilder, and JetEngine legacy forms. Each row shows the form title, plugin source, and controls to enable SMS without touching form builder code.

  1. Open SplitSMS → Forms → **Refresh list** after adding new forms.
  2. Toggle **Send SMS** on for the form you want.
  3. Select the **phone field** from the dropdown (tel fields are auto-detected).
  4. Edit the **message template** — use {name}, {phone}, {form_title}, {site_name}, and field_* placeholders.
  5. Optional: enable **Admin copy** to SMS your admin phone on every submission.
  6. Save. Submit a test entry and check SplitSMS → Logs.

When to use Forms vs form actions

Use the Forms manager for quick setup on CF7, WPForms, and global Elementor hooks. For JetFormBuilder, JetEngine, and Elementor Pro **Actions After Submit**, use the native actions below — they run per form in the builder and support macros like %phone%.

Native form actions

BuilderWhere to addAction name
JetFormBuilderForm → Post Submit Actions → Add Action**Send SMS** — phone field, message, admin copy, sender ID
JetEngine (legacy forms)JetEngine → Forms → Notifications → Add Notification**Send SMS** — same fields + %post_id%, %user_id% macros
Elementor ProForm widget → Actions After Submit → Add Action**SplitSMS Notification** — phone, message, sender ID, admin copy

When a native action is configured on a form, the plugin skips duplicate global hooks for that submission. Macros: **%phone%** (submitted phone), **%post_id%** (current post), **%user_id%** (logged-in user). Message templates also support {field_name} placeholders from form data.

  1. Connect API key first — actions show a connect notice until configured.
  2. Add the action in your form builder (not in SplitSMS admin).
  3. Pick the phone field from the dropdown populated from your form fields.
  4. Write your SMS template; test with a real submission.
  5. Check Logs — skip reasons explain missing phone or validation failures.

Form plugins reference

PluginSetup optionsNotes
Contact Form 7Forms manager or Integrations toggleTel field e.g. [tel* your-phone]; per-form ID filter; skip logs
WPFormsForms manager or Integrations togglePhone field type or name; setup panel lists detected forms
Elementor ProForms manager, global hook, or Actions After SubmitTel field → Advanced → Field ID; **SplitSMS Notification** action recommended
JetFormBuilderPost Submit Action: **Send SMS**Per-form control; global auto-SMS skipped when action runs
JetEngine FormsNotification type: **Send SMS**Legacy JetEngine form builder; shared helper with JFB

WordPress core

Under **SplitSMS → Integrations → WordPress core**, enable welcome SMS on user registration and optional password reset via SMS.

  • Phone is read from user meta **billing_phone** or **splitsms_phone**
  • Password reset SMS replaces the email when a phone exists; otherwise WordPress email is kept
  • Templates support {site_name}, {customer_name}, {reset_link}

WooCommerce

Enable events under SplitSMS → Integrations. SMS is sent to billing phone, then shipping phone, custom order meta, or user meta if billing is empty. HPOS (custom order tables) and block checkout are supported.

  • Events: order placed, payment complete, paid → processing, processing, completed, cancelled, failed, refunded, shipped (tracking)
  • Paystack / Flutterwave / Stripe — SMS fires when WooCommerce marks the order paid (no direct gateway API)
  • COD/BACS payment SMS only when the order is marked paid
PlaceholderReplaced with
{customer_name}Billing first + last name
{order_id}WooCommerce order number
{order_total}Formatted order total
{order_status}Current order status
{payment_method}Gateway title
{paystack_reference}Paystack transaction reference (when available)
{tracking_number}Shipping tracking number
{refund_amount}Refund total on refunded orders
{site_name}WordPress site name

No SMS on order?

Check SplitSMS → Logs for skip reasons (e.g. no_billing_phone). Ensure checkout collects a phone number or set a custom phone meta key under Integrations.

Crocoblock

JetEngine, JetFormBuilder, JetBooking, and JetAppointment modules live under **SplitSMS → Crocoblock**. Map phone fields, edit every event template, and use optional conditional rules (JSON) for status-based SMS.

  • JetFormBuilder — native **Send SMS** in Post Submit Actions (recommended per-form control)
  • JetEngine legacy forms — **Send SMS** notification type in form builder
  • JetBooking / JetAppointment — reminder SMS via WP-Cron before check-in or appointment
  • Per-module toggles work independently of the master Crocoblock switch
  • Activity tagged by source in WordPress logs and your SplitSMS dashboard

SplitSMS dashboard connection

When your API key is saved, the plugin registers your site with splitsms.com. Open **Dashboard → Integrations → WordPress** to see connected sites, plugin version, WordPress/PHP versions, recent activity, and skip logs.

  • Outdated plugin versions are flagged so you know when to update
  • Cloud log sync sends send/skip/fail events to your SplitSMS account
  • Delivery status updates appear in both WordPress Logs and the dashboard
  • Disconnect by removing the API key in WordPress Settings

Plugin updates & troubleshooting

  1. **WordPress.org:** Dashboard → Updates → Update SplitSMS when available.
  2. **Manual:** Download latest zip from [Integrations → WordPress](/integrations/wordpress) → Plugins → Add New → Upload.
  3. Settings → **Replace from splitsms.com** — reinstall in place when upload says folder exists.
  4. API keys, templates, and toggles are preserved when you update.
ProblemFix
Plugin file not foundDelete all splitsms* folders under wp-content/plugins/, re-upload zip
Could not move to upgrade-temp-backupUse Replace from splitsms.com or manual upload; host may block WP updater
not_configured / invalid keyPaste full ~56-char API key; test connection on Settings
No SMS sentCheck Logs skip reason; verify phone field and event toggle enabled
Sent but not DeliveredWait for carrier DLR; check wallet balance and sender ID approval

See Changelog for release notes. Plugin Help page in wp-admin mirrors this guide.

Chapter 07

Security & compliance

Protect credentials, respect recipients, and meet regulatory expectations.

Credential hygiene

  • Rotate API keys immediately if exposed — revoke old keys in App connections
  • Use separate keys per environment (production vs staging)
  • Restrict key permissions to the minimum required scope
  • Enable webhook signature verification on every endpoint

Responsible messaging

Obtain consent before promotional SMS. Include opt-out instructions where required by local law. Transactional messages (OTP, order updates) should clearly identify your brand via an approved Sender ID.

Read our Privacy Policy, Terms, and Data Protection pages for how Tecunit processes account and message metadata.

Chapter 08

SDKs

Official client libraries for popular languages.

JavaScript / TypeScript

typescript
npm install https://www.splitsms.com/sdk/javascript/splitsms-sdk.tgz

import { SplitSMS } from "@splitsms/sdk";

const client = new SplitSMS({
  apiKey: process.env.SPLITSMS_API_KEY!,
  baseUrl: "https://www.splitsms.com",
});

await client.messages.send({
  sender: "MYBRAND",
  recipients: ["233201234567"],
  message: "Hello from SplitSMS",
});

await client.connect.createCustomer({
  full_name: "Jane Doe",
  phone: "233201234567",
  country_code: "GH",
  external_ref: "user-42",
});

PHP, Flutter & Postman

  • PHP: composer config repositories.splitsms composer https://www.splitsms.com/sdk/php/ then composer require splitsms/sdk
  • Flutter: download https://www.splitsms.com/sdk/flutter/splitsms-flutter.zip — path dependency (see [SDK page](/sdk))
  • Postman: import the collection from Developers → Postman
  • Install manifest: /sdk/manifest.json — all packages hosted on SplitSMS

Chapter 09

Troubleshooting

Diagnose delivery, API, and WordPress issues quickly.

SMS not delivered

SymptomLikely causeAction
Immediate failureInsufficient SMS creditsTop up wallet → buy credits
Invalid numberWrong formatUse 233… not 020… or +233…
Sender rejectedID not approvedWait for approval or use approved ID
Sandbox keysk_test_ used in productionSwitch to sk_live_ key
Pending foreverCarrier delayCheck reports; retry if failed

API error codes

HTTPCodeMeaning
401UNAUTHORIZEDMissing, truncated, or revoked API key
403FORBIDDENKey lacks permission (e.g. sms.send)
402PAYMENT_REQUIREDWallet or SMS credits too low
400INVALID_REQUESTValidation failed — check JSON schema
429TOO_MANY_REQUESTSRate limit — exponential backoff
500INTERNAL_ERRORRetry once; contact support if persistent

WordPress plugin

  • not_configured — paste full API key (~56 chars), not prefix only
  • no_billing_phone — add phone to checkout or custom meta key
  • wc_*_skipped / cf7_*_skipped — event disabled or phone missing; synced to dashboard
  • JetFormBuilder action missing — add Send SMS (SplitSMS) under Post Submit Actions
  • Connection test fails — check SSL, firewall, and splitsms.com reachability

Get help

Report bugs, billing issues, or integration problems at Support. Logged-in users can open tickets under Dashboard → Help & support. Include message IDs, API request IDs, and WordPress log entries when possible.

WordPress plugin

Current release: v1.7.2. See the changelog for release notes, the WordPress integration guide for setup, and your dashboard for connected site stats.