funnelchat20/wapi-gateway
Laravel/PHP package that provides a gateway to the WAPI WhatsApp API, helping you send messages, manage instances, handle webhooks, and centralize API configuration. It offers a simple, configurable interface for building WhatsApp automation and notifications in your applications.
unsubscribe() now writing to device_logs in parity with logout(), we can answer "did the cancellation actually land at Z-API?" from data rather than from support tickets. This directly supports decisions about refunds, churn credits, and vendor cost exposure. That capability remains the primary reason this package carries product weight for us.accounts off ^0.22.4. The package has since moved to 0.23.3. We are now crossing from 0.22.x into 0.23.x, which under the package's own 0.x versioning can carry behavioral change that a patch note does not reveal. The decision is no longer "take a free patch" but "review the 0.23.x line deliberately and land it as a scoped change."logRequest() coverage for anything that mutates billing state, and vCard/phone-format assertions for anything that composes message content.Adopt or continue with it when:
ZApiClient, inherited by ZApiLite) rather than hand-rolled HTTP calls.sanitizeUrl() masks the /token/<token>/ segment on unsubscribe URLs, so adopting this logging does not create a new secret-in-logs exposure. This is a genuine adoption enabler for teams with log-retention or compliance constraints.Look elsewhere or defer when:
integrator cancel, disconnect, token-in-URL).0.x, minor bumps can still carry behavioral change. The jump from 0.22.x to 0.23.x should be treated as a reviewed upgrade, not an automatic one — read the full 0.23.0 changelog, not just 0.23.3. Plan for a 1.0 conversation if this becomes load-bearing for billing.device_logs — metrics, alerting, or a dead-letter path for failed cancellations. The package writes the record; it does not alert on it. Alerting on method=unsubscribe failures is our responsibility.For executives: Two small, low-risk releases close two different gaps. The first closed a revenue blind spot: if a paid WhatsApp instance failed to cancel at the provider, nothing was recorded and we kept getting billed with no signal. Every unsubscribe attempt now leaves an auditable, credential-masked trace, so we can detect and recover instances that are billed but never cancelled. The second closes a customer-facing defect: shared-contact vCards could go out with a duplicated country code, meaning recipients saved a wrong phone number and had no way to tell. That is now fixed. Neither release carries a schema break, an API break, or a persisted secret. The main open item is sequencing: our accounts service is still on the 0.22 line, and the package is now at 0.23.3, so this is no longer a trivial patch bump — it should be a scoped upgrade with a changelog review, not an automatic one. Recommended action: schedule the 0.23.x upgrade for accounts in the next release cycle and stop treating it as a background dependency refresh.
For engineering: Two independent fixes. (1) ZApiClient::unsubscribe() was the only client method bypassing logRequest(), so failed disconnects and integrator cancels produced no device_logs entry; both now log in parity with logout(), with step (disconnect | cancel) disambiguating them under method=unsubscribe, and URLs passed through sanitizeUrl() so no token reaches the log. (2) PR #68 fixes duplicated country-code prefixing when composing shared-contact vCards. No signature changes, no response changes, ZApiLite inherits both behaviors. The caveat is version distance: we have visibility into the 0.23.2→0.23.3 diff only, and we are moving from 0.22.x to 0.23.x — review the 0.23.0 release before bumping the constraint. Two follow-ups worth discussing: a parity test asserting logRequest() coverage for every method that mutates billing state, and a formatting assertion for every method that composes outbound message content, so neither class of gap reappears.
How can I help you explore Laravel packages today?