{{-- NAV --}} {{-- HERO --}}
Multi-tenant WhatsApp Gateway SaaS

Send WhatsApp messages
at scale, via API

Wavora wraps GOWA into a production-ready SaaS — multi-device, queue-backed, with billing, webhooks, and a clean admin dashboard.

{{-- STATS --}}
300
Free messages/day per device
202
Async API response (ms)
Devices per tenant
5
Plan tiers available
{{-- FEATURES --}}

Everything you need to
run WA at scale

From API keys to webhooks to billing — Wavora handles it so you can focus on building.

📱
Multi-Device Management
Add multiple WhatsApp numbers per tenant. Each device gets its own plan, quota, and API scope.
Async Queue Send
API returns 202 instantly. Redis queue worker handles actual delivery with retry & backoff.
🔑
API Key Auth
Per-tenant API keys, hashed at rest. Idempotency keys prevent duplicate sends.
🔔
Webhook Delivery
HMAC-signed webhook events for message status updates. Retry on failure.
💳
Flexible Billing
DOKU hosted checkout, QRIS manual, or bank transfer. Admin verifies manual payments.
📊
Usage Monitoring
Daily and monthly message counters per device. Free plan enforces 300 msg/day automatically.
{{-- API SECTION --}}

Clean, async API.
202 every time.

Hit the API with your key and device ID. Wavora queues the job and returns immediately. Check status or wait for the webhook.

Text, image, file, video, audio
Idempotency keys for safe retries
Per-device scoping via X-Device-Id
Message status polling endpoint
# Send a text message
POST /api/v1/messages/text
Authorization: Bearer {api_key}
X-Device-Id: {device_id}

{
  "to": "628123456789",
  "message": "Hello from Wavora!"
}

─── Response 202 Accepted ─────────────
{
  "success": true,
  "message_id": "uuid-...",
  "status": "queued"
}
{{-- PRICING --}}

Pay per device, not per seat

Every WhatsApp number gets its own plan. Start free, upgrade when you need more quota.

@forelse($plans as $p) @php $isFeatured = $p->code === 'starter'; @endphp
@if($isFeatured)
⭐ MOST POPULAR
@endif
{{ $p->name }}
@if($p->price_monthly == 0) Rp0/mo @elseif($p->price_monthly >= 1000000) Rp{{ number_format($p->price_monthly / 1000000, 1) }}M/mo @elseif($p->price_monthly >= 1000) Rp{{ number_format($p->price_monthly / 1000, 0) }}K/mo @else Rp{{ number_format($p->price_monthly, 0) }}/mo @endif
Per WhatsApp number
@if(isset($p->limits['messages_per_day'])) {{ number_format($p->limits['messages_per_day']) }} messages/day @elseif(isset($p->limits['messages_per_month'])) {{ number_format($p->limits['messages_per_month']) }} messages/month @else Unlimited messages @endif
@if(in_array('mandatory_footer', $p->features ?? [])) Branding footer added @else No branding footer @endif
@if(in_array('priority_queue', $p->features ?? []))
Priority queue
@elseif(in_array('dedicated_queue', $p->features ?? []))
Dedicated queue slot
@else
Standard API access
@endif
Webhooks
@empty
No plans available.
@endforelse
{{-- FOOTER --}}