<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: NIYOGUSHIMWA JOSEPH</title>
    <description>The latest articles on DEV Community by NIYOGUSHIMWA JOSEPH (@tekservix).</description>
    <link>https://dev.to/tekservix</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4227380%2F93c44aec-764c-44c0-89df-5988f27a4906.png</url>
      <title>DEV Community: NIYOGUSHIMWA JOSEPH</title>
      <link>https://dev.to/tekservix</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tekservix"/>
    <language>en</language>
    <item>
      <title>How to send WooCommerce SMS and WhatsApp notifications from your own phone number</title>
      <dc:creator>NIYOGUSHIMWA JOSEPH</dc:creator>
      <pubDate>Tue, 10 Nov 2026 09:12:11 +0000</pubDate>
      <link>https://dev.to/tekservix/how-to-send-woocommerce-sms-and-whatsapp-notifications-from-your-own-phone-number-1678</link>
      <guid>https://dev.to/tekservix/how-to-send-woocommerce-sms-and-whatsapp-notifications-from-your-own-phone-number-1678</guid>
      <description>&lt;p&gt;Email order updates have a problem: people don't read them. They land in a promotions tab, or they get read three days later. A text that says "Your order #1042 has shipped" gets read almost immediately.&lt;/p&gt;

&lt;p&gt;Most WooCommerce SMS plugins solve this by connecting your store to a bulk SMS provider like Twilio, Vonage or a local aggregator. That works, but it brings per-message fees, sender ID registration, and in the US the 10DLC registration process for business texting. For a store sending a few hundred order updates a month, the setup is often more work than the messages are worth.&lt;/p&gt;

&lt;p&gt;This tutorial shows a different approach. You send WooCommerce SMS notifications through an Android phone with a normal SIM card, and WhatsApp notifications through your own WhatsApp number. Customers see a number they recognize, they can reply, and you pay your mobile plan's normal rates.&lt;/p&gt;

&lt;p&gt;I'll use two plugins we build at Tekservix: the SMS Gora SMS gateway plugin and the WAservix WhatsApp API gateway plugin. Both are free plugins; the services behind them have paid plans with free trials. I'll also cover when a Twilio-style provider is still the better choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll set up
&lt;/h2&gt;

&lt;p&gt;By the end you'll have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An SMS to the customer when an order moves to processing, completed, on hold, cancelled, refunded or failed&lt;/li&gt;
&lt;li&gt;An instant alert to your own phone when a new order comes in&lt;/li&gt;
&lt;li&gt;SMS or WhatsApp alerts when someone submits a contact form&lt;/li&gt;
&lt;li&gt;An optional WhatsApp chat button on your store&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need WordPress 6.2 or newer, PHP 7.4 or newer, WooCommerce (for the order messages), and an Android phone running Android 7 or later for SMS.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a phone-based SMS gateway works
&lt;/h2&gt;

&lt;p&gt;The idea is simple. An app on an Android phone stays connected to a cloud service. When your store wants to send a text, the plugin calls the service's API, the service passes the message to the phone, and the phone sends it as a regular SMS from its SIM card.&lt;/p&gt;

&lt;p&gt;That has real advantages for a small or mid-sized store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No sender approval.&lt;/strong&gt; The message comes from a normal phone number, so there's no sender ID or campaign registration to wait for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Replies work.&lt;/strong&gt; Customers can text back, and the reply shows up in your inbox and in WordPress.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost follows your mobile plan.&lt;/strong&gt; Many plans include unlimited local texts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And some limits you should know about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The phone needs power and signal. If it goes offline, messages wait in a queue until it reconnects.&lt;/li&gt;
&lt;li&gt;Your carrier's fair-use rules still apply. A SIM is not built for 50,000 marketing texts a day.&lt;/li&gt;
&lt;li&gt;In the US, carriers filter high-volume business traffic from regular numbers. For large volumes there, a registered 10DLC or toll-free number from a provider like Twilio is the safer route.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For order updates, appointment reminders and admin alerts, a phone gateway is usually enough. For mass marketing in the US, it isn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Set up the SMS gateway
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create an SMS Gora account at tekservix.com/smsgora. There's a free trial.&lt;/li&gt;
&lt;li&gt;Install the SMS Gora app on your Android phone and sign in. The phone shows up in your dashboard as a linked device. Dual-SIM phones let you pick which SIM sends.&lt;/li&gt;
&lt;li&gt;In the dashboard, open &lt;strong&gt;API keys&lt;/strong&gt; and create a key. Copy it somewhere safe.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Keep the phone on a charger and turn off battery optimization for the app. Some Android brands kill background apps aggressively, and that's the most common reason a gateway phone "stops sending".&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Install the WordPress SMS plugin
&lt;/h2&gt;

&lt;p&gt;Download the plugin zip from the &lt;a href="https://tekservix.com/smsgora/docs/wordpress-plugin" rel="noopener noreferrer"&gt;SMS Gora WordPress plugin guide&lt;/a&gt;, then in WordPress go to &lt;strong&gt;Plugins &amp;gt; Add New &amp;gt; Upload Plugin&lt;/strong&gt;, choose the zip and activate it.&lt;/p&gt;

&lt;p&gt;If you manage sites with WP-CLI, upload the zip to the server and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wp plugin install sms-gora.zip --activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;strong&gt;SMS Gora &amp;gt; Settings&lt;/strong&gt;, paste your API key and save. The settings screen then shows your account and how many of your phones are online.&lt;/p&gt;

&lt;p&gt;If you'd rather keep the key out of the database, define it in &lt;code&gt;wp-config.php&lt;/code&gt; instead:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;define&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'SMSGORA_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'your-api-key-here'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Turn on WooCommerce SMS notifications
&lt;/h2&gt;

&lt;p&gt;In the &lt;strong&gt;WooCommerce order SMS&lt;/strong&gt; section of the settings page you get one message per order status. Turn on the ones you want and edit the text. Placeholders fill in order details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi {first_name}, your order #{order_number} is on its way. Questions? Just reply to this text.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few things I'd recommend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start with two statuses&lt;/strong&gt;, usually processing and completed. Texting on every status change feels noisy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep messages under 160 characters.&lt;/strong&gt; Longer texts split into several SMS, and some carriers charge per part.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say who you are&lt;/strong&gt; in the first few words. The customer may not have your number saved.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, add your own number under &lt;strong&gt;new-order alerts&lt;/strong&gt;. Store owners who still refresh the WooCommerce orders page all day tend to like this one the most.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Get SMS alerts from contact forms
&lt;/h2&gt;

&lt;p&gt;The plugin hooks into Contact Form 7, WPForms, Elementor Pro Forms, Gravity Forms and Fluent Forms. Pick the form, enter the number that should get the alert, and write a short template with the form fields you care about.&lt;/p&gt;

&lt;p&gt;This is the quickest fix for "we didn't see the enquiry until Monday". For service businesses it often matters more than order texts.&lt;/p&gt;

&lt;p&gt;Turn on the hourly limit in the &lt;strong&gt;Safety&lt;/strong&gt; section too. It's off by default. If a bot floods your contact form with spam, the cap stops automatic texts before they burn through your SIM credit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Add WhatsApp notifications (optional)
&lt;/h2&gt;

&lt;p&gt;In many countries customers would rather get WhatsApp than SMS. The WAservix plugin works the same way as the SMS one, but sends from your own WhatsApp number.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a WAservix account at &lt;a href="https://tekservix.com/waservix/" rel="noopener noreferrer"&gt;tekservix.com/waservix&lt;/a&gt; (free trial) and link your number by scanning a QR code, the same way you'd link WhatsApp Web.&lt;/li&gt;
&lt;li&gt;Download the WAservix plugin from the WAservix docs, upload it to WordPress, and paste your API key.&lt;/li&gt;
&lt;li&gt;Turn on the order messages you want. You can attach an image or document link, like an invoice PDF.&lt;/li&gt;
&lt;li&gt;Optionally add the floating chat button, or place it anywhere with the &lt;code&gt;[waservix_chat]&lt;/code&gt; shortcode.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One honest warning. WAservix links your number as a companion device. It isn't the official WhatsApp Business Platform from Meta. That means no business verification and no per-conversation fees, but WhatsApp's spam rules apply to your number directly. Only message customers who expect to hear from you, warm up a new number slowly, and leave the hourly limit on. If you need a verified green-tick sender or high-volume broadcasts, Meta's official API through a provider is the right tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Receive replies and delivery reports
&lt;/h2&gt;

&lt;p&gt;Both plugins can show delivery status and incoming messages in WordPress. In the plugin settings, copy the webhook URL and secret into your SMS Gora or WAservix dashboard. After that, the message log shows sent and delivered status (and read status on WhatsApp), and replies appear in WordPress too.&lt;/p&gt;

&lt;p&gt;Developers get hooks for this. For example, to forward every incoming SMS to a Slack channel or your helpdesk:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;add_action&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'smsgora_wp_received'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// $data is the full webhook payload; pass what you need to your own handler.&lt;/span&gt;
    &lt;span class="nf"&gt;error_log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'SMS from '&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$from&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;': '&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$text&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to send a text from your own code, such as a custom booking plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;smsgora_send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;'+15551234567'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Your appointment is confirmed for 3pm tomorrow.'&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Phone gateway vs Twilio-style plugin: which one?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Phone gateway (SMS Gora)&lt;/th&gt;
&lt;th&gt;SMS provider plugin (Twilio, Vonage, etc.)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sender&lt;/td&gt;
&lt;td&gt;Your own phone number&lt;/td&gt;
&lt;td&gt;Provider number or sender ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup time&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;Hours to weeks (registration)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost model&lt;/td&gt;
&lt;td&gt;Monthly plan + your SIM rates&lt;/td&gt;
&lt;td&gt;Per message, varies by country&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Two-way replies&lt;/td&gt;
&lt;td&gt;Yes, to a normal number&lt;/td&gt;
&lt;td&gt;Yes, with extra setup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Very high volume&lt;/td&gt;
&lt;td&gt;Limited by SIM and carrier&lt;/td&gt;
&lt;td&gt;Built for it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;US business texting at scale&lt;/td&gt;
&lt;td&gt;Risky&lt;/td&gt;
&lt;td&gt;Recommended&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're a store or service business sending hundreds or a few thousand messages a month, start with the phone gateway. If you're sending tens of thousands of promotional texts in the US, use a registered provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going further
&lt;/h2&gt;

&lt;p&gt;Once order updates run on SMS and WhatsApp, two things tend to come next. Some stores add the Tekservix AI Sales Agent, which answers product questions on WhatsApp and SMS using the store's own pages and hands the chat to a person when needed. Others turn the store into an Android and iOS app with our website to app builder, which has its own WordPress plugin for push notifications and app-only content.&lt;/p&gt;

&lt;p&gt;But don't start there. Turn on two order texts and a new-order alert, run them for a week, and check how many customers reply. That will tell you more about what to add than any feature list.&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>woocommerce</category>
      <category>php</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>WAservix WhatsApp API &amp; SMS Gora SMS Gateway: Send From Your Own Number (Node.js + Python)</title>
      <dc:creator>NIYOGUSHIMWA JOSEPH</dc:creator>
      <pubDate>Thu, 05 Nov 2026 10:11:03 +0000</pubDate>
      <link>https://dev.to/tekservix/wapenda-whatsapp-api-sms-gora-sms-gateway-send-from-your-own-number-nodejs-python-1mk6</link>
      <guid>https://dev.to/tekservix/wapenda-whatsapp-api-sms-gora-sms-gateway-send-from-your-own-number-nodejs-python-1mk6</guid>
      <description>&lt;p&gt;Most messaging APIs make you rent a sender ID, wait for template approval, and pay per message before you've written a single line of code. If you just want your app to text a customer &lt;em&gt;"your order is ready"&lt;/em&gt; or &lt;em&gt;"your code is 482913"&lt;/em&gt;, that's a lot of ceremony.&lt;/p&gt;

&lt;p&gt;This post shows a lighter route: the &lt;strong&gt;&lt;a href="https://tekservix.com/waservix" rel="noopener noreferrer"&gt;WAservix WhatsApp API&lt;/a&gt;&lt;/strong&gt; sends WhatsApp messages from your own WhatsApp number, and the &lt;strong&gt;&lt;a href="https://tekservix.com/smsgora" rel="noopener noreferrer"&gt;SMS Gora SMS Gateway&lt;/a&gt;&lt;/strong&gt; sends SMS from your own Android phone and SIM card. Both are part of &lt;a href="https://tekservix.com" rel="noopener noreferrer"&gt;Tekservix&lt;/a&gt;, and both are plain REST + webhooks, so they work from any stack.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; this article is written by the Tekservix team. The code below is copied from our public docs and runs as-is once you add a key.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; WAservix is a WhatsApp API gateway for your own number. SMS Gora is an Android SMS gateway that turns your phones into an SMS API. Same REST style, same webhooks, any language.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll build
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Send a WhatsApp message (and a PDF invoice) from Node.js with the WAservix WhatsApp API&lt;/li&gt;
&lt;li&gt;Send an SMS, pick a specific SIM, and schedule it from Python with the SMS Gora SMS Gateway&lt;/li&gt;
&lt;li&gt;Receive replies and delivery updates with signed webhooks&lt;/li&gt;
&lt;li&gt;Handle rate limits and retries without sending twice&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Why "your own number" matters
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Classic messaging APIs&lt;/th&gt;
&lt;th&gt;WAservix WhatsApp API / SMS Gora SMS Gateway&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sender&lt;/td&gt;
&lt;td&gt;Rented number or sender ID&lt;/td&gt;
&lt;td&gt;Your existing WhatsApp number / your SIM cards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approval&lt;/td&gt;
&lt;td&gt;Business verification, message templates&lt;/td&gt;
&lt;td&gt;None: link the number like WhatsApp Web, or install the Android app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost model&lt;/td&gt;
&lt;td&gt;Per message&lt;/td&gt;
&lt;td&gt;Flat monthly plan (SMS is billed by your own operator like any text)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replies&lt;/td&gt;
&lt;td&gt;Extra setup&lt;/td&gt;
&lt;td&gt;Webhooks out of the box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free trial&lt;/td&gt;
&lt;td&gt;Usually needs a card&lt;/td&gt;
&lt;td&gt;3-day trial, no card&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Customers see a number they already know, and replies land in the same chat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 1: WAservix WhatsApp API with Node.js
&lt;/h2&gt;

&lt;p&gt;Create a key under &lt;strong&gt;WAservix → Devices → API key&lt;/strong&gt; (it starts with &lt;code&gt;wpk_&lt;/code&gt;). Keep it on the server, never in a browser or mobile app.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# .env  (node --env-file=.env app.mjs, Node 20.6+)&lt;/span&gt;
&lt;span class="nv"&gt;WASERVIX_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;wpk_your_key
&lt;span class="nv"&gt;WASERVIX_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_webhook_secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Send a message
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://tekservix.com/waservix/api/send-message&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WASERVIX_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;+447700900123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello Sam, your order is ready&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;statusText&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// { status: 'in_progress', msgId: ... }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Messages are queued and sent one at a time per number, so you get an answer instantly with a &lt;code&gt;msgId&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Send a document or image
&lt;/h3&gt;

&lt;p&gt;Add &lt;code&gt;imageUrl&lt;/code&gt;, &lt;code&gt;videoUrl&lt;/code&gt;, &lt;code&gt;audioUrl&lt;/code&gt; or &lt;code&gt;documentUrl&lt;/code&gt; with a public https link. Groups work too: put the group JID (&lt;code&gt;...@g.us&lt;/code&gt;) in &lt;code&gt;to&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;+447700900123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Your invoice&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;documentUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com/inv-1042.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;fileName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Invoice-1042.pdf&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Track it
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;GET /waservix/api/messages/{id}/info&lt;/code&gt; returns &lt;code&gt;queued&lt;/code&gt;, &lt;code&gt;sent&lt;/code&gt;, &lt;code&gt;delivered&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;played&lt;/code&gt; or &lt;code&gt;failed&lt;/code&gt;. Better: let webhooks tell you.&lt;/p&gt;

&lt;h3&gt;
  
  
  Receive messages with Express
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/webhooks/waservix&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;got&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-Webhook-Signature&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;WASERVIX_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;got&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;timingSafeEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;got&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// answer fast, then do the work&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;messages.received&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;cleanedSenderPn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messageBody&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://tekservix.com/waservix/docs/nodejs" rel="noopener noreferrer"&gt;WAservix WhatsApp API for Node.js&lt;/a&gt; · &lt;a href="https://tekservix.com/waservix/docs" rel="noopener noreferrer"&gt;all WAservix WhatsApp API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 2: SMS Gora SMS Gateway with Python
&lt;/h2&gt;

&lt;p&gt;The SMS Gora SMS Gateway turns Android phones you own into an SMS gateway API. Link a phone, create a key under &lt;strong&gt;SMS Gora → API keys&lt;/strong&gt; (starts with &lt;code&gt;sgk_&lt;/code&gt;), and send through its SIM cards.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;requests flask
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SMSGORA_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"sgk_your_key"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;SMSGORA_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your_webhook_secret"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Send an SMS
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;/send-sms&lt;/code&gt; picks your best online phone. Recipients can be a list of up to 1,000.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://tekservix.com/smsgora/api/v1/send-sms&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x-api-key&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SMSGORA_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;recipients&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;+447700900123&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Your code is 482913&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;  &lt;span class="c1"&gt;# includes message_ids
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Choose the phone, the SIM, and the time
&lt;/h3&gt;

&lt;p&gt;Dual-SIM phone? &lt;code&gt;sim_slot&lt;/code&gt; 0 is SIM 1, 1 is SIM 2. &lt;code&gt;schedule_at&lt;/code&gt; sends later.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://tekservix.com/smsgora/api/v1/devices/42/send-sms&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;x-api-key&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SMSGORA_KEY&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]},&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;recipients&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;+447700900123&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Your appointment is tomorrow at 10:00&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sim_slot&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;schedule_at&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;2026-12-01T08:00:00Z&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Statuses move &lt;code&gt;queued → dispatched → sent → delivered&lt;/code&gt; (or &lt;code&gt;failed&lt;/code&gt; with a reason).&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify webhooks with HMAC (Flask)
&lt;/h3&gt;

&lt;p&gt;Each request carries &lt;code&gt;X-SmsGora-Signature: sha256=...&lt;/code&gt;, an HMAC-SHA256 of the raw body.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;abort&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@app.post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/webhooks/smsgora&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;smsgora_webhook&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;expected&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sha256=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;SMSGORA_WEBHOOK_SECRET&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_data&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sha256&lt;/span&gt;
    &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;hmac&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compare_digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expected&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;X-SmsGora-Signature&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;event&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sms.received&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;from&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;message&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full guide: &lt;a href="https://tekservix.com/smsgora/docs/python" rel="noopener noreferrer"&gt;SMS Gora SMS Gateway for Python&lt;/a&gt; · &lt;a href="https://tekservix.com/smsgora/docs/" rel="noopener noreferrer"&gt;all SMS Gora SMS Gateway API docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Part 3: Production checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Placeholders only.&lt;/strong&gt; &lt;code&gt;wpk_your_key&lt;/code&gt;, &lt;code&gt;sgk_your_key&lt;/code&gt;, the +44 7700 900xxx numbers (reserved for fiction) and IDs like 42 or 1873 are examples. Every call needs your own key, and a key only sees its own phones and messages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keys stay server-side.&lt;/strong&gt; Your mobile app or frontend talks to &lt;em&gt;your&lt;/em&gt; server, which calls the API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rate limit:&lt;/strong&gt; 300 requests a minute per key. On &lt;code&gt;429&lt;/code&gt;, wait for &lt;code&gt;Retry-After&lt;/code&gt; seconds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error codes:&lt;/strong&gt; &lt;code&gt;401&lt;/code&gt; wrong key, &lt;code&gt;402&lt;/code&gt; no active plan for that number/phone, &lt;code&gt;409&lt;/code&gt; number or phone not connected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't blindly retry a send.&lt;/strong&gt; Retry 5xx and network errors with back-off, but check the message status first, or you might text someone twice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consent first.&lt;/strong&gt; Only message people who expect to hear from you. WAservix adds number protection by default (a gradual daily warm-up), because WhatsApp bans numbers that spam.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Same API, any stack
&lt;/h2&gt;

&lt;p&gt;For both the WAservix WhatsApp API and the SMS Gora SMS Gateway, copy-paste guides exist for &lt;strong&gt;Python, Django, Node.js, PHP, Laravel, WordPress, Java, Spring Boot, C#/.NET, Go and Ruby on Rails&lt;/strong&gt;, and there are WordPress plugins if you'd rather not write code at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going further
&lt;/h2&gt;

&lt;p&gt;Once the WAservix WhatsApp API and SMS Gora SMS Gateway are sending, the rest of the Tekservix platform plugs into the same numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://tekservix.com/ai-sales-agent" rel="noopener noreferrer"&gt;AI Sales Agent&lt;/a&gt;&lt;/strong&gt;: answers customer questions and sells on WhatsApp and SMS 24/7, using your products and prices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://tekservix.com/mobile-apps" rel="noopener noreferrer"&gt;App Studio&lt;/a&gt;&lt;/strong&gt;: turn your website into an &lt;strong&gt;iOS and Android app&lt;/strong&gt;, or build a native one, with store-ready builds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://tekservix.com/takesuite" rel="noopener noreferrer"&gt;Takesuite&lt;/a&gt;&lt;/strong&gt;: schedule social media posts with AI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WAservix and SMS Gora both come with a 3-day free trial, no card needed: see &lt;a href="https://tekservix.com/pricing" rel="noopener noreferrer"&gt;pricing&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;What are you sending from your app today: OTPs, order updates, appointment reminders? Tell me in the comments, and I'm happy to help with the integration.&lt;/p&gt;

</description>
      <category>whatsapp</category>
      <category>sms</category>
      <category>api</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
