Dardasha Documentation Complete guide to the Dardasha WhatsApp Business Platform
Dardasha is a WhatsApp Business messaging platform built by BHD Group (Bin Haider Darwish L.L.C.) in Muscat, Oman. Dardasha (دردشة, Arabic for "chat") is hosted for you at app.dardasha.om. Connect WhatsApp numbers, manage all conversations in one inbox, run bulk campaigns, and automate replies. Built for agencies, businesses, and resellers. Start with a 10-day free trial, no card, then subscribe in OMR through Paymob.
What Dardasha does
Multi-Number WhatsApp
Connect unlimited WhatsApp numbers via QR code. Auto-reconnect, session persistence.
Real-Time Inbox
Unified inbox for all numbers. Send text, images, videos, audio, documents.
Bulk Campaigns
Campaign manager with smart anti-spam delays, scheduling, and delivery tracking.
Auto Replies
Keyword triggers with exact, contains, starts_with, and regex matching.
Contact Management
Import/export CSV. Tags, notes, conversation history, block list.
Multi-Tenant Workspaces
Isolated workspaces with role-based access. Perfect for agencies.
REST API
Full API with JWT & API key auth. Swagger docs included.
White-Label
Change name, logo, colors, favicon — make it 100% your brand.
Requirements
| Component | Minimum | Recommended |
|---|---|---|
| Operating System | Any Linux with Docker | Ubuntu 22.04 LTS |
| RAM | 1 GB | 2 GB+ |
| Node.js | 18+ | 20+ LTS |
| Database | MySQL 5.7 / MariaDB 10.5 | MySQL 8.0 |
| Docker | 20.10+ | Latest (recommended) |
Installation
Option A: One-Click Installer (Recommended)
The fastest way to get Dardasha running. SSH into your server and run:
bash <(curl -s https://dardasha.om/install.sh)
The installer will configure everything: Docker, database, environment, and start the application. Open http://your-server:3000 when it finishes.
Option B: Docker Compose
git clone https://github.com/dardasha/dardasha
cd dardasha
cp .env.example .env
# Edit .env with your database credentials and JWT secret
nano .env
docker-compose up -d
http://your-server:3000. Continue to Plans & Subscription.
Option C: Manual Install (Node.js)
CREATE DATABASE dardasha CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
mysql -u root -p dardasha < backend/database.sql
cp .env.example .env
nano .env # Set DB_HOST, DB_NAME, DB_USER, DB_PASSWORD, JWT_SECRET
cd backend && npm install && cd ..
cd frontend && npm install && npm run build && cd ..
# Development
cd backend && node server.js
# Production (PM2)
npm install -g pm2
pm2 start backend/server.js --name dardasha
pm2 save && pm2 startup
Nginx Reverse Proxy (Production)
server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name your-domain.com;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
client_max_body_size 20M;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400;
}
}
Upgrade and Connection "upgrade" headers are required for WebSocket (Socket.IO) to work properly.
Plans & Subscription
Dardasha is a subscription platform. There is no purchase code and no per-domain licence: your account carries your plan. Every new account starts on a 10-day free trial with full platform access and no credit card.
Sign up at app.dardasha.om. The 10-day trial starts immediately: 10 WhatsApp lines, 100 contacts, and the full feature set.
Premium, OMR 4.900 per year: 10 WhatsApp lines, 365 days validity, chatbots and auto-replies, REST API, WhatsApp warmer.
Platinum, OMR 14.900 per year: everything in Premium plus 24 WhatsApp lines and 10,000 contacts.
Billed once a year through Paymob: Visa, Mastercard, OmanNet, or Apple Pay. Cancel anytime. No per-message charges and no Meta API fees.
Configuration
All configuration is done through environment variables in the .env file:
| Variable | Description | Default | Required |
|---|---|---|---|
PORT | Server port | 3000 | No |
NODE_ENV | production / development | production | No |
DB_HOST | MySQL host | db (Docker) / localhost | Yes |
DB_PORT | MySQL port | 3306 | No |
DB_NAME | Database name | dardasha | Yes |
DB_USER | Database user | root | Yes |
DB_PASSWORD | Database password | — | Yes |
JWT_SECRET | Secret for JWT tokens | — | Yes |
JWT_EXPIRES_IN | Token expiry | 7d | No |
ADMIN_EMAIL | Default admin email | admin@dardasha.com | No |
ADMIN_PASSWORD | Default admin password | admin123 | No |
UPLOAD_DIR | File upload directory | ./uploads | No |
MAX_FILE_SIZE | Max upload size (bytes) | 16777216 (16MB) | No |
RATE_LIMIT_MAX | Max requests per window | 100 | No |
CORS_ORIGIN | Allowed CORS origin | * | No |
JWT_SECRET, DB_PASSWORD, and ADMIN_PASSWORD from their defaults in production!
Connecting WhatsApp
Go to Settings → WhatsApp Numbers (or Lines in the sidebar).
Click "Add Line". Give it a name (e.g., "Main Business", "Support Line").
A QR code appears on screen. On your phone, open WhatsApp → Settings → Linked Devices → Link a Device → scan the QR code.
Status changes from QR Pending → Connecting → Connected ✅. Takes about 5–15 seconds.
Status Indicators
| Status | Meaning |
|---|---|
| QR Pending | QR code displayed, waiting for scan |
| Connecting 🔄 | QR scanned, establishing connection |
| Connected ✅ | Active and receiving messages |
| Disconnected ❌ | Connection lost — will auto-reconnect |
Multiple numbers: Repeat the process for each WhatsApp number you want to connect. There's no technical limit — each number uses about 50–100MB of RAM.
Chat Inbox
The Chat page is your unified inbox — all messages from all connected WhatsApp numbers appear here in real-time via WebSocket.
Inbox Features
- Filter by line: View conversations from a specific WhatsApp number
- Filter by status: Show only unread or assigned conversations
- Search: Find conversations by contact name or phone number
- Pin & Archive: Keep important chats at the top
Sending Messages
Click a conversation to open it. You can send:
- Text messages — type and press Enter
- Images — click the paperclip icon
- Videos, audio, documents — all media types supported
- Reply to specific messages — right-click or long-press
Message Status
| Icon | Status |
|---|---|
| 🕐 | Pending — queued for sending |
| ✓ | Sent — delivered to WhatsApp server |
| ✓✓ | Delivered — reached recipient's phone |
| ✓✓ (blue) | Read — recipient opened the message |
Agent Assignment
Assign conversations to specific team members. Agents with the "Agent" role see only their assigned conversations — perfect for customer support teams.
Contact Notes
Add internal notes to any contact. Notes are visible only to your team and don't affect the WhatsApp conversation.
Bulk Campaigns
Go to Campaigns → New Campaign. Set a name and select which WhatsApp line to send from.
Write your message text. Supports variables: {name}, {phone}. Optionally attach an image, video, or document.
Choose from: all contacts, contacts with specific tags, or upload a CSV of phone numbers.
Configure anti-spam delay (2–8 seconds between messages). Schedule for now or a future date/time.
Click "Start Campaign". A real-time progress bar shows delivery status. Pause / Resume / Cancel anytime.
Delivery Report
After completion, view the delivery report showing: sent, delivered, failed, and read counts per message.
Auto Replies
Create keyword-triggered auto-replies that fire automatically when an incoming message matches your rules.
Trigger Types
| Type | Description | Example Keyword | Matches |
|---|---|---|---|
| Exact | Full message must match | hello | "hello" only |
| Contains | Keyword appears anywhere | price | "what's the price?", "price list" |
| Starts With | Message begins with keyword | order | "order #123", "order status" |
| Regex | Regular expression | ^(hi|hello|hey)$ | "hi", "hello", "hey" |
Actions
Each rule can reply with text or media (image, video, document). Example:
Trigger: "price" (contains)
Reply: "Thanks for your interest! Our prices start from 0.5 OMR.
Reply with your requirement and we'll send a quote."
Scheduling
Enable "Working hours only" to restrict when auto-replies fire:
- Start/End time: e.g., 09:00 – 17:00
- Working days: Select which days (Mon–Fri, Sun–Thu, custom)
Scope & Priority
- Per-line: Assign a rule to a specific WhatsApp number
- Global: Leave line empty — applies to all numbers
- Priority: Lower number = higher priority. Drag to reorder.
Contact Management
Adding Contacts
- Manual: Click "Add Contact" — fill in name, phone, email, tags, notes
- CSV Import: Upload a CSV file
- Auto-create: Contacts are created automatically from incoming messages
CSV Format
name,phone,email,tags
John Smith,96812345678,john@example.com,"lead,premium"
Jane Doe,96887654321,jane@example.com,"customer"
96812345678 for Oman.
Features
- Tags: Organize contacts into groups. Use tags when selecting campaign recipients.
- Notes: Add internal notes per contact (visible only to your team).
- Export: Download all contacts as CSV.
- History: View full conversation history per contact.
- Bulk operations: Tag, untag, or delete multiple contacts at once.
- Block/Unblock: Block contacts to stop receiving their messages.
Multi-Tenant Workspaces
Create isolated workspaces for different businesses, departments, or clients. Each workspace has its own WhatsApp numbers, contacts, campaigns, and team members.
Inviting Team Members
- Go to Team in the sidebar
- Click "Invite Member"
- Enter their email and select a role
- They receive an invitation link to create their account
Roles & Permissions
| Role | Permissions |
|---|---|
| Owner | Full access, billing, team management |
| Admin | All features except billing |
| Agent | Assigned conversations only — ideal for support teams |
| User | View & send in inbox, access contacts |
Workspace Isolation
- Per-workspace WhatsApp numbers
- Per-workspace contacts and campaigns
- Per-workspace plan limits (configurable by admin)
- Users in Workspace A cannot see Workspace B data
Admin Panel
The admin panel (/admin) is accessible only to superadmin users.
Dashboard
System-wide statistics: total users, workspaces, connected lines, messages sent, active campaigns.
User Management
- View all users across all workspaces
- Activate / deactivate accounts
- Change roles, reset passwords
Workspace Management
- View all workspaces
- Change plans (Free, Starter, Pro, Enterprise)
- Adjust per-workspace limits
- Activate / deactivate workspaces
White-Label Branding
Rebrand the entire platform as your own. Go to Admin Panel → Branding.
| Setting | Description |
|---|---|
| App Name | Replaces "Dardasha" everywhere — sidebar, login, browser tab |
| Logo | Custom logo for sidebar and login page (200×200 PNG recommended) |
| Favicon | Browser tab icon (32×32 or 64×64 PNG) |
| Primary Color | Accent color for buttons, links, badges. 8 presets or custom hex. |
| Login Background | Custom image or CSS gradient for the login page |
| Custom CSS | Inject custom CSS globally. Use var(--brand-primary) for theme-aware styles. |
| Footer Text | Custom footer text. Set empty to hide "Powered by". |
| Support Email | Shown in error pages and support links |
Live Preview
All changes show a live preview in desktop and mobile views before you save.
Plans & Limits
| Feature | Free | Starter | Pro | Enterprise |
|---|---|---|---|---|
| WhatsApp Lines | 1 | 3 | 10 | Unlimited |
| Contacts | 500 | 5,000 | 50,000 | Unlimited |
| Campaigns/month | 5 | 20 | Unlimited | Unlimited |
| Team Members | 1 | 5 | 20 | Unlimited |
| Auto Replies | 5 | 20 | Unlimited | Unlimited |
| API Access | ❌ | ✅ | ✅ | ✅ |
Plans are assigned per workspace by the super admin. Limits are fully customizable in the admin panel.
REST API Reference
Dardasha exposes a comprehensive REST API for sending messages, managing groups, and integrating with external systems. All /rest/* endpoints use token-based authentication via the business API token.
Base URL
https://your-domain.com/api/qr/rest
Authentication
All REST endpoints require a token parameter (your business API token) and a from parameter (the WhatsApp number/instance to send from).
// Every request includes:
{
"token": "your_business_api_token",
"from": "96891117795"
}
/api/messages/lines/:id/regenerate-key endpoint to generate one programmatically.
Rate Limiting & Anti-Ban
Built-in protections to keep your WhatsApp number safe:
| Protection | Limit |
|---|---|
| Rate limit | 20 messages per minute per token |
| Daily cap | 1,500 messages per day per session |
| Identical message | Max 3 identical messages per hour |
| Typing simulation | Auto "composing" indicator before sending (0.8–4s) |
| Gaussian jitter | Random 1.5–5s delay between queued messages |
Send Message
Body parameters:
| Param | Type | Required | Description |
|---|---|---|---|
token | string | Yes | Business API token |
from | string | Yes | Sender WhatsApp number |
to | string | Yes | Recipient number (international format, no +) |
messageType | string | Yes | text, image, video, audio, document, or location |
requestType | string | No | Set to "group" for group messages |
text | string | For text | Message text content |
imageUrl | string | For image | URL of image to send |
videoUrl | string | For video | URL of video to send |
audioUrl | string | For audio | URL of audio file |
documentUrl | string | For document | URL of document file |
filename | string | No | Display filename for documents |
caption | string | No | Caption for image/video/document |
locationLatitude | number | For location | Latitude |
locationLongitude | number | For location | Longitude |
# Send a text message
curl -X POST https://dardasha.om/api/qr/rest/send_message \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"to": "96871234567",
"messageType": "text",
"text": "Hello from Dardasha!"
}'
# Send an image with caption
curl -X POST https://dardasha.om/api/qr/rest/send_message \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"to": "96871234567",
"messageType": "image",
"imageUrl": "https://example.com/photo.jpg",
"caption": "Check this out!"
}'
# Send a document
curl -X POST https://dardasha.om/api/qr/rest/send_message \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"to": "96871234567",
"messageType": "document",
"documentUrl": "https://example.com/invoice.pdf",
"filename": "Invoice-2026.pdf"
}'
# Send a location
curl -X POST https://dardasha.om/api/qr/rest/send_message \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"to": "96871234567",
"messageType": "location",
"locationLatitude": 23.5880,
"locationLongitude": 58.3829
}'
/rest/send_message?token=...&from=...&to=...&messageType=text&text=Hello — useful for quick integrations and webhook callbacks.
Send Reaction
emoji string to remove a reaction.
Body:
{ token, from, chatId, messageId, emoji, fromMe? }
curl -X POST https://dardasha.om/api/qr/rest/send_reaction \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"chatId": "96871234567",
"messageId": "3EB0A1B2C3D4E5F6",
"emoji": "👍"
}'
Edit Message
fromMe: true).
Body:
{ token, from, chatId, messageId, text, fromMe? }
curl -X POST https://dardasha.om/api/qr/rest/edit_message \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"chatId": "96871234567",
"messageId": "3EB0A1B2C3D4E5F6",
"text": "Updated message text"
}'
Send Poll
Body:
| Param | Type | Description |
|---|---|---|
token | string | Business API token |
from | string | Sender number |
chatId | string | Recipient number or group ID |
question | string | Poll question |
options | string[] | Array of option strings (2–12) |
selectableCount | number | How many options can be selected (default: 1) |
curl -X POST https://dardasha.om/api/qr/rest/send_poll \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"chatId": "96871234567",
"question": "What time works for the meeting?",
"options": ["9:00 AM", "10:00 AM", "11:00 AM", "2:00 PM"],
"selectableCount": 1
}'
Send Sticker
Body:
{ token, from, chatId, stickerUrl }
curl -X POST https://dardasha.om/api/qr/rest/send_sticker \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"chatId": "96871234567",
"stickerUrl": "https://example.com/sticker.webp"
}'
Delete Message
Body:
{ token, from, chatId, messageId, fromMe? }
Ping Call (Experimental)
Body:
{ token, from, to, duration? } (duration in seconds, default: 5)
Group Management API
Full group management: create groups, manage participants, update info, and send group messages.
Create Group
Body:
{ token, from, subject, participants[] }
participants is an array of phone numbers (international format).
curl -X POST https://dardasha.om/api/qr/rest/group/create \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"subject": "Project Team",
"participants": ["96871234567", "96879876543"]
}'
Get Group Info
Body:
{ token, from, groupId }
// Response:
{
"success": true,
"data": {
"id": "120363012345678901@g.us",
"subject": "Project Team",
"desc": "Team chat for the project",
"participants": [
{ "id": "96891117795@s.whatsapp.net", "admin": "superadmin" },
{ "id": "96871234567@s.whatsapp.net", "admin": null }
],
"size": 2,
"creation": 1710600000
}
}
Manage Participants
Body:
| Param | Type | Description |
|---|---|---|
token | string | Business API token |
from | string | Sender number |
groupId | string | Group JID (e.g. 120363...@g.us) |
participants | string[] | Array of phone numbers |
action | string | add, remove, promote, or demote |
# Add members to a group
curl -X POST https://dardasha.om/api/qr/rest/group/participants \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"groupId": "120363012345678901@g.us",
"participants": ["96879876543"],
"action": "add"
}'
# Promote to admin
curl -X POST https://dardasha.om/api/qr/rest/group/participants \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"groupId": "120363012345678901@g.us",
"participants": ["96879876543"],
"action": "promote"
}'
Update Group Info
Body:
{ token, from, groupId, subject?, description? }
Get Invite Link
{ success: true, inviteCode: "ABC123...", link: "https://chat.whatsapp.com/ABC123..." }
Body:
{ token, from, groupId }
Send Group Message
Body:
{ token, from, groupId, messageType, text?, imageUrl?, caption?, videoUrl?, documentUrl?, filename? }
curl -X POST https://dardasha.om/api/qr/rest/group/send \
-H "Content-Type: application/json" \
-d '{
"token": "your_token",
"from": "96891117795",
"groupId": "120363012345678901@g.us",
"messageType": "text",
"text": "Hello team! Meeting at 3pm."
}'
Internal API (Dashboard)
These endpoints are used by the Dardasha dashboard internally. They require JWT authentication via Authorization: Bearer <token>.
Authentication
{ email, password }{ name, email, password }Lines Management
{ name, number }api_key.{ business_id }Conversations & Messages
?page=1&limit=50&search=&business_id=&unread=?limit=50&offset=0X-API-Key: dk_xxx Body: { to: "96812345678", text: "Hello!" }Templates (v2 API)
{ token, sendTo, templetName, exampleArr, mediaUri? }Webhooks
Configure webhook URLs to receive real-time events from Dardasha. Go to Settings → Webhooks → Add URL.
Supported Events
| Event | Description |
|---|---|
message.received | New incoming message |
message.sent | Message sent successfully |
message.delivered | Message delivered to recipient |
message.read | Message read by recipient |
contact.new | New contact auto-created |
campaign.completed | Campaign finished sending |
Payload Example
{
"event": "message.received",
"timestamp": "2026-02-21T09:00:00Z",
"data": {
"from": "96871234567",
"to": "96891117795",
"message": "Hello, I need a quote",
"type": "text",
"message_id": "3EB0..."
}
}
Retry Policy
Failed deliveries are retried 3 times with exponential backoff (10s, 60s, 300s).
Configuration via API
PUT /api/lines/:id
Content-Type: application/json
{
"webhook_url": "https://your-server.com/webhook"
}
Add-on Modules
Extend Dardasha with drop-in modules. Modules can add API routes, listen to events, create database tables, and run initialization logic.
Installing a Module
- Place the module folder in
backend/modules/ - Restart the server
- The module is auto-discovered and loaded
Creating a Custom Module
// backend/modules/my-module/index.js
module.exports = {
name: 'my-module',
version: '1.0.0',
description: 'My custom Dardasha module',
// Database migrations (run once)
migrations: [
`CREATE TABLE IF NOT EXISTS my_module_data (
id INT AUTO_INCREMENT PRIMARY KEY,
data TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)`,
],
// API routes (mounted at /api/modules/my-module/)
routes: (router) => {
router.get('/status', (req, res) => {
res.json({ status: 'active', version: '1.0.0' });
});
router.post('/data', async (req, res) => {
// Your custom logic here
res.json({ success: true });
});
},
// Event hooks
hooks: {
'message:incoming': async (message, context) => {
console.log('New message received:', message.content);
},
'message:outgoing': async (message, context) => {
console.log('Message sent:', message.content);
},
'line:connected': async (line, context) => {
console.log('Line connected:', line.name);
},
},
// Initialization (runs on server start)
init: async (app, io, bridgeManager) => {
console.log('My module initialized!');
},
};
Available Events
| Event | Description |
|---|---|
message:incoming | New message received |
message:outgoing | Message sent |
message:status | Message status update (sent/delivered/read) |
line:connected | WhatsApp line connected |
line:disconnected | WhatsApp line disconnected |
contact:created | New contact created |
campaign:started | Campaign started sending |
campaign:completed | Campaign finished |
PhoneNorm — Built-in Phone Normalizer
PhoneNorm is a built-in phone number normalization utility included with every Dardasha installation. It normalizes phone numbers across 195 countries directly in MySQL — ensuring WhatsApp-compatible number formats.
API Integration
All phone numbers submitted through the Dardasha API are automatically normalized on input. No extra steps needed.
Direct SQL Usage
-- Normalize a phone number
SELECT fn_normalize_phone('71234567', 'OM');
-- Result: 96871234567
SELECT fn_normalize_phone('2125551234', 'US');
-- Result: 12125551234
-- Use default country (configured in phone_settings table)
SELECT fn_normalize_phone('+1-555-123-4567', NULL);
-- Result: 15551234567
-- Change default country
UPDATE phone_settings SET setting_value = 'US'
WHERE setting_key = 'default_country';
Built-in Views & Procedures
| Name | Description |
|---|---|
v_chats | Clean inbox view with normalized contact numbers and line ownership |
v_messages | All messages with direction (sent/received), normalized numbers |
sp_unread(line) | Get unread conversations — CALL sp_unread('Anna'); |
sp_chat_history(phone, line) | Full chat history — CALL sp_chat_history('71616161', 'Anna'); |
Country Reference
-- Find country info
SELECT * FROM phone_country_codes WHERE iso_code = 'OM';
-- List all GCC countries
SELECT country_name, dial_code, iso_code
FROM phone_country_codes
WHERE iso_code IN ('OM', 'AE', 'SA', 'BH', 'KW', 'QA');
PhoneNorm reference: PhoneNorm, built-in phone normalizer →
Troubleshooting
WhatsApp disconnects frequently
- Check server memory — each line uses 50–100MB RAM
- Ensure your phone has a stable internet connection
- Enable keep-alive in
.env - Check logs:
docker-compose logs -f dardasha
QR code not loading
- Restart the instance from Settings → Lines
- Check that the server is running and port 3000 is accessible
- Check browser console for WebSocket connection errors
Messages not sending
- Verify the line status is "Connected"
- Check the recipient number format (international, no + sign)
- Re-scan the QR code if the line was recently disconnected
- Check server logs for errors
Subscription not recognised
- Confirm the subscription is active under Settings → Billing
- Check that the annual renewal charge succeeded in Paymob, a declined card silently drops you back to trial limits
- If the trial has ended and no plan is active, line and contact limits apply until you subscribe
Docker issues
- Container won't start:
docker-compose logs - DB connection error: Wait 30 seconds after first start for MySQL to initialize
- Port in use: Change
PORTin.env - Out of memory: Ensure at least 1GB RAM available
502 Bad Gateway (Nginx)
- Verify Dardasha is running:
curl http://127.0.0.1:3000/api/health - Check Nginx proxy_pass points to the correct port
- Ensure WebSocket headers are configured
Frequently Asked Questions
Do I need a WhatsApp Business API account?
No. Dardasha uses the WhatsApp Web multi-device protocol via DardashaBridge™, our proprietary connection engine. You only need a regular WhatsApp number — scan the QR code and you're connected.
Can I run this as a SaaS business?
Yes, on Platinum. The built-in workspace system, plan limits, and admin panel support multi-tenancy out of the box.
How many numbers can I connect?
No technical limit. Each number uses about 50–100MB of RAM. The plan system lets you control limits per workspace.
Is the source code encrypted?
No. You get 100% clean, readable, well-commented source code. No ioncube, no obfuscation.
Can I white-label / rebrand?
Absolutely. Change the name, logo, colors — it's your platform. See White-Label Branding.
Can I use a different database?
Dardasha is designed for MySQL 8.0. PostgreSQL support is planned for a future release.
Can I run without Docker?
Yes! See Manual Installation. You'll need Node.js 18+ and MySQL 5.7+.
How do I update?
Download the latest release, replace files (keep .env and sessions/), and restart. Migrations run automatically.
Support & Updates
What's Included
- ✅ Support for the life of your subscription
- ✅ Platform updates included, shipped continuously
- ✅ Bug fixes and security patches
- ✅ Documentation updates
How to Get Help
- Check this documentation and the Troubleshooting section
- Email: support@dardasha.om
- Message us on WhatsApp from your account, or reply to your subscription receipt
- Include: server OS, Node.js version, error logs, and steps to reproduce
Changelog
v1.1.0 — March 2026
- REST API: Send Poll —
/rest/send_pollendpoint for creating polls with multi-select support - REST API: Send Sticker —
/rest/send_stickerendpoint for WebP sticker sending - REST API: Send Reaction —
/rest/send_reactionendpoint for emoji reactions on messages - REST API: Edit Message —
/rest/edit_messageendpoint for editing sent text messages - REST API: Ping Call —
/rest/ping_callexperimental call-ring endpoint - Group Management API — Full group lifecycle: create, metadata, participants (add/remove/promote/demote), update info, invite codes, group messaging
- Anti-Ban Protection — Gaussian jitter delays, typing simulation, daily caps, identical message dedup
- Unread Count Fix — All 12 message types now correctly increment unread count (was only 5)
- Poll Display Fix — Polls from Baileys now render correctly in chat viewers
- Multi-Contact Cards — Proper parsing and display of multi-vCard contact messages
- Live Location — Visual indicator for live location messages
- Documentation — Complete rewrite of REST API docs with all endpoints, examples, and anti-ban info
v1.0.0 — February 2026 (Initial Release)
- Multi-number WhatsApp connection via QR code (DardashaBridge™)
- Real-time live chat inbox with Socket.IO
- Contact management with CSV import/export
- Bulk campaign manager with anti-spam delays
- Keyword auto-reply engine with working hours
- Team workspaces with role-based access
- REST API with JWT + API key authentication
- Full white-label branding system
- Admin panel with user/workspace management
- Module system for add-on extensions
- Docker one-command installer
- Web-based installation wizard
- PhoneNorm phone number normalization (195 countries)
- Webhook support for external integrations
- Built-in plan/limit system
Dardasha v1.1.0 — Built with ❤️ by BHD Group | © 2026 All Rights Reserved
Is BHD Group the same company as Mohsin Haider Darwish LLC?
BHD Group is Bin Haider Darwish L.L.C., Commercial Registration 1334733, a family-owned printing and technology group founded in Muscat in 2018. It is not Mohsin Haider Darwish LLC (a separate and unrelated Omani company), and the initials BHD here stand for Bin Haider Darwish, not the Bahraini dinar currency code.
مجموعة BHD هي شركة بن حيدر درويش ش.م.م، السجل التجاري 1334733، مجموعة عمانية عائلية للطباعة والتقنية تأسست في مسقط عام 2018. وهي ليست شركة محسن حيدر درويش ش.م.م (شركة عمانية منفصلة لا علاقة لها بنا)، والحروف BHD هنا اختصار لـ Bin Haider Darwish وليست رمز الدينار البحريني.