Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Whatsapp Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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:

  • Which Laravel/PHP/Guzzle versions are actually supported, and is there a test matrix or CI we can inspect?
  • Does it expose raw Graph API escape hatches (custom template components, media upload, interactive messages), or only a narrow send path?
  • How are API errors surfaced — typed exceptions, or opaque HTTP responses we must parse?
  • Is the webhook handler signature-verifying Meta payloads, or does it assume we terminate and validate upstream?
  • Does it implement any retry/backoff or idempotency, or is that entirely on our queue layer?
  • Who owns the code if the maintainer disappears — have we forked anything before, and what is that process?

Integration Approach

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:

  1. Define our own WhatsAppSender interface and message DTOs first.
  2. Implement a package-backed adapter behind it, keeping the BSP adapter live.
  3. Cut over per template, not per application, starting with the lowest-stakes message. That preserves a one-line rollback and lets us compare deliverability and cost on the same traffic.

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:

  • Track A (engineering, ~1–2 sprints): spike and read the v1.1.0 diff → internal interface + adapter → one low-stakes template wired through the queue → webhook endpoint with signature verification and idempotency.
  • Track B (business/compliance, 2–6 weeks, starts day one): Meta Business verification → app review → number registration and display-name approval → template authoring and category selection (utility vs. marketing affects both approval and price).

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.

Operational Impact

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:

  • Token expiry / rotation — system-user tokens in Meta Business Manager expire on a schedule; rotation must be a runbook, not a surprise.
  • 24-hour customer service window — free-form messages outside the window are rejected. Everything outside the window must be template-driven; this is a product rule, not a bug.
  • Template state changes — Meta can pause or reject a previously approved template. Any send path must treat "template unavailable" as an expected error with a fallback channel.
  • Duplicate sends — queue retries on a non-idempotent send path duplicate messages to real customers. Idempotency keys belong in our layer.
  • Webhook delivery gaps — Meta retries but does not guarantee; inbound handling must be idempotent and tolerate out-of-order events.
  • Quality rating degradation — repeated user blocks/reports restrict the number. We need opt-out handling and a monitoring signal on block rate.

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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
gmostafa/php-graphql-client
xeviant/paystack
snowsoft/faker
meditationsteps/blogetc
animalyoung/laravel-influxdb
onix-solutions/sms-telera
lonely-lights/prosetta
oxygen/data
oxygen/core
jengo/base
xiloryx/log-collector
a21ns1g4ts/filament-stripe
la-php/laravel-admin
artisan-build/community-prompts
vleroy/smart
ayles-software/laravel-australian-public-holidays
cboxdk/laravel-id-spatie
cboxdk/laravel-id-billing
cboxdk/laravel-id-billing-bridge
simple-as-fuck/php-performance-log