PTA-Approved SMS Aggregator · Serving Pakistan since 2014

SendPK Plugins & Integrations — WooCommerce, Shopify, WHMCS & Radius Manager

WordPress Plugins

SendPK SMS for WooCommerce — order SMS + OTP verification

Sends an automatic SMS to your customer whenever their order status changes — received, pending, delivered, cancelled and more — using your SendPK account. Send with an approved template (Fixed) or write free text with placeholders (Dynamic), and optionally verify customer phones with an SMS OTP on signup and checkout.

sendpk-sms-woo.zip · v2.0.0 · 41 KB · WordPress 5.8+ · WooCommerce required · Free

Before you start

Three things, and you're ready in ten minutes.

  • A WordPress site with WooCommerce installed and active — the plugin shows a clear notice and stays idle if WooCommerce is missing.
  • A SendPK account with your API key and an approved Sender ID (mask).
  • Approved template IDs — only needed for Fixed (template) messages; Dynamic free-text messages work with just the API key and sender ID.

How to install

The standard WordPress plugin upload — no FTP needed.

Download the ZIP

Use the Download Plugin button above to save sendpk-sms-woo.zip to your computer.

Upload it

In WordPress go to Plugins → Add New → Upload Plugin and choose the ZIP.

Install & activate

Click Install Now, then Activate. A new page appears under WooCommerce → SendPK SMS.

Example screen: WordPress upload-plugin screen with the ZIP selected.

How to set it up

Once saved, the settings apply to every order automatically.

  1. Go to WooCommerce → SendPK SMS.
  2. Enter your API Key and Sender ID, set the country code (default 92), and turn on Unicode if you send Urdu / non-English text. Click Save.
Example screen: global settings — API key, sender ID, country code, unicode.
  1. Open a status block, e.g. Order Received. Turn it ON and pick the Message Type — each status can use its own:
    • Fixed (approved template): paste the Template ID, then add rows — e.g. key nameCustomer first name, key order-idOrder ID. This builds {"name":"Umair","order-id":"456723"} automatically — any keys your template needs, nothing is hard-coded.
    • Dynamic (free text): just write the message in the textarea and drop in placeholders like %customer_name% and %order_id%. Example: Hi %customer_name%, your order %order_id% is confirmed.
Example screen: Order Received block — choose Fixed or Dynamic message type.
  1. Repeat for the other statuses you want (Delivered, Cancelled, Refunded…) — each has its own block, its own message type and its own text or template — then Save.
  2. (Optional) Turn on OTP verification. Open the OTP Verification block, switch on OTP for Signup and/or Checkout, set the code length (4/6) and expiry minutes, and write the OTP message (e.g. Your verification code is %otp%). Save.
Example screen: OTP block — enable for signup/checkout, set code length and message.

Test it

Always send yourself one SMS before going live.

Use the Send Test SMS box at the bottom of the settings page: pick the message type (Fixed or Dynamic), enter your own number, then either a template id + JSON or plain text, and click Send Test. The raw API reply shows on screen and is also written to the SMS Logs. If the SMS arrives on your phone, real orders will work too.

Example screen: Send Test SMS box with a phone number filled in.

How it works live

Fully automatic — no manual work

When a real order changes status, the plugin picks the customer's phone from the order, fills your template with the order details, and sends the SMS through your SendPK account — one message per status, guarded against duplicates.

Common problems

Ninety percent of issues are one of these four.

  • No SMS? Check the API key, the Sender ID, and that the template ID is approved in your SendPK account — an unapproved template sends nothing.
  • Wrong number format? The plugin auto-fixes 0300… to 92300…, but the billing phone must still be a valid mobile number.
  • Still stuck? Open the SMS Logs tab — every send is recorded there with its raw API reply and a Success/Failed status (error numbers are translated: 1 wrong api_key, 7 invalid number, 8 out of credit…), so you can see exactly why a message failed.
  • Note: a green "Success" (OK ID:…) means SendPK accepted the SMS — not that it reached the handset. For final delivery status, check the delivery report in your SendPK account.

Ready to text your customers automatically?

Download the plugin, connect your SendPK account, and every order update sends itself. Need a hand? Our team is one message away.

Shopify Apps

SendPK SMS for Shopify — order-event SMS + OTP

Sends an automatic SMS to your customer whenever their Shopify order changes — received, paid, fulfilled, cancelled, refunded and more — using your SendPK account. Choose Fixed (approved template) or Dynamic (free text) messages per event, and optionally add SMS OTP verification on signup and checkout.

sendpk-sms-shopify.zip · v1.0.0 · 79 KB · Node.js + Remix · deployed with the Shopify CLI · Free

Unlike the WooCommerce plugin, this isn't a click-to-upload ZIP — it's app source code a developer deploys with the Shopify CLI (OAuth install, embedded admin UI, webhooks). Not yet published on the Shopify App Store, so today it installs as a custom/private app on your own store. See How to install below.

Before you start

Two accounts, and a developer to deploy it.

  • A Shopify store — any plan works for order-event SMS; OTP-on-checkout needs a plan that supports Checkout UI Extensions with block-progress steps (Shopify Plus for some extension points — flagged again below).
  • A SendPK account with your API key, an approved Sender ID (mask) and approved template IDs for any Fixed-mode messages.
  • A developer (or your dev agency) with the Shopify CLI and a Shopify Partner account to deploy the app — it isn't a self-serve upload like the WooCommerce plugin.

How to install

A developer deploys it once with four commands. After that, everyone else just uses it from inside Shopify Admin like any other app.

Download & install

Download App Source above, unzip it, run npm install inside the folder.

Link to Shopify

Run shopify app config link to connect it to your app record in the Partner Dashboard.

Deploy & install

Run npx prisma migrate dev then npm run dev — it prints an install link for your store.

Approve & open

Approve Shopify's OAuth permission screen. The app opens embedded inside Admin, in its own left-nav entry.

npm install shopify app config link npx prisma migrate dev npm run dev

Example screen: Shopify permission approval screen for SendPK SMS.

Full details (env variables, going live on a real store, submitting to the App Store) are in the README inside the download — this page covers the fast path for a developer setting it up for the first time.

How to set it up

Once saved, the settings apply to every order automatically.

  1. Open the SendPK SMS app from your Shopify Admin nav.
  2. Enter your API Key and Sender ID, set the country code (default 92), turn on Unicode if you'll send Urdu text, and Save.
Example screen: global settings inside the embedded app — API key, sender ID, country code, unicode.
  1. Open an event block, e.g. Order Received. Turn it ON and pick a Message Type.
  2. Fixed: paste the approved Template ID, then add rows to match your template's fields — key name → value Customer first name, key order-id → value Order ID. The app builds {"name":"Umair","order-id":"456723"} from each real order automatically — any keys your template needs, nothing is hard-coded. Dynamic: write the message with placeholders like %customer_name% and %order_id% — a default is pre-filled per event and fully editable.
Example screen: Order Received block — choose Fixed or Dynamic message type.
  1. Repeat for the other events you want (Paid, Processing, On Hold, Fulfilled/Delivered, Cancelled, Refunded, Failed/Voided), then Save. A few of these map to a Shopify signal rather than an exact WooCommerce-style status — see the note under each block:
    • Order Fulfilled/Delivered fires on fulfillment, not a courier's confirmed delivery. True "delivered" needs the carrier to report tracking updates back to Shopify — not guaranteed for every courier.
    • Order On Hold uses the fulfillment order's hold status, not a plain order status.
    • Order Failed/Payment Voided has no exact Shopify equivalent to WooCommerce's "failed" status — this block uses the nearest signal (financial status = voided) rather than faking a 1:1 match.
  1. (Optional) Turn on OTP Verification. Enable for Signup and/or Checkout, set code length (4 or 6 digits) and expiry, and write the OTP message.
Checkout OTP requires a Checkout UI Extension active on your checkout, and some block-progress extension points are only available on Shopify Plus. Signup OTP works as a theme block on classic account pages; stores on Shopify's newer hosted Customer Accounts have limited native customization, so the app falls back to verifying the phone right after signup and storing the verified state on a customer metafield.
Example screen: OTP block — enable for signup/checkout, set code length and message.

Test it

Always send yourself one SMS before going live.

Use the Send Test SMS box in Global settings: enter your own number, a template id and matching JSON (or plain text for Dynamic), then click Send Test. If the SMS arrives on your phone, real orders will work too.

Example screen: Send Test SMS box with a phone number filled in.

Check what was sent — SMS Logs

Every send, order SMS or OTP, is recorded here — success or failure.

Open SMS Logs from the app's left nav to see every message the app has sent, newest first: date & time, trigger (e.g. Order Received, OTP – checkout), order id, the phone number actually used, message type, and — most importantly — the raw reply SendPK sent back, with a green Success or red Failed status. Click View on any row for the full request/response. Filter by status, date range, or search by phone/order id, and use Export CSV to pull the table for your records. Logs older than your configured retention (default 30 days) are cleaned up automatically. OTP codes themselves are never shown here in plain text, even for OTP rows.

Example screen: SMS Logs — date, trigger, phone, type, status and the raw API response for every send.
A Success / OK ID row only means SendPK accepted the SMS for delivery — it isn't a delivery receipt. The log proves the API accepted the message; for true delivery status, check your SendPK account's delivery report.

How it works live

Fully automatic — no manual work

When a real order event fires, the app reads the customer's phone from the order, fills in your template or placeholders, and sends the SMS automatically through your SendPK account — one message per event, guarded against duplicate webhook deliveries.

Common problems

Ninety percent of issues are one of these.

  • No SMS? Check the API key, the Sender ID, and that the template ID is approved in your SendPK account — an unapproved template sends nothing.
  • Wrong number format? The app auto-fixes 0300… to 92300…, but the order must still have a valid mobile number attached (order phone, falling back to shipping then billing address).
  • Still stuck? Open SMS Logs inside the app — every send is recorded with its raw API reply and a Success/Failed status.
  • "Success" but no SMS? A Success / OK ID reply only means SendPK accepted the message — not a delivery receipt. Check your SendPK account's delivery report for final status.
  • An event isn't firing the way WooCommerce did? Some events (On Hold, Processing, Failed/Voided) map to the closest available Shopify signal, not an identical status name — see the notes under each event block in settings.

Ready to text your Shopify customers automatically?

Download the app source, deploy it with the Shopify CLI, connect your SendPK account, and every order update sends itself. Need a hand? Our team is one message away.

WHMCS Addon Module

SendPK SMS for WHMCS — billing & service SMS + OTP

Sends an automatic SMS to your client's phone whenever their invoice, order, service or support ticket changes — invoice created/paid/overdue, service suspended/activated, ticket replies and more — using your SendPK account. Choose Fixed (approved template) or Dynamic (free text) messages per event, map any other WHMCS email to an SMS, and optionally add SMS OTP on login and signup.

sendpk-sms-whmcs.zip · v1.0.0 · 55 KB · WHMCS 8+ Addon Module · PHP, no framework · Free

Unlike a WordPress plugin, WHMCS doesn't have an in-admin "upload & install" button for addon modules — you (or your host) upload the module's folder to your WHMCS server via FTP/File Manager, then activate it from Setup → Addon Modules. No coding required, just one file upload. See How to install below.

Before you start

Two accounts, and admin access to upload a file.

  • A WHMCS 8 or later install, with admin access and FTP/File Manager access to its server — this module targets WHMCS 8+'s hook names specifically.
  • A SendPK account with your API key, an approved Sender ID (mask) and approved template IDs for any Fixed-mode messages.
  • A few minutes to upload one folder and activate it — no database setup, the module creates its own tables automatically on activation.

How to install

One file upload, then activate like any other WHMCS addon module.

Download & unzip

Download the module above and unzip it — you'll get a sendpk_sms folder.

Upload it

Via FTP or your host's File Manager, upload the whole sendpk_sms folder into modules/addons/ on your WHMCS server.

Activate

In WHMCS Admin go to Setup → Addon Modules, find SendPK SMS and click Activate — this also creates the module's own database tables.

Grant access & open

Click Configure, tick your admin role, save — then open SendPK SMS from the Addons menu.

Example screen: Setup → Addon Modules with SendPK SMS ready to activate.

How to set it up

Once saved, the settings apply to every invoice, service and ticket automatically.

  1. Open Addons → SendPK SMS. On the Settings tab enter your API Key and Sender ID, set the country code (default 92), turn on Unicode if you'll send Urdu text, and Save. Use Check Balance to confirm the key works.
  2. Open the Event Rules tab. Turn on an event, e.g. Invoice Paid, and pick a Message Type. Fixed: paste the approved Template ID, add rows to match your template's fields — key name → value Client first name, key invoice → value Invoice number — the module builds the JSON from each real invoice automatically. Dynamic: write the message with placeholders like %client_name% and %invoice_number% — a sensible default is pre-filled per event.
Example screen: Event Rules — Invoice Paid block with Fixed template + field rows.
  1. Repeat for the other events you want: Invoice Created, Payment Reminder/Overdue, Refunded, Cancelled, Order Accepted, Service Activated/Suspended/Unsuspended/Terminated, Ticket Opened, Ticket Staff Reply, Client Registered.
WHMCS doesn't expose a dedicated event for everything — domain expiry reminders and password reset emails have no dedicated trigger the module can hook directly. For those, use the Email-to-SMS Mapping tab instead (next step) — it works off WHMCS's own outgoing emails, so it covers anything the dedicated Event Rules don't.
  1. Open the Email-to-SMS Mapping tab. Pick any real email template from your own WHMCS install (e.g. "Domain Expiration Notice" or "Password Reset Request") from the dropdown — it's read live from your Email Templates, not a fixed list — and pair it with a Fixed or Dynamic SMS the same way as an Event Rule. Every time WHMCS sends that email, the module now also sends the matching SMS.
  2. (Optional) Turn on OTP Verification. Enable for Login and/or Signup, set code length (4 or 6 digits) and expiry, and write the OTP message.
WHMCS doesn't offer a formal pluggable "add your own two-factor method" interface the way it does for payment or domain-registrar modules — its built-in 2FA (authenticator app, Duo, YubiKey) is core-only. This module's OTP works as a login gate built on WHMCS's own hooks instead: it steps in right after a client's password is accepted and holds the client-area until the code is verified. Test your full login flow (including "remember me" and any SSO/API-based logins) before relying on it. Signup OTP verifies the phone shortly after registration completes, not by blocking the signup form mid-submit — WHMCS doesn't support pausing its native registration form for a custom async step either.

Test it

Always send yourself one SMS before going live.

Use the Send Test SMS box on the Settings tab: enter your own number, a template id and matching JSON (or plain text for Dynamic), then click Send Test. If the SMS arrives on your phone, real invoices and services will work too.

Example screen: Send Test SMS box with a phone number filled in.

Check what was sent — SMS Logs

Every send, billing SMS or OTP, is recorded here — success or failure.

Open the SMS Logs tab to see every message the module has sent, newest first: date & time, trigger (e.g. Invoice Paid, OTP – login), the related invoice/service/ticket id, the phone number actually used, message type, and the raw reply SendPK sent back, with a green Success or red Failed status. Filter by status, date range, or search by phone/invoice id, and use Export CSV. Logs older than your configured retention (default 30 days) are cleaned up automatically. OTP codes themselves are never shown here in plain text.

Example screen: SMS Logs — date, trigger, phone, type, status and the raw API response for every send.
A Success / OK ID row only means SendPK accepted the SMS for delivery — it isn't a delivery receipt. Check your SendPK account's delivery report for final status.

How it works live

Fully automatic — no manual work

When a real invoice, service or ticket event fires inside WHMCS, the module reads the client's phone and the relevant record straight from your WHMCS database, fills in your template or placeholders, and sends the SMS automatically through your SendPK account.

Common problems

Ninety percent of issues are one of these.

  • No SMS? Check the API key, the Sender ID, and that the template ID is approved in your SendPK account — an unapproved template sends nothing.
  • Module doesn't show up after upload? Confirm the folder is named exactly sendpk_sms directly inside modules/addons/, and that file permissions allow WHMCS to read it.
  • No SMS on domain expiry or password reset? Those aren't Event Rules — set them up on the Email-to-SMS Mapping tab instead, mapped to the matching WHMCS email template.
  • Wrong number format? The module auto-fixes 0300… to 92300…, but the client's profile must still have a valid mobile number.
  • Still stuck? Open the SMS Logs tab — every send is recorded with its raw API reply and a Success/Failed status.

Ready to text your WHMCS clients automatically?

Download the module, upload it, connect your SendPK account, and every invoice, service and ticket update sends itself. Need a hand? Our team is one message away.

ISP Billing / RADIUS

SendPK SMS for DMA Radius Manager — notification SMS gateway

Routes DMA Radius Manager's own subscriber SMS notifications — welcome messages, expiry warnings, password recovery, renewal notices, whatever your Radius Manager install already sends by SMS — through your SendPK account instead of Clickatell, BulkSMS or a GSM modem. Radius Manager decides what to send and when; this just changes how it gets delivered.

sendpk-sms-dma-radius.zip · v1.0.0 · 17 KB · PHP, no framework · Radius Manager 4.x · Free

Radius Manager has no plugin marketplace or addon-module system — this is a small drop-in replacement for its own SMS gateway file, installed by copying files onto your server (FTP/shell), not by uploading anything inside Radius Manager's own admin. See How to install below. OTP/verification codes are intentionally not included — that's a separate Radius Manager surface, out of scope here.

Before you start

One account, and server access to swap a file.

  • A working DMA Radius Manager install, with FTP or shell access to its server — this is a server-side file swap, not something done from Radius Manager's own web admin.
  • A SendPK account with your API key and an approved Sender ID (mask). No template id needed — see How it works below.
  • Comfortable locating and backing up one PHP file — Radius Manager's own SMS gateway module.

How to install

A file swap on your server, then one settings check inside Radius Manager itself.

Locate & back up

Find your install's SMS gateway file (commonly api/smsgateway.php) and copy it aside.

Download & configure

Download the gateway above, unzip it, and fill in your API key + Sender ID in sendpk_config.php.

Swap the gateway

Upload lib/ + sendpk_config.php alongside the original, then copy in this package's sendsms() function.

Enable in Radius Manager

In System → System Settings → Notifications, turn on the SMS checkboxes you want, then trigger a real test.

Example screen: Radius Manager's own Notifications settings — this package doesn't add or replace these, it only changes how the SMS is delivered once Radius Manager decides to send one.

How it works

One important difference from the WooCommerce/Shopify/WHMCS integrations.

Radius Manager renders the final SMS text itself, from its own editable template files, before it ever calls the gateway. By the time SendPK sees the message, it's already finished text — not a set of fields. So this integration only ever uses SendPK's Dynamic (plain text) mode; there's no Fixed-template/JSON builder here, and no per-event on/off switches to configure on our side. To change what a notification says, edit Radius Manager's own template for that notification. To change how it's delivered, that's what this gateway file does.

Fully automatic once installed

Whenever Radius Manager's own logic decides to text a subscriber, it calls the gateway with the subscriber's phone number and the rendered message — the gateway normalizes the number, sends it through SendPK, and logs the result. No manual work.

Check what was sent — SMS Log

A local, password-protected log — Radius Manager has no admin page slot for this gateway to add one to.

Every send, success or failure, is appended to a local log file: time, the normalized phone number, the exact message Radius Manager handed over, and the raw reply SendPK sent back. View it with the included sendpk_log_viewer.php — it's gated by its own password (set in sendpk_config.php) since it sits outside Radius Manager's own admin login. Old entries clean up automatically after your configured retention (default 30 days).

Example screen: the password-protected log viewer — time, phone, message and status for every send.
A Success row only means SendPK accepted the message — not a delivery receipt. Check your SendPK account's delivery report for final status. And since Radius Manager's gateway contract doesn't pass along which notification type triggered a send, the message text itself is the only way to tell them apart in the log.

Common problems

Ninety percent of issues are one of these.

  • No SMS at all? Check the API key and Sender ID in sendpk_config.php, and confirm the matching notification checkbox is turned on in Radius Manager's own System Settings — this gateway can't send anything Radius Manager doesn't ask it to.
  • Wrong number format? The gateway auto-fixes a leading 0 to your configured country code, but the subscriber's record must still have a valid mobile number.
  • Upgraded Radius Manager and SMS stopped working? An upgrade can replace the gateway file with a fresh copy. Re-apply this package's sendsms() function — your sendpk_config.php settings are untouched since Radius Manager never overwrites that file.
  • Looking for OTP/verification codes? Not included in this gateway on purpose — see the note at the top of this page.
  • Still stuck? Open the log viewer — every send is recorded with its raw API reply and a Success/Failed status.

Ready to route Radius Manager's SMS through SendPK?

Download the gateway, swap it in, connect your SendPK account, and every notification Radius Manager already sends texts itself. Need a hand? Our team is one message away.