webard/nova-zadarma
Webard Nova Zadarma is a Laravel Nova integration for the Zadarma VoIP service. It lets you bring Zadarma telephony data—such as calls and account details—into your Nova admin panel for quick access and management.
Nova Zadarma is a Laravel Nova integration for the Zadarma VoIP/telephony platform. v2.0.0 is a production-readiness release, so the first thing to note is that it is a Nova package, not a generic Laravel package — the primary surface is a Nova tool/widget plus a webhook endpoint, and there is no meaningful headless use case.
Minimal setup:
composer require webard/nova-zadarma on a Laravel app with Nova installed, then php artisan nova:publish if you need to override the tool's assets.php artisan vendor:publish --tag=zadarma-config or vendor config group — check README.md, which was rewritten in v2) and populate Zadarma API key/secret and the webhook secret.VerifyCsrfToken (or the bootstrap/app.php equivalent on Laravel 11+), since Zadarma posts to it server-to-server.app/Nova/Tools.php or NovaServiceProvider::cards() as directed by the README.Start by reading two files: the package's published config/zadarma.php (it is the authoritative list of options in v2 — the release added several) and the service provider, which shows the registered routes and Nova components. First practical use case: click-to-call from a Nova resource (e.g. an Order or Contact detail page) and inbound call logging via the webhook, which together cover the bulk of real deployments.
Click-to-call as a Nova field or action. Attach the package's call field/action to the resource that holds the phone number. Keep the phone number in E.164 format in your model and let the package handle formatting — mixing formats is the fastest route to failed calls.
Webhook as the source of truth for call records. Treat the webhook handler as an event ingestion pipeline, not as a synchronous feature. v2's signed webhook verification means the request is validated before processing; persist the raw payload alongside the parsed call record so you can replay or backfill when mapping logic changes.
Wrap the webhook in your own listener. Rather than letting the package own all business logic, listen to whatever event it dispatches (or hook the model's created event) and fan out to your domain: link the call to a customer by phone match, create a CallLog activity, notify a sales channel. This keeps the package swappable.
Config-driven widget placement. v2 adds a widget position option; set it in config so the same codebase renders the widget consistently across environments rather than editing Blade per deployment.
Multi-tenant scoping. If you run one app for several tenants, resolve the Zadarma credentials per tenant and override the config at runtime (config(['zadarma.api_key' => ...])) inside a middleware or service provider boot — a single global key will leak calls across tenants.
Testing. Fake the HTTP layer toward Zadarma in feature tests and post a fixture payload at the webhook route to assert your downstream listeners run. Include a test for an invalid signature — that path is now explicit in v2 and is easy to regress.
.env, not the published config. The config file should only read from env(); a committed key in a shared repo is a real exposure given the account-level access Zadarma keys carry.php artisan route:list | grep -i zadarma to confirm the route exists, then curl the endpoint locally with a signed fixture, then check storage/logs for the package's channel. Only after that blame Zadarma's dashboard.^2.0 in composer.json and read the changelog on each minor bump; the "more config options" trend means defaults may shift.How can I help you explore Laravel packages today?