<?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: Airdesk Solutions</title>
    <description>The latest articles on DEV Community by Airdesk Solutions (@airdesks).</description>
    <link>https://dev.to/airdesks</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%2F4028787%2Fc785e720-db18-4a8e-a5ee-3e1737b70fd3.jpeg</url>
      <title>DEV Community: Airdesk Solutions</title>
      <link>https://dev.to/airdesks</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/airdesks"/>
    <language>en</language>
    <item>
      <title>What I Learned Building a Multi-Tenant CRM with WhatsApp + VOIP for the Travel Industry</title>
      <dc:creator>Airdesk Solutions</dc:creator>
      <pubDate>Tue, 14 Jul 2026 13:01:48 +0000</pubDate>
      <link>https://dev.to/airdesks/what-i-learned-building-a-multi-tenant-crm-with-whatsapp-voip-for-the-travel-industry-6h3</link>
      <guid>https://dev.to/airdesks/what-i-learned-building-a-multi-tenant-crm-with-whatsapp-voip-for-the-travel-industry-6h3</guid>
      <description>&lt;p&gt;Travel agencies run on chaos. Forty WhatsApp inquiries a day across three agents, phone calls about schedule changes, emails about refunds and most agencies manage all of it with browser tabs, spreadsheets, and prayer.&lt;/p&gt;

&lt;p&gt;I've spent the last couple of years building Airdesk Solutions Private Limited, a multi-tenant CRM that pulls WhatsApp Business, voice calls, and email into one shared workspace for travel agencies. Here's what that actually involved including the parts that hurt.&lt;/p&gt;

&lt;p&gt;The core architectural decision: multi-tenancy from day one&lt;/p&gt;

&lt;p&gt;Travel agencies often have multiple branches, and B2B consolidators serve networks of sub-agents. That meant tenant isolation couldn't be an afterthought. Every conversation, booking, wallet transaction, and permission check is tenant-scoped at the data layer. Retrofitting this later would have been a rewrite; building it first slowed down v1 but made everything after cheaper.&lt;/p&gt;

&lt;p&gt;The stack: Next.js/React on the frontend, Node.js services on the backend, MongoDB for data, Cloudflare R2 for file storage, all running on Hetzner.&lt;/p&gt;

&lt;p&gt;WhatsApp Business API: the BSP question&lt;/p&gt;

&lt;p&gt;You can't just "connect WhatsApp" you go through a Business Solution Provider. We started with one BSP and are moving toward WATI/360dialog, and the lesson is: abstract your messaging layer behind your own webhook middleware from the start. BSPs differ in webhook payload shapes, template handling, and session rules. If your CRM logic talks to a BSP directly instead of to your own normalized message model, switching providers becomes surgery instead of a config change.&lt;/p&gt;

&lt;p&gt;The hard product problem isn't receiving messages it's shared-inbox semantics: who owns this conversation, what happens when two agents open the same chat, how automation hands off to a human without the customer noticing the seam.&lt;/p&gt;

&lt;p&gt;VOIP: the part nobody warns you about&lt;/p&gt;

&lt;p&gt;We run Asterisk on a Hetzner server, bridged to our admin backend through a Node.js AMI (Asterisk Manager Interface) service. Browser-based calling means WebRTC, and WebRTC means:&lt;/p&gt;

&lt;p&gt;SIP over WebSocket with SIP.js on the client&lt;br&gt;
A coturn TURN server for NAT traversal without it, "the call connects but there's no audio" becomes your most common bug report&lt;br&gt;
Firewall rules (iptables/UFW) that fight with each other in creative ways&lt;br&gt;
fail2ban, because the moment a SIP port is public, brute-force registration attempts start within hours&lt;/p&gt;

&lt;p&gt;One-way audio issues alone taught me more about NAT than any networking course. If you're adding calling to a SaaS product: budget 3x the time you think telephony will take.&lt;/p&gt;

&lt;p&gt;What I'd tell anyone building vertical SaaS&lt;/p&gt;

&lt;p&gt;Pick a vertical with genuinely different workflows. Travel isn't "sales pipeline + custom fields." Bookings, agent wallets, supplier ledgers quirks mean a generic CRM genuinely doesn't fit that's the moat.&lt;/p&gt;

&lt;p&gt;Own your integration boundaries. Normalize external APIs (BSPs, telephony) into your own models immediately.&lt;/p&gt;

&lt;p&gt;Multi-tenant isolation is a feature you sell, not just architecture choice agencies ask about data separation in every demo.&lt;br&gt;
Infrastructure is product. When a travel agent's softphone drops a call, they don't care whose TURN server it was.&lt;/p&gt;

&lt;p&gt;Happy to go deeper on any of this in the comments — especially the Asterisk/WebRTC side, which I have opinions about.&lt;/p&gt;

&lt;p&gt;Airdesk is live at &lt;a href="http://www.theairdesk.com" rel="noopener noreferrer"&gt;www.theairdesk.com&lt;/a&gt; if you're curious what it became.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>sass</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
