symfony/gatewayapi-notifier
Symfony Notifier bridge for GatewayApi SMS delivery. Configure via gatewayapi://TOKEN@default?from=FROM DSN, then send SmsMessage with optional GatewayApiOptions such as class, callback URL, user reference, and label.
What it is, in product terms: a ~200-line MIT-licensed adapter that lets a Symfony application send SMS through GatewayAPI (a Nordic/EU-focused gateway) via Symfony's Notifier component. It registers a gatewayapi://TOKEN@default?from=FROM DSN and exposes a handful of provider fields (class, callbackUrl, userRef, label) through a GatewayApiOptions object. That is the whole scope.
Decisions it genuinely informs:
callbackUrl option only tells GatewayAPI where to send a receipt; we'd still have to build and secure that endpoint.Decisions this package should not be cited as supporting:
Illuminate\Notifications already covers channel fan-out; adopting this adds a second parallel stack.Reasonable to adopt when all of these hold:
symfony/notifier — the package then makes GatewayAPI a first-class transport with near-zero marginal cost.composer why-not before committing.Look elsewhere when any of these hold:
GatewayApiClient on Laravel's HTTP client plus a NotificationChannel adapter. You avoid pulling symfony/notifier, symfony/http-client, symfony/options-resolver, and their transitive contracts for one POST request, and you keep the whole path debuggable in one place.label parameter. It is stable, not developing.Reading the health signals correctly: 6 stars and 0 dependents is an artifact of Symfony's subtree-split repositories — real usage flows through symfony/notifier. Do not read it as abandoned; equally, do not read it as proof of maturity. The release cadence is healthy and current (latest 8.1.0).
One-line summary for executives: This is a small, free, well-maintained connector that lets a Symfony application send SMS through GatewayAPI. It is plumbing, not a platform — the strategic decisions are the SMS use cases, the provider choice, and the compliance work around it.
Framing the value honestly. The package's contribution is measured in saved lines of code, not in capability. Treat it as a low-risk, low-cost enablement of SMS in a Symfony service. Do not attach platform-level expectations to it, and do not put it at the center of a roadmap slide.
What the actual investment looks like (most of it unrelated to the package):
| Workstream | Rough effort |
|---|---|
| Install, configure DSN, first send | ~half a day |
Framework adapter (Laravel channel) or TexterInterface binding |
1–2 days |
| Phone number normalization to E.164 | 1 day |
| Queued send with retry/backoff | 1 day |
| Delivery-receipt endpoint + signature/allowlist validation | 2–3 days |
| Sender-ID registration with carriers (DK/NO/SE/FI) | 1–3 weeks calendar, ops/legal |
| Fallback provider + circuit breaker | 2–4 days |
| Opt-out, quiet hours, cost/segment monitoring | Ongoing |
For engineering: if we're on Laravel, recommend against taking the dependency and instead reimplementing the same REST call natively — it is smaller, faster to debug, and keeps us to a single notification abstraction. If we're mid-migration from Symfony with symfony/notifier already wired, adoption is straightforward and appropriate.
The one thing to say out loud: this package sends SMS. It does not receive webhooks, does not retry, and does not validate callback payloads. Any earlier framing that suggested otherwise should be corrected before a budget decision is made.
The ask: approve a small spike and a provider/compliance decision, not an integration project. The budget conversation should be about the SMS program — carrier registration lead time, DLR handling, and fallback policy — because that is where the cost and the risk actually sit.
How can I help you explore Laravel packages today?