Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
3.0.0 - 2026-09-16
This release contains breaking changes. See UPGRADE.md for how to upgrade from 2.x, and RELEASE_NOTES_v3.0.0.md for an overview.
Added
- Notification channel: return a
WhatsappMessagefromtoWhatsapp()and send with$notifiable->notify() Whatsapp::fake()with assertions such asassertSentText(),assertSentTemplate()andassertSentTo()- An exception class for each kind of API failure (
CustomerServiceWindowException,RateLimitException,TemplateExceptionand more), with Meta's error code, details and trace ID - Automatic retries with exponential backoff for rate limits and temporary errors, configured with
retry.timesandretry.sleep - Webhook duplicate filtering using the cache, configured under
webhook MessageStatusUpdated,TemplateStatusUpdatedandTemplateQualityUpdatedevents- Helpers on
MessageReceived:text(),buttonReplyId(),listReplyId(),buttonPayload(),flowResponse(),mediaId(),replyToMessageId(),senderName()and more - Replies that quote a message, with the
replyToargument on every send method except reactions showTypingIndicator()uploadTemplateMedia()to upload sample media for template headers, using the newapp_idconfig option- Optional message log: a publishable migration, the
Messagemodel, and status tracking from webhooks whatsapp:check,whatsapp:testandwhatsapp:templatesArtisan commandsgetPhoneNumber()andgetWebhookSubscriptions()- Events carry the phone number ID, and
MessageSent/MessageFailedcarry the payload and tenant - Messages from users who hide their phone number are handled using their business-scoped user ID
- Template management: create, edit, delete, list, and status checks
MessageFailedis dispatched forfailedwebhook statuses, with the message IDTemplateBuilder::button()accepts the button index- Laravel 13 is tested in CI
- A documentation website at https://crenspire.github.io/laravel-whatsapp/
Removed
- Support for Laravel 10 and 11, which no longer receive security fixes
Changed
- Requires Laravel 12 or 13, and Carbon 3
- API failures throw subclasses of
WhatsappException, and messages include Meta's error details - Temporary failures are retried by default (3 attempts). Message sends are only retried when Meta confirms they failed
- Webhook events delivered more than once are dispatched once
- Media, business profile and template managers take a
GraphClientinstead of a headers array - Unknown tenant IDs throw
WhatsappExceptioninstead of silently using the default account default_languagedefaults toen_US(Meta language codes use underscores)sendMultiProductMessage()requires header text, as the API does- Template footer parameters throw
WhatsappException; footers take no parameters uploadMedia()detects the MIME type when given a category such asimage- Webhooks received without a configured
webhook_secretlog a warning
Fixed
- Media and business profile calls reused the credentials of the first tenant that made a call, for every tenant
- Webhook verification logged the expected verify token, and full payloads were logged outside debug mode
- Webhook verification passed when no verify token was configured
- The package couldn't be installed in new Laravel 13 apps, which use Guzzle 8. The package no longer requires Guzzle directly; it uses the version Laravel's HTTP client requires
- Media uploads were sent with a JSON Content-Type and rejected
- Webhooks only processed the first entry and change of a batched payload
- Messages without a
fromphone number were dropped - Media header parameters in template messages had the wrong shape
- Custom headers were ignored for media and business profile calls
updateWebsite()sentwebsiteinstead ofwebsites- The test suite never booted Laravel, so most tests passed regardless of behavior
2.0.0 - 2026-07-25
Added
- Allow Laravel 13 (
illuminate/contracts^13.0)
1.0.0 - 2025-09-08
Added
- Semantic versioning support
- Version management scripts
- Initial release of Laravel WhatsApp Business API package
- WhatsApp service with comprehensive message sending capabilities
- Support for text, media, template, and interactive messages
- Webhook handling for incoming messages and status updates
- Multi-tenant support
- Rate limiting
- Event system for message lifecycle tracking
- Comprehensive test suite
- Full documentation
Features
- Message Types: Text, media (image/video/document/audio), template, interactive (buttons/lists)
- Webhook Support: Verification, incoming messages, status updates
- Multi-tenant: Support for multiple WhatsApp Business accounts
- Rate Limiting: Built-in rate limiting to respect API limits
- Events: MessageSent, MessageFailed, MessageDelivered, MessageRead, MessageReceived
- Media Management: Upload and download media files
- Laravel Integration: Service provider, facade, configuration publishing
- Testing: Comprehensive test suite with Pest
Technical Details
- PHP 8.2+ support
- Laravel 10, 11, 12 compatibility
- PSR-4 autoloading
- Comprehensive PHPDoc documentation
- MIT License