Blog/Use Cases

How Agencies Use White-Label WhatsApp API for Client Campaigns

Learn how digital agencies use white-label WhatsApp API to run client campaigns, manage multiple numbers, and build recurring revenue streams. Rapiwa multi-number setup guide for agencies.

by Shakil
How Agencies Use White-Label WhatsApp API for Client Campaigns

Digital agencies use white-label WhatsApp API to run WhatsApp marketing campaigns, customer support bots, and automation workflows for multiple clients from a single platform. Using Rapiwa API ($5/month per number, no per-message fees), agencies manage dozens of client WhatsApp numbers, build repeatable automation templates, and charge clients monthly retainers while keeping their own brand on the deliverables.

What Is White-Label WhatsApp API for Agencies?

White-label WhatsApp API means an agency uses a WhatsApp API provider (like Rapiwa) as the backend infrastructure while presenting the service under their own brand to clients. The client sees the agency's branding, not Rapiwa's.

Agency model:

  • Agency pays Rapiwa: $5/month per client WhatsApp number
  • Agency charges client: $50–$200/month for "WhatsApp Marketing Automation Service"
  • Agency margin: $45–$195/month per client
  • At 20 clients: $1,700–$3,900/month recurring revenue

Why Rapiwa Works for Agency White-Label

FeatureWhy it matters for agencies
$5/month per numberLow cost enables profitable resale at $50–$200/month
No per-message feesPredictable cost structure for client billing
REST APIFull programmatic control for custom automations
Multiple numbersManage dozens of clients from one account
n8n templatesReady-made automation templates to deploy instantly
5.0/5 SourceforgeReliable infrastructure for client-facing services

Step 1: Setting Up Multiple Client Numbers

Each client gets their own WhatsApp number connected to Rapiwa:

# Your Rapiwa account can support multiple numbers (Professional/Enterprise plans)
# Each client's WhatsApp number is connected separately

# Client 1: Fashion Store
# Client 2: Dental Clinic
# Client 3: Real Estate Agency
# Each number has its own API key

Recommended Rapiwa plan for agencies:

  • Professional plan: Supports multiple WhatsApp numbers
  • Enterprise plan: 20+ numbers — ideal for agencies with large client rosters

Step 2: Client Onboarding Template

Standardize how you onboard each new client:

# agency_client_setup.py

class AgencyClientSetup:
    def __init__(self, rapiwa_api_key: str):
        self.rapiwa_key = rapiwa_api_key
    
    def onboard_client(self, client: dict) -> dict:
        """
        Standard client onboarding:
        1. Connect their WhatsApp number to Rapiwa
        2. Configure webhooks for their domain
        3. Deploy their industry template
        4. Test with a sample message
        """
        # Connect WhatsApp (done via Rapiwa Dashboard QR scan)
        # Once connected, get their API key from the dashboard
        
        client_api_key = client['rapiwa_api_key']
        client_phone = client['whatsapp_number']
        
        # Send test message to confirm setup
        result = self.send_test_message(client_phone, client['name'], client_api_key)
        
        # Deploy their automation template
        template = INDUSTRY_TEMPLATES.get(client['industry'])
        if template:
            self.deploy_template(client, template)
        
        return {
            'client': client['name'],
            'number': client_phone,
            'test_result': result,
            'template_deployed': template is not None
        }
    
    def send_test_message(self, phone: str, client_name: str, api_key: str) -> dict:
        """Send a test message to confirm the client's setup is working."""
        import requests
        
        message = (
            f"WhatsApp setup confirmed ✅\n\n"
            f"{client_name} is now connected to your automated WhatsApp system.\n\n"
            f"Powered by [Your Agency Name]"
        )
        
        return requests.post(
            'https://app.rapiwa.com/send-message',
            headers={'Authorization': f'Bearer {api_key}'},
            json={'number': phone, 'message': message}
        ).json()


# Industry templates — pre-built automation packages
INDUSTRY_TEMPLATES = {
    'ecommerce': {
        'description': 'Order confirmations, shipping updates, review requests',
        'n8n_templates': [
            'https://n8n.io/workflows/9879',  # WooCommerce invoices
            'https://n8n.io/workflows/9880',  # Order updates
            'https://n8n.io/workflows/9969',  # Review requests
        ]
    },
    'healthcare': {
        'description': 'Appointment reminders, lab result notifications',
        'setup_steps': 'Connect PMS webhook → configure reminder schedule'
    },
    'real_estate': {
        'description': 'Lead follow-up, viewing confirmations, price alerts',
        'setup_steps': 'Connect CRM → configure 5-minute lead response'
    },
    'restaurant': {
        'description': 'Reservation confirmations, order updates, promotions',
        'setup_steps': 'Connect booking system → configure confirmation workflow'
    }
}

Step 3: Multi-Client Message Routing

When you manage multiple clients, route messages correctly by client API key:

import requests
from dataclasses import dataclass

@dataclass
class ClientConfig:
    name: str
    api_key: str  # Client's Rapiwa API key
    phone_number: str
    industry: str

class AgencyWhatsAppRouter:
    def __init__(self, clients: list[ClientConfig]):
        self.clients = {c.phone_number: c for c in clients}
    
    def send_for_client(self, client_phone: str, recipient: str, message: str) -> dict:
        """Send a WhatsApp message using the correct client's API key."""
        client = self.clients.get(client_phone)
        if not client:
            raise ValueError(f"Unknown client phone: {client_phone}")
        
        return requests.post(
            'https://app.rapiwa.com/send-message',
            headers={'Authorization': f'Bearer {client.api_key}'},
            json={'number': recipient, 'message': message}
        ).json()
    
    def broadcast_to_client_contacts(
        self, 
        client_phone: str, 
        contacts: list[dict], 
        message_template: str
    ) -> list[dict]:
        """Send personalized broadcasts for a client's campaign."""
        results = []
        import time
        
        for contact in contacts:
            message = message_template.format(**contact)
            result = self.send_for_client(client_phone, contact['phone'], message)
            results.append({
                'contact': contact['name'],
                'status': result.get('status')
            })
            time.sleep(1)  # Rate limiting
        
        return results

Step 4: Client Reporting Dashboard

Track campaign metrics for client reporting:

def generate_client_report(client_id: str, month: str) -> dict:
    """Generate monthly WhatsApp campaign report for a client."""
    
    messages = db.query("""
        SELECT 
            COUNT(*) as total_sent,
            SUM(CASE WHEN status = 'success' THEN 1 ELSE 0 END) as delivered,
            COUNT(DISTINCT recipient_phone) as unique_recipients,
            AVG(response_time_seconds) as avg_delivery_time
        FROM message_log
        WHERE client_id = %s
          AND DATE_TRUNC('month', sent_at) = %s
    """, [client_id, month])
    
    inbound = db.query("""
        SELECT COUNT(*) as replies_received
        FROM inbound_messages
        WHERE client_id = %s
          AND DATE_TRUNC('month', received_at) = %s
    """, [client_id, month])
    
    return {
        'client_id': client_id,
        'period': month,
        'messages_sent': messages['total_sent'],
        'delivery_rate': messages['delivered'] / messages['total_sent'] * 100,
        'unique_recipients': messages['unique_recipients'],
        'replies_received': inbound['replies_received'],
        'engagement_rate': inbound['replies_received'] / messages['total_sent'] * 100,
    }

Agency Pricing Models for WhatsApp Services

Service tierWhat's includedTypical agency price
Basic setupConnect number + 1 automation$200 one-time
Monthly management1,000 messages/month + reporting$99–$199/month
Full-serviceUnlimited messages + custom bots + reporting$299–$599/month
EnterpriseMulti-number + custom dev + priority support$1,000+/month

Your cost (Rapiwa): $5/month per client number. Your revenue: $99–$1,000+/month per client.

Agency-Specific n8n Templates to Deploy

Rapiwa's existing n8n templates are perfect for agency deployments:

TemplateUse caseInstall count
WooCommerce Invoices via WhatsAppE-commerce clients1,306
WooCommerce Order UpdatesE-commerce clients236
Google Calendar + Gemini RemindersHealthcare, consulting538
GPT-4 Support BotAny industry474

Deploy these in 30 minutes per client — no custom development needed.

Common Errors and Fixes

  • Wrong API key sent for a client: Always validate the client → API key mapping in your router before sending
  • Client's WhatsApp number disconnected: Rapiwa numbers need to stay active (phone connected). Alert clients when their number disconnects.
  • Rate limit across clients: Each client has their own Rapiwa account/key — rate limits don't aggregate across clients

FAQ

Does Rapiwa offer agency or reseller pricing? Contact Rapiwa's sales team at rapiwa.com for agency pricing on bulk number plans.

Can I brand Rapiwa as my own product to clients? You can present your agency's WhatsApp automation service without mentioning Rapiwa. The messages come from the client's own WhatsApp number, not from Rapiwa.

Does Rapiwa charge per client message? No. Rapiwa charges $5/month per number with no per-message fees. This flat pricing is essential for agency profitability.

Can I manage all clients from one Rapiwa dashboard? Yes. Rapiwa supports multiple WhatsApp numbers under one account. Each number can have its own API key for client isolation.

What happens if a client stops paying and I need to disconnect their number? Simply stop the automated workflows for that client and disconnect their number from your Rapiwa account. Messages stop immediately.