<?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: J</title>
    <description>The latest articles on DEV Community by J (@morphlogy).</description>
    <link>https://dev.to/morphlogy</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3076377%2Fd9e4dc3f-347c-451a-9771-3b15e6239b87.png</url>
      <title>DEV Community: J</title>
      <link>https://dev.to/morphlogy</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/morphlogy"/>
    <language>en</language>
    <item>
      <title>Send WhatsApp Messages with n8n in 4 Steps</title>
      <dc:creator>J</dc:creator>
      <pubDate>Wed, 20 Aug 2025 05:13:27 +0000</pubDate>
      <link>https://dev.to/morphlogy/send-whatsapp-messages-with-n8n-in-4-steps-4bn8</link>
      <guid>https://dev.to/morphlogy/send-whatsapp-messages-with-n8n-in-4-steps-4bn8</guid>
      <description>&lt;p&gt;Hello Fellow,&lt;/p&gt;

&lt;p&gt;Goal:&lt;/p&gt;

&lt;p&gt;Today’s goal is to create an API for sending (initially) whatsapp messages, but we are not doing it programmatically as usual. Since I am learning n8n basics, the idea is to use it.&lt;/p&gt;

&lt;p&gt;For this we are going through 4 steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Preparation: Meta Developer Account and WhatsApp Setup&lt;/li&gt;
&lt;li&gt;Run an n8n Instance with Docker&lt;/li&gt;
&lt;li&gt;Build the WhatsApp Workflow in n8n&lt;/li&gt;
&lt;li&gt;Test Your WhatsApp API&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Preparation: Meta Developer Account and WhatsApp Setup
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Go to Meta for Developers and create a Meta Developer Account.&lt;/li&gt;
&lt;li&gt;Create an App (type: Business) and go to WhatsApp → Getting Started. &lt;a href="https://developers.facebook.com/docs/whatsapp/cloud-api/get-started" rel="noopener noreferrer"&gt;Getting started&lt;/a&gt; with WhatsApp api You’ll get:

&lt;ul&gt;
&lt;li&gt;Temporary Access Token (valid 24h).&lt;/li&gt;
&lt;li&gt;Phone Number ID.&lt;/li&gt;
&lt;li&gt;WhatsApp Business Account ID.&lt;/li&gt;
&lt;li&gt;A test phone number is provided (sender).&lt;/li&gt;
&lt;li&gt;You must add recipient phone numbers manually for testing.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Remember&lt;/strong&gt;: you must generate a permanent token later for production (see Docs).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alternatives:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are other options for sending messages, especially if you want to delegate some responsibility. You could check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Twilio WhatsApp API&lt;/li&gt;
&lt;li&gt;360dialog WhatsApp API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Notes&lt;/strong&gt;: Creating the account is supposed to be easy… but the process can be annoying. You have to log in with Facebook, I didn’t have my phone number updated, couldn’t remove the old one, couldn’t create an account… it was a mess haha. Hopefully your process is smoother than mine.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Run an n8n Instance with Docker
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create a &lt;code&gt;docker-compose&lt;/code&gt; with this basic config. Feel free to change the AUTH values. &lt;a href="https://docs.n8n.io/hosting/installation/server-setups/docker-compose/" rel="noopener noreferrer"&gt;Related doc&lt;/a&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  n8n:
    image: n8nio/n8n
    ports:
      - "5678:5678"
    environment:
      - N8N_BASIC_AUTH_ACTIVE=true
      - N8N_BASIC_AUTH_USER=admin
      - N8N_BASIC_AUTH_PASSWORD=admin
    volumes:
      - ./n8n_data:/home/node/.n8n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Run the file  and test you can access its interface at:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://localhost:5678
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will ask you to create an owner account if this is your first time in that instance.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;And create the workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. Build the WhatsApp Workflow in n8n
&lt;/h2&gt;

&lt;p&gt;We need 3 main nodes:&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1. Webhook node
&lt;/h3&gt;

&lt;p&gt;This node is going to act as your API, so choose:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Path: &lt;code&gt;/wp/send-message&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Auth: &lt;code&gt;none&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Respond: &lt;code&gt;Using Respond to Webhook node&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.2. HTTP Request node
&lt;/h3&gt;

&lt;p&gt;This node is going to call META’s API to send your whatsapp message&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Method: &lt;code&gt;POST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;URL:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://graph.facebook.com/v19.0/&amp;lt;PHONE_NUMBER_ID&amp;gt;/messages
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Headers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Authorization: Bearer &amp;lt;YOUR_ACCESS_TOKEN&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Content-Type: application/json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Body:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="nl"&gt;"messaging_product"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"whatsapp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;your number&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"template"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="nl"&gt;"template"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello_world"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en_US"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; 
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.3. Respond to Webhook node
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Returns success response: &lt;code&gt;All incoming items&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Response Code: &lt;code&gt;200&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Test Your WhatsApp API
&lt;/h2&gt;

&lt;p&gt;Along the process you can reach whatsapp API with the CURL they suggest to you that should look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --location 'https://graph.facebook.com/v22.0/123123/messages' \
--header 'Authorization: Bearer EEEEEE' \
--header 'Content-Type: application/json' \
--data '{ "messaging_product": "whatsapp", "to": "000000", "type": "template", "template": { "name": "hello_world", "language": { "code": "en_US" } } }'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And once you have the &lt;strong&gt;Webhook Node&lt;/strong&gt;  running you should be able to test it with something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --location --request POST 'http://localhost:5678/webhook-test/wp/send-message'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember, this is just the simplest example and a first approach. From here, you can keep playing with it by adding templates, values, etc.&lt;/p&gt;

&lt;p&gt;And remember: deploying for production requires additional configs for both Meta’s API and the n8n deployment.&lt;/p&gt;

&lt;p&gt;You can check the repo with the mentioned &lt;a href="https://github.com/juanmonsalveh/n8n-whatsapp-api" rel="noopener noreferrer"&gt;code here&lt;/a&gt;.  Remember to update your Ids,  Vars and tokens.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>whatsapp</category>
      <category>automation</category>
      <category>api</category>
    </item>
    <item>
      <title>Hello World, Hello Me. My Developer Archive</title>
      <dc:creator>J</dc:creator>
      <pubDate>Tue, 08 Jul 2025 02:58:38 +0000</pubDate>
      <link>https://dev.to/morphlogy/hello-world-hello-me-my-developer-archive-42kj</link>
      <guid>https://dev.to/morphlogy/hello-world-hello-me-my-developer-archive-42kj</guid>
      <description>&lt;p&gt;Hello Fellow, welcome to this, My Archive initiative, &lt;br&gt;
...ideally structured enough to be understood later...&lt;/p&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;Well, I could say a lot here, but I’ll simply say:&lt;/p&gt;

&lt;p&gt;I enjoy what I do and the world around us, but sometimes I can feel overwhelmed by the amount of information available and the non-stop pace of this crazy world… there is too much to know, too little time, and an entire life to live outside the screen.&lt;/p&gt;

&lt;p&gt;Exercise regularly. Eat well. Seriously.&lt;/p&gt;

&lt;p&gt;This blog is a way for me to cope, relax, and document things…&lt;/p&gt;

&lt;h2&gt;
  
  
  How?
&lt;/h2&gt;

&lt;p&gt;My idea for this blog is to record my different attempts and approaches to technologies and tools that might be new to me, documenting my journey through them and storing and hopefully sharing the knowledge and resources I've gathered along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  About Me
&lt;/h2&gt;

&lt;p&gt;Just another engineer, trying to improve, share, and learn. And yes, English is not my first language… in case you read some weird English, it’s not intentional… probably… In any case, feedback is more than welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Posts by Topic
&lt;/h2&gt;

&lt;p&gt;Upcomming entries:&lt;/p&gt;

&lt;h3&gt;
  
  
  Web
&lt;/h3&gt;

&lt;p&gt;&lt;a href=""&gt;Web - Improving SEO and Other basic concepts and configs *&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;Web - Cloudflare - Improving SEO configurations *&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ☁️ Cloud &amp;amp; DevOps
&lt;/h3&gt;

&lt;p&gt;&lt;a href=""&gt;Transfer Domain management to Cloudflare *&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;Deploying  and Masking a static website with Cloudflare * &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;CloudFlare - Worker deployed on subdomain *&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;CloudFlare - Securing your Worker *&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;AWS - Enable cloudwatch logging in API Gateway *&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;AWS - How to create a certificate *&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;AWS - Protect Lambda with Domain in Cloudflare *&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;AWS - IAM User for Cli usage *&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;AWS Securing your Lambda&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;AWS - Cloudflare - serverless - Securing communication&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;Basic Protection for your Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;AWS - API Gateway&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;CloudFlare - Worker as Proxy&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;AWS SES &amp;amp; AWS Lambda&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;AWS - DynamoDb - Cli&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🛠️ Tools &amp;amp; Tips
&lt;/h3&gt;

</description>
      <category>programming</category>
      <category>devjournal</category>
      <category>webdev</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
