teodoriu/laravel-whatsapp
A Laravel package for integrating WhatsApp messaging into your application, with a simple API for sending messages, handling sessions, and managing webhook events so you can wire WhatsApp notifications into existing PHP workflows.
Architecture fit. The package is a thin, self-hosted adapter over Meta's WhatsApp Business Cloud API that plugs into Laravel's native building blocks: config/repository, service container, facades or injected clients, notifications, and queues. Architecturally that is the right shape for us — the transport is isolated, so it can sit behind our own NotifierInterface rather than being called directly from controllers or jobs. What it deliberately does not model is the domain we actually own: template lifecycle, opt-in/consent state, conversation windows, per-number routing, or inbound message state. Those remain our responsibility, and any estimate that assumes the package supplies them is wrong.
Integration feasibility. Low engineering effort, high external-dependency effort. Wiring the package (publish config, set token and phone-number ID, send a message) is a days-scale task. The real critical path is on Meta's side: Business verification, app review for whatsapp_business_messaging, phone number registration, and template creation/approval. None of that is covered by the package, and all of it has lead time and rejection risk we cannot compress by writing code faster. I would plan the feature as integration + template authoring + opt-in policy, not as protocol work.
Technical risk. Three vectors, in order of concern:
| Risk | Severity | Mitigation |
|---|---|---|
| Single-maintainer OSS (4 stars) in a customer-facing path | Medium–High | Wrap behind internal interface; pin version; retain ability to fork or replace with direct Graph API calls |
| Meta Graph API version drift / deprecation | Medium | Budget a recurring review; the wrapper's value decays if the maintainer stops tracking Meta |
| Undocumented v1.1.0 | Low | 1.0.9 → 1.1.0 is a minor bump (additive, no intended breakage), but the release notes are a bare changelog link. Treat as unverified until engineering reads the diff. |
The thin-wrapper nature cuts both ways: it is the reason the blast radius is small and the reason the package offers little defensive value if we hit an edge case.
Key questions for engineering before we commit budget:
Stack fit. Assumes a modern Laravel app (PHP 8.x) already using queues and notifications. It composes naturally with our existing notification layer: WhatsApp becomes one more channel alongside email/SMS rather than a bespoke integration. Two integration details to check early — that our config-cache/env pattern matches its config keys, and that its facade alias and config namespace do not collide with anything already registered.
Migration path. No data migration is involved; this is transport-level. If we currently send via a BSP (Twilio, MessageBird, etc.) or hand-rolled HTTP, the clean path is:
WhatsAppSender interface and message DTOs first.Compatibility. Verify the Illuminate support range against our framework version, confirm PHP version floor, and check that it does not pin a Guzzle major we have already moved past. Also confirm behavior under php artisan config:cache — packages that read env() outside config files break in cached deployments, and that failure is silent until production.
Sequencing. Two parallel tracks, because Meta's prerequisites dominate the timeline:
Do not sequence Track A before Track B. Code that cannot send against an approved template is not a milestone. First production message should be a utility template to internal recipients, then a controlled cohort of real users.
Maintenance. Pin to an evaluated version and subscribe to releases; do not track dev-main. The v1.1.0 diff review is a one-hour task and should gate adoption. On an ongoing basis, someone must watch two clocks simultaneously — the package's release cadence and Meta's Graph API version deprecations — and neither is large enough to own a person. Budget a quarterly check. If the package goes stale relative to Meta, the fallback is a ~200-line internal client, which is a known and bounded cost rather than an emergency.
Support. Community-only, no SLA, no security policy stated. That is acceptable for a non-critical notification channel and unacceptable for anything contractual. Internal ownership must be explicit: one named engineer accountable for the dependency, including the fork decision.
Scaling. The package itself is stateless — no database, no migrations, no caching layer — so scale-out is our existing queue-worker story plus rate-limit-aware middleware. The real ceiling is Meta's per-number throughput limits and the messaging_product quality rating, not our infrastructure. Cost scales with conversations, not messages, and marketing vs. utility categories price differently; finance should model that per-template, not per-send.
Failure modes to design for now, not after launch:
Ramp-up. A Laravel developer is productive on the package in under a day. The organizational ramp is on WhatsApp policy — opt-in capture, template categorization, pricing model, and the customer-service-window rule — and that is where the training and documentation investment should go. Keep email/SMS live as fallback and do not let WhatsApp become the sole channel for anything a customer is contractually entitled to receive.
How can I help you explore Laravel packages today?