venturedrake/laravel-crm-filament
Filament plugin that brings VentureDrake's Laravel CRM into your admin panel. Provides ready-to-use Filament resources, forms, and tables for managing CRM contacts, companies, deals, and activities, so you can run your CRM from an existing Filament dashboard without building custom CRUD screens.
venturedrake/laravel-crm, not a CRM in its own right. The decision it informs is unchanged: ship a usable back office on core in days, or spend engineering time hand-building Filament resources, filters and board views against the same models. v1.4.0 keeps the buy case intact but changes its terms — the panel now tracks core 2.5.0, so you are not choosing between "a panel" and "a stale panel," you are choosing between "a panel plus a coordinated two-package upgrade" and "your own panel." Budget the coordination, not just the licence.Product::getPrimaryPrice(), matching core 2.5.0 — previously a product priced only in a non-primary currency loaded blank and saving silently overwrote that price. And a variation without its own price falls back to the product price by design. The first is a data-loss bug now fixed; the second is a deliberate pricing policy that product and finance should sign off on explicitly, because it means an incomplete variation row sells rather than blocks.cost_per_unit, then unit_price) when converting an order to a purchase order. If you price sell-side from a variation and buy-side from a variation, that mapping is now explicit. Relevant wherever margin is computed downstream of the CRM rather than inside it.~2.4.2 to ~2.5.0 reverses the pattern set by v1.3.0: core minor adoption is once again gated on a panel release, and the ceiling is now 2.6. The honest framing for roadmap planning is that patch-level core fixes (2.5.x) still flow without a panel release, but core minors (2.6) require a compatibility pass. v1.3.0 removed per-patch upgrade overhead; v1.4.0 does not restore it for minors. Plan the panel into any core minor budget line.~2.5.0 and must be updated in the same deploy as core — variation data only persists through core 2.5.0's services. That is a deployment-pipeline decision, not just a Composer one: if your pipeline, platform team or change process can't ship two packages atomically, you have a real risk of a panel that writes variation data core doesn't understand. If atomic two-package deploys are hard for you, that is a reason to sequence deliberately rather than a reason to skip the release.ProductAttributeResource, its pages and its crm product attributes permissions are removed, following core 2.5.0. The feature never had a table behind it in core, so no data is lost — but any nav link, bookmark, custom page, support article, role configuration or internal runbook pointing at filament.*.resources.product-attributes.* now breaks. This is a communications-and-cleanup task with a deadline, and it is the kind of removal that generates support tickets if it isn't announced before the upgrade, not after.purchaseOrderLines shim submitted rows core never read in a usable shape, so edits were lost. Both are escalation-class bugs rather than test-class bugs: one produces an org chart that silently disagrees with reality, the other produces a PO the operator believes they corrected. The quote → order conversion that threw on crm_labelables.id is fixed as well, removing a hard failure on a core revenue path.laravelcrm:filament-upgrade now runs filament:assets, and the installer wires it into post-autoload-dump, so every composer install republishes the stylesheet for the installed Filament version. The observable symptom — resource tables that can't scroll sideways because the content area is pinned at 100vw beside the sidebar on Filament v5 — is a classic "our CRM is broken" ticket with a one-line cause. Worth calling out because it changes the class of ticket your team receives, not just the code.LARAVEL_CRM_USER_INTERFACE=false, so the integration-only tier remains a supported configuration on the new core baseline. Confirm re-verification against 2.5.0 routes during the upgrade rather than assuming it carries.dcblogdev/laravel-xero from require to suggest still means updating core silently drops Xero — no error, no failed job, just a stopped sync. The install notice with a copyable command remains, so the dependency is an explicit, ownable line in your composer.json. The Guzzle ^7 cap that comes with it still constrains anything else in your stack wanting Guzzle 8. Re-check this line on every core bump including 2.5.0.Adopt when:
venturedrake/laravel-crm 2.5.0 and want a working Filament panel instead of a blank slate — teams, boards, calendars, quotes, orders, invoices, purchase orders, products, deliveries, activity feeds.composer update venturedrake/laravel-crm venturedrake/laravel-crm-filament plus php artisan laravelcrm:filament-update) and have checked your navigation, docs and permissions for references to the removed Product Attributes surface.LARAVEL_CRM_USER_INTERFACE=false).Look elsewhere or wait when:
~2.5.0; there is no partial adoption. Variation writes depend on core 2.5.0's services, so a mismatched pair is not "slightly degraded," it is incorrect persistence. Wait until the pipeline can ship both together.filament.*.resources.product-attributes.* must be reworked first. There is no compatibility shim; the model it was built on is deleted in core.^7, and the panel can't resolve that for you.venturedrake/laravel-crm. Evaluate core separately; adopting the panel is not adopting a CRM strategy.getPrimaryPrice() on the edit form, idempotent contact ↔ org linking, dropping the purchaseOrderLines shim in favour of the shape core reads — are each portable patterns. The adoption case is weakest if you only want one of them.To executives: This release is a capability release with an upgrade tax attached. The capability is product variations: the CRM can now sell one product in several SKUs, each with its own barcode and price, and carry that variation through quotes, orders, invoices and purchase orders — which is the difference between addressing catalogue-based businesses and declining them. Three correctness fixes carry revenue weight: purchase-order line edits now actually save instead of being silently discarded, product prices held only in a secondary currency are no longer blanked out on save, and converting a quote to an order no longer fails. The tax is coordination: the panel and core must move to 2.5.0 in the same deploy, and the Settings → Product Attributes screen is removed because core deleted the model behind it. That removal loses no data — the feature never had a table — but it needs announcing to users and cleaning out of internal links, docs and role permissions before the upgrade, not after. One pricing behaviour needs an explicit product decision: a variation with no price set sells at the product price rather than blocking the sale.
To engineering: Bump both packages together — panel to v1.4.0, core to ~2.5.0 — then run php artisan laravelcrm:filament-update, which chains core's laravelcrm:update and applies 2.5.0's three migrations (variation columns, PO line comments / order_product_id, removal of the crm product attributes permissions). Variation persistence goes through core's ProductService::syncVariations(); removed variations are soft-deleted so existing lines keep their label. The variation picker only renders for products with active variations or lines already on one, changing the product clears it, and conversions map it through — order → PO reads the variation's cost_per_unit then unit_price. The purchaseOrderLines shim is gone; PO edits now submit the products rows PurchaseOrderService::update() actually reads, so audit any code that referenced the old property. Product edit now uses Product::getPrimaryPrice(); the previous blank-load-and-overwrite path is closed. Contact ↔ org linking is called from the panel's pages because core makes that call in its Livewire components rather than its services — keep that divergence in mind when comparing behaviour against core. The quote → order label copy now plucks the label id rather than the non-existent crm_labelables.id. Finally, laravelcrm:filament-upgrade now runs filament:assets and is hooked into post-autoload-dump, so Filament stylesheets republish on every install — the v5 sideways-scroll breakage from a stale first-install stylesheet should not recur, but verify on hosts with pinned or customised asset pipelines. If Xero is live, confirm dcblogdev/laravel-xero:^1.1.3 is still in your own composer.json after the core bump; still no error if it isn't, the sync just stops, and the Guzzle ^7 cap still applies.
To security and compliance reviewers: Field-level encryption remains functional on this baseline: with encrypt_db_fields enabled, contact and organization pickers and title search decrypt and match in PHP rather than relying on SQL LIKE against ciphertext, and with encryption off search still runs in SQL. That behaviour is carried forward unchanged from 2.4.6 parity and the version floor for encryption-enabled deployments is now v1.4.0. Two items need review in this release. First, the crm product attributes permissions are removed by core 2.5.0's migration — audit role definitions and permission matrices for references before upgrading, since a permission that disappears from the registry can fail open or fail loudly depending on how your authorisation layer resolves unknown abilities. Second, two integrity fixes change stored relationships: saving a contact person and an organization together now creates a related-contact link between them (idempotent, no duplication), and clearing a contact or organization on a quote, order, invoice or purchase order continues to unlink rather than retain the association. Expect existing records not to have links that a re-save would now create; if your reporting assumes full contact ↔ organization coverage, backfill or re-save rather than assuming the fix retroactively repairs history. Product variation records now carry SKU, barcode and price and are subject to the same data-handling classification as product data generally — confirm they are covered by your retention and export procedures.
How can I help you explore Laravel packages today?