How to Connect WhatsApp Notifications to Slack Channels Without Third-Party Services

Integrating WhatsApp notifications with Slack channels can significantly enhance team communication by enabling real-time updates from WhatsApp directly in your Slack workspace. While third-party services like Zapier, Onlizer, or ChatArchitect offer seamless integrations, some businesses prefer to avoid external dependencies for reasons such as data privacy, cost, or customization needs. This guide provides a detailed, expert-level approach to setting up WhatsApp event notifications in Slack channels without third-party services, leveraging the WhatsApp Business API and Slack’s API. The focus is on achieving a secure, scalable, and customizable integration tailored to your business needs.

Why Integrate WhatsApp with Slack?

Before diving into the technical setup, let’s explore why this integration is valuable:

  • Centralized Communication: Consolidate customer inquiries, team updates, or critical alerts from WhatsApp into a single Slack channel for better collaboration.
  • Real-Time Notifications: Instantly receive WhatsApp messages or event triggers (e.g., new messages, status updates) in Slack, reducing response times.
  • No Third-Party Dependency: Avoid recurring costs, data privacy concerns, or limitations imposed by external platforms.
  • Customizability: Build a solution tailored to your specific workflows, such as filtering high-priority messages or routing to specific channels.

This guide assumes you have administrative access to a WhatsApp Business API account, a Slack workspace, and basic programming knowledge (e.g., Node.js or Python). The solution uses webhooks, APIs, and a lightweight server to handle the integration.

Prerequisites

To set up WhatsApp notifications in Slack without third-party services, you’ll need:

  1. WhatsApp Business API Account:
    • A registered WhatsApp Business account with API access.
    • A verified business phone number.
    • API credentials (API key, phone number ID, and access token).
  2. Slack Workspace:
    • Administrative or owner permissions to create and manage Slack apps.
    • A designated Slack channel for notifications.
  3. Development Environment:
    • A server or cloud platform (e.g., AWS, Heroku, or a local Node.js/Python server) to host the integration logic.
    • Familiarity with REST APIs, webhooks, and basic server-side scripting.
  4. Tools:
    • Node.js or Python for scripting.
    • Ngrok (for local testing of webhooks).
    • cURL or Postman for API testing.

Step-by-Step Integration Guide

Step 1: Set Up WhatsApp Business API Webhook

The WhatsApp Business API uses webhooks to notify your server of incoming messages or events. You’ll need to configure a webhook endpoint to receive these events.

  1. Create a Webhook Endpoint:

Set up a simple server using Node.js or Python. For example, use Express.js (Node.js) to create an endpoint:

const express = require('express');
const app = express();
app.use(express.json());

app.post('/webhook', (req, res) => {
  console.log('Received WhatsApp Webhook:', req.body);
  res.status(200).send('Webhook received');
});

app.listen(3000, () => console.log('Server running on port 3000'));

  • Deploy this server to a public URL (e.g., using Heroku) or use Ngrok for local testing to expose your localhost to the internet.

  1. Configure WhatsApp Webhook:


    • Log in to the Meta for Developers portal (or your WhatsApp Business API provider’s dashboard).
    • Navigate to the WhatsApp Business API settings.
    • Add your webhook URL (e.g., https://your-server.com/webhook).
    • Set the webhook to listen for events like messages (for incoming messages) or statuses (for message delivery updates).

Verify the webhook by implementing the verification endpoint (Meta requires a GET endpoint to confirm the webhook URL).


app.get('/webhook', (req, res) => {
  const verifyToken = 'YOUR_VERIFY_TOKEN';
  if (req.query['hub.mode'] === 'subscribe' && req.query['hub.verify_token'] === verifyToken) {
    res.status(200).send(req.query['hub.challenge']);
  } else {
    res.status(403).send('Verification failed');
  }
});



  1. Test the Webhook:

Send a test message to your WhatsApp Business number and verify that your server receives the payload. The payload will look something like this:


{
  "object": "whatsapp_business_account",
  "entry": [{
    "changes": [{
      "value": {
        "messages": [{
          "from": "1234567890",
          "text": { "body": "Hello, this is a test!" }
        }]
      }
    }]
  }]
}

Step 2: Create a Slack App for Posting Notifications

To send WhatsApp events to a Slack channel, you’ll need a Slack app with permissions to post messages.

  1. Create a Slack App:


    • Go to api.slack.com/apps and click “Create New App.”
    • Name your app (e.g., “WhatsAppNotifier”) and select your Slack workspace.
    • Under “Permissions,” add the chat:write scope to allow the app to post messages.
  2. Obtain a Bot Token:


    • In the Slack app settings, navigate to “OAuth & Permissions.”
    • Install the app to your workspace and copy the “Bot User OAuth Token” (starts with xoxb-).
  3. Test Posting to Slack:

Use the Slack API’s chat.postMessage endpoint to test posting a message. For example, in Node.js using the @slack/web-api package:


const { WebClient } = require('@slack/web-api');
const slack = new WebClient('YOUR_SLACK_BOT_TOKEN');

async function postToSlack(channel, message) {
  await slack.chat.postMessage({
    channel: channel,
    text: message
  });
}

postToSlack('#whatsapp-notifications', 'Test message from WhatsApp!');

  • Ensure the bot is invited to the target Slack channel (e.g., /invite @WhatsAppNotifier).

Step 3: Bridge WhatsApp Webhooks to Slack

Now, combine the WhatsApp webhook with the Slack API to forward notifications.

  1. Parse WhatsApp Webhook Payload:

Modify your webhook endpoint to extract relevant information (e.g., sender’s phone number, message text):

 

app.post('/webhook', async (req, res) => {
  const payload = req.body;
  if (payload.object === 'whatsapp_business_account') {
    const messages = payload.entry[0].changes[0].value.messages;
    if (messages && messages.length > 0) {
      const message = messages[0];
      const sender = message.from;
      const text = message.text?.body || 'Non-text message received';
      const slackMessage = `New WhatsApp message from ${sender}: ${text}`;
      await postToSlack('#whatsapp-notifications', slackMessage);
    }
  }
  res.status(200).send('Webhook received');
});

  1. Handle Media Messages:

If the WhatsApp message contains media (e.g., images, videos), retrieve the media URL using the WhatsApp API and upload it to Slack:


const axios = require('axios');

async function handleMediaMessage(message, slackChannel) {
  const mediaId = message.image?.id || message.video?.id;
  if (mediaId) {
    const mediaUrl = await getMediaUrl(mediaId);
    const mediaResponse = await axios.get(mediaUrl, {
      headers: { Authorization: `Bearer YOUR_WHATSAPP_ACCESS_TOKEN` },
      responseType: 'stream'
    });
    await slack.files.upload({
      channels: slackChannel,
      file: mediaResponse.data,
      filename: `whatsapp_media_${mediaId}`
    });
  }
}

async function getMediaUrl(mediaId) {
  const response = await axios.get(`https://graph.facebook.com/v17.0/${mediaId}`, {
    headers: { Authorization: `Bearer YOUR_WHATSAPP_ACCESS_TOKEN` }
  });
  return response.data.url;
}

  1. Deploy and Test:


    • Deploy your server to a cloud platform (e.g., AWS EC2, Heroku).
    • Send test messages to your WhatsApp Business number and verify that they appear in the designated Slack channel.

Step 4: Enhance the Integration

To make the integration more robust, consider these advanced features:

  • Message Filtering: Add logic to filter messages based on keywords, sender, or priority. For example, only forward messages containing “urgent” to a specific Slack channel.
  • Two-Way Communication: Allow Slack users to reply to WhatsApp messages by sending messages to the Slack bot, which forwards them via the WhatsApp API.
  • Error Handling: Implement retry mechanisms for failed API calls and log errors to a dedicated Slack channel.
  • Security: Secure your webhook endpoint with authentication (e.g., verify WhatsApp’s webhook signature) and use environment variables for sensitive data like API tokens.

Step 5: Monitor and Maintain

  • Monitor Webhook Health: Regularly check that your webhook endpoint is receiving events. Use tools like AWS CloudWatch or a simple logging mechanism.
  • Update API Versions: Both WhatsApp and Slack APIs may update. Monitor Meta for Developers and Slack API documentation for breaking changes.
  • Scale as Needed: If message volume increases, consider load balancing or optimizing your server for performance.

Challenges and Considerations

  • WhatsApp API Restrictions: The WhatsApp Business API has strict policies, such as message template approvals and rate limits. Ensure compliance to avoid account suspension.
  • Slack Rate Limits: Slack’s API has rate limits (e.g., 1 message per second per channel). Implement queuing for high-volume notifications.
  • Data Privacy: Since you’re handling customer data, ensure GDPR or CCPA compliance by securing data in transit and at rest.
  • Maintenance Overhead: Without third-party services, you’re responsible for server uptime, updates, and debugging.

Conclusion

Integrating WhatsApp notifications with Slack channels without third-party services is a powerful way to streamline communication while maintaining full control over your data and workflows. By leveraging the WhatsApp Business API and Slack’s API, you can create a custom solution that meets your team’s needs. While this approach requires technical expertise and ongoing maintenance, it offers unmatched flexibility and cost savings compared to third-party platforms.

Related articles/news

WhatsApp Business API free trial request

Your personal WhatsApp number* ?
Number for WhatsApp Business API* ?
Your company Website URL
What app do you want to connect with WhatsApp?
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.