PHPackages                             johnrivera7/filament-issabel-click-to-call - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. johnrivera7/filament-issabel-click-to-call

ActiveLibrary

johnrivera7/filament-issabel-click-to-call
==========================================

Filament plugin for Issabel PBX click-to-call via Asterisk AMI — originate from tables, forms, and a credentials UI.

1.0.0(today)010↑2600%MITPHPPHP ^8.2

Since Aug 24Pushed todayCompare

[ Source](https://github.com/Johnrivera7/filament-issabel-click-to-call)[ Packagist](https://packagist.org/packages/johnrivera7/filament-issabel-click-to-call)[ Docs](https://github.com/Johnrivera7/filament-issabel-click-to-call)[ RSS](/packages/johnrivera7-filament-issabel-click-to-call/feed)WikiDiscussions main Synced today

READMEChangelog (1)Dependencies (6)Versions (2)Used By (0)

Issabel Click-to-Call
=====================

[](#issabel-click-to-call)

[![Issabel Click-to-Call Filament plugin](https://raw.githubusercontent.com/Johnrivera7/filament-issabel-click-to-call/main/art/banner.jpg)](https://raw.githubusercontent.com/Johnrivera7/filament-issabel-click-to-call/main/art/banner.jpg)

 [ ![FILAMENT 4.x](https://camo.githubusercontent.com/13befbe0cffd101b2484ce1cdd985dabcddcbf1176d17a675674d53af99cfdbc/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f46494c414d454e542d342e782d4542423330343f7374796c653d666f722d7468652d6261646765) ](https://filamentphp.com/docs/4.x/panels/installation) [ ![FILAMENT 5.x](https://camo.githubusercontent.com/3ec960aa304b803da9f1192f01e82da976a3d220ea85931fec930003e0532c77/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f46494c414d454e542d352e782d4542423330343f7374796c653d666f722d7468652d6261646765) ](https://filamentphp.com/docs/5.x/panels/installation)

 [ ![Latest Version on Packagist](https://camo.githubusercontent.com/16e97e6705be0d6202642067b36eedb2389be859a5549db2e2d328ecd2ad80c6/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6a6f686e726976657261372f66696c616d656e742d6973736162656c2d636c69636b2d746f2d63616c6c2e7376673f7374796c653d666c61742d737175617265266c6162656c3d7061636b6167697374) ](https://packagist.org/packages/johnrivera7/filament-issabel-click-to-call) [ ![License](https://camo.githubusercontent.com/32e500fdf2eb45539860fb0687835808e4b22e4631d675b72dbc9f38b50e29c2/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6a6f686e726976657261372f66696c616d656e742d6973736162656c2d636c69636b2d746f2d63616c6c2e7376673f7374796c653d666c61742d737175617265) ](https://github.com/Johnrivera7/filament-issabel-click-to-call/blob/main/LICENSE)

Filament plugin for **[Issabel](https://www.issabel.com/)** PBX **click-to-call** via **Asterisk AMI**: ring the agent extension first, then dial the customer number from tables or forms.

> **Open source (MIT).** Works with Issabel and other Asterisk/FreePBX deployments that expose AMI on port **5038**.

Requirements
------------

[](#requirements)

StackVersionsPHP8.2+Laravel11.28+ / 12+ / **13+**Filament**4.x** or **5.x**IssabelAMI enabled; agent softphone registered on extensionHow click-to-call works
-----------------------

[](#how-click-to-call-works)

1. User clicks **Llamar / Call** in Filament.
2. Laravel connects to Issabel **AMI** (TCP 5038).
3. Sends `Originate`: channel `PJSIP/{anexo}` → when answered, dials destination in `from-internal`.
4. Agent answers on their softphone/IP phone; Issabel connects the customer.

Filament does **not** carry audio — the PBX does.

Agent phone display (required Issabel dialplan)
-----------------------------------------------

[](#agent-phone-display-required-issabel-dialplan)

Issabel/FreePBX stores a **CNAM per extension** (e.g. *Mariela Lopez* on `2150`). If you originate directly to `SIP/2150`, the agent phone shows the **extension identity**, not the customer number — **AMI CallerID variables alone cannot override this** on stock Issabel.

We added strategy **`custom_agent`**: originate to `Local/{anexo}@filament-click-to-call`, set display from `CTC_DEST` in dialplan, then dial outbound via `from-internal/{destino}`.

### Why we need `[filament-click-to-call]` on the PBX

[](#why-we-need-filament-click-to-call-on-the-pbx)

ApproachAgent displayOutbound dialDirect `SIP/anexo` + AMI CallerIDExtension CNAM (wrong)May workForce `CALLERID(num)` = cell in AMICell on displayOften **bad-number** / wrong route**`custom_agent` + custom context****Cell on display****Normal outbound route**### One-time setup on Issabel

[](#one-time-setup-on-issabel)

Add to `/etc/asterisk/extensions_custom.conf`:

```
[filament-click-to-call]
exten => _X.,1,NoOp(Filament click-to-call anexo ${EXTEN} destino ${CTC_DEST})
 same => n,Set(CALLERID(name)=${IF($["${CTC_NAME}"=""]?${CTC_DEST}:${CTC_NAME})})
 same => n,Set(CALLERID(num)=${IF($["${CTC_NUM}"=""]?${CTC_DEST}:${CTC_NUM})})
 same => n,Set(CALLERID(name-pres)=allowed_not_screened)
 same => n,Set(CALLERID(num-pres)=allowed_not_screened)
 same => n,Dial(SIP/${EXTEN},30,m)
 same => n,Hangup()
```

Use `PJSIP` instead of `SIP` in `Dial()` if your extensions are PJSIP. Then:

```
asterisk -rx "dialplan reload"
```

Publish the snippet from Laravel:

```
php artisan vendor:publish --tag=filament-issabel-click-to-call-dialplan
```

Full Spanish guide: [`docs/ISSABEL_VISOR_DESTINO.md`](docs/ISSABEL_VISOR_DESTINO.md)

### `.env` for correct display

[](#env-for-correct-display)

```
ISSABEL_PBX_ORIGINATE_STRATEGY=custom_agent
ISSABEL_PBX_AGENT_DIAL_CONTEXT=filament-click-to-call
ISSABEL_PBX_CALLER_ID_DISPLAY=destination
```

Fallback without PBX dialplan (display stays extension CNAM):

```
ISSABEL_PBX_ORIGINATE_STRATEGY=application_dial
```

Where to create AMI credentials (Issabel)
-----------------------------------------

[](#where-to-create-ami-credentials-issabel)

### Option A — Issabel web UI

[](#option-a--issabel-web-ui)

1. Log in to Issabel as admin.
2. Open **Settings → Advanced Settings → Asterisk Manager Users** (wording may vary by Issabel version).
3. Add user e.g. `kitinicio_originate` with a strong secret.
4. Restrict **permit** to the **private IP of your Laravel server** only (not `0.0.0.0/0`).
5. Grant at least **write = originate** (and minimal read permissions).
6. Apply config / reload Asterisk.

### Option B — `/etc/asterisk/manager.conf`

[](#option-b--etcasteriskmanagerconf)

```
[kitinicio_originate]
secret = YOUR_STRONG_SECRET
deny=0.0.0.0/0.0.0.0
permit=172.16.10.20/255.255.255.255
read = system,call,log,verbose,command,agent,user,config,dtmf,reporting,cdr,dialplan
write = originate
```

Then: `asterisk -rx "manager reload"` (or restart Asterisk from Issabel).

### `.env` in Laravel

[](#env-in-laravel)

```
ISSABEL_CLICK_TO_CALL_ENABLED=true
ISSABEL_PBX_HOST=172.16.10.50
ISSABEL_PBX_AMI_PORT=5038
ISSABEL_PBX_AMI_USER=kitinicio_originate
ISSABEL_PBX_AMI_SECRET=YOUR_STRONG_SECRET
ISSABEL_PBX_CHANNEL_DRIVER=PJSIP
ISSABEL_PBX_DIAL_CONTEXT=from-internal
ISSABEL_PBX_ORIGINATE_STRATEGY=custom_agent
ISSABEL_PBX_AGENT_DIAL_CONTEXT=filament-click-to-call
ISSABEL_PBX_CALLER_ID_DISPLAY=destination
```

Network / Huawei Cloud
----------------------

[](#network--huawei-cloud)

You **do not** need to expose port **5038** to the public internet.

ScenarioRecommendationLaravel + Issabel **same VPC / LAN**Security group: inbound **TCP 5038** only from Laravel VM private IP → Issabel private IPLaravel outside, Issabel insideVPN or private peering; avoid public AMIPublic AMI**Not recommended** — AMI has full call controlIssabel AMI listens on **5038/TCP** by default. Open it only between app server and PBX.

Does Issabel have an API?
-------------------------

[](#does-issabel-have-an-api)

Yes, partially:

APIUse for click-to-call?**[Issabel REST `/pbxapi/`](https://github.com/IssabelFoundation/framework/tree/master/framework/html/pbxapi)**Admin (extensions, ring groups). **No CDR/originate** in core API.**Community [PBXAPI v2](https://github.com/wwwakcan/issabel-pbxapi-extension)**Optional HTTP CDR + originate if installed on Issabel**AMI (this plugin)****Recommended** for originate — native Asterisk, no extra modulesThis plugin uses **AMI** because it is stable, works on stock Issabel, and matches legacy cobranza integrations.

Installation
------------

[](#installation)

```
composer require johnrivera7/filament-issabel-click-to-call:^1.0
```

```
php artisan vendor:publish --tag=filament-issabel-click-to-call-config
```

Register in your `PanelProvider`:

```
use JohnRivera7\FilamentIssabelClickToCall\FilamentIssabelClickToCallPlugin;

->plugin(
    FilamentIssabelClickToCallPlugin::make()
        ->navigationGroup('Telefonía')
)
```

Filament action (table / form)
------------------------------

[](#filament-action-table--form)

```
use JohnRivera7\FilamentIssabelClickToCall\Actions\ClickToCallAction;

ClickToCallAction::make(
    phoneResolver: fn (array $record) => $record['celular'],
    extensionResolver: fn () => auth()->user()->cobranzaEjecutivo?->anexo_pbx,
)
```

Wire **extension per user** from your ejecutivo mantenedor (`anexo_pbx` column in your app).

Multi-tenant credentials
------------------------

[](#multi-tenant-credentials)

```
use JohnRivera7\FilamentIssabelClickToCall\Support\IssabelAmiCredentials;

FilamentIssabelClickToCallPlugin::make()
    ->credentialsUsing(fn (): IssabelAmiCredentials => IssabelAmiCredentials::fromArray(/* DB */))
    ->persistCredentialsUsing(function (IssabelAmiCredentials $c): void {
        /* save to DB */
    })
```

Programmatic
------------

[](#programmatic)

```
use JohnRivera7\FilamentIssabelClickToCall\FilamentIssabelClickToCallPlugin;

FilamentIssabelClickToCallPlugin::get()->clickToCall()->call(
    extension: '2151',
    phone: '957592274',
);
```

Agent requirements
------------------

[](#agent-requirements)

Each cobranza agent needs:

- Issabel **extension** (anexo) assigned in your mantenedor
- **Softphone** (Zoiper, MicroSIP, etc.) or IP phone **registered** to Issabel

Without a registered endpoint, Originate will fail or ring nowhere.

License
-------

[](#license)

MIT © John Rivera. Issabel® is a trademark of its respective owners; this plugin is not affiliated with Issabel LLC.

Links
-----

[](#links)

- [Issabel](https://www.issabel.com/)
- [Issabel REST API docs](https://github.com/IssabelFoundation/framework/tree/master/framework/html/pbxapi)
- [Filament plugins directory](https://filamentphp.com/plugins)

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance100

Actively maintained with recent releases

Popularity7

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity45

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

0d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/32875176?v=4)[sie7e](/maintainers/Johnrivera7)[@Johnrivera7](https://github.com/Johnrivera7)

---

Top Contributors

[![Johnrivera7](https://avatars.githubusercontent.com/u/32875176?v=4)](https://github.com/Johnrivera7 "Johnrivera7 (23 commits)")

---

Tags

laravelasteriskamifilamentfilament-pluginvoiptelephonypbxissabelclick-to-call

###  Code Quality

TestsPHPUnit

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/johnrivera7-filament-issabel-click-to-call/health.svg)

```
[![Health](https://phpackages.com/badges/johnrivera7-filament-issabel-click-to-call/health.svg)](https://phpackages.com/packages/johnrivera7-filament-issabel-click-to-call)
```

###  Alternatives

[rawilk/profile-filament-plugin

Profile &amp; MFA starter kit for filament.

3915.5k](/packages/rawilk-profile-filament-plugin)[defstudio/telegraph

A laravel facade to interact with Telegram Bots

818355.4k3](/packages/defstudio-telegraph)[harris21/laravel-fuse

Circuit breaker for Laravel queue jobs. Protect your workers from cascading failures.

46273.9k](/packages/harris21-laravel-fuse)[croustibat/filament-jobs-monitor

Background Jobs monitoring like Horizon for all drivers for FilamentPHP

278359.3k12](/packages/croustibat-filament-jobs-monitor)[finity-labs/fin-mail

A powerful email template manager and composer for Filament with dynamic token replacement, template versioning, and inline email sending.

316.8k2](/packages/finity-labs-fin-mail)[stephenjude/filament-jetstream

A Laravel starter kit built with Filament inspired by Jetstream.

17861.9k3](/packages/stephenjude-filament-jetstream)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
