CRM

How to Set Up Email Templates, SMTP, and Mail-to-Lead in Horilla CRM

horilla.contrib.mail handles outbound templates, SMTP/Outlook configuration, open tracking, and works with mail-to-lead in horilla_crm.leads — integrated with automations and cadences. This post is Part 12 of 28 in the Horilla CRM Technical Blog series. What is the Horilla mail module? The Horilla mail module enables you to: Mail domain architecture Horilla CRM keeps email infrastructure […]

A Complete Guide to KPI Widgets and ECharts in Horilla CRM

Dashboards combine KPI cards, ECharts visualizations, and tables. Each app contributes generators through dashboard.py registered on DefaultDashboardGenerator. This post is Part 11 of 28 in the Horilla CRM Technical Blog series. What are Horilla CRM dashboards? Horilla CRM dashboards enable you to: Data models horilla/contrib/dashboard/models.py: Model Purpose DashboardFolder Organize dashboards Dashboard Layout container per user/role […]

How to Implement Real-Time Notifications with Django Channels in Horilla CRM

Horilla CRM uses Django Channels and WebSockets to push notifications to connected browsers. Automations and system events can be delivered via notification, email, or both. This post is Part 10 of 28 in the Horilla CRM Technical Blog series. What is real-time notifications in Horilla CRM? Real-time notifications in Horilla CRM enable you to: WebSocket […]

A Complete Guide to REST APIs in Horilla CRM Using Django REST Framework

Every major CRM module exposes a Django REST Framework API alongside the HTMX UI. Routes register through AppLauncher.get_api_paths() — no root URL edits. This post is Part 9 of 28 in the Horilla CRM Technical Blog series. What is the Horilla CRM API layer? The Horilla CRM API layer enables you to: API route registration […]

Build Your First Horilla CRM Module in One Session: A Complete Capstone Tutorial

This capstone walks through Python manage.py start_horilla_app and wires a complete Partners module — model, list/detail views, registration, menu, and permissions — end to end. This post is Part 8 of 28 in the Horilla CRM Technical Blog series. What is building your first Horilla CRM module? Building your first Horilla CRM module enables you […]

A Complete Guide to CRM Automations, Approvals, and Workflows in Horilla CRM

Horilla CRM ships a universal automation engine with five trigger types — on create, update, create-or-update, delete, and scheduled — plus a generic approvals process any model can plug into. This post is Part 7 of 28 in the Horilla CRM Technical Blog series. What is Horilla CRM automations and workflows? Horilla CRM automations and […]

How to Extend Horilla CRM Without Forking the Core Framework

Horilla CRM’s extension framework allows you to add fields and UI to existing models without forking core. Extension apps use _inherit_model on models and matching _inherit_form, _inherit_list, and related hooks for forms, lists, and views. This post is Part 6 of 28 in the Horilla CRM Technical Blog series. What is the _inherit_model extension framework? […]

Why Horilla CRM Uses HTMX Instead of React for a Fast and Server-Rendered UI

Horilla CRM uses HTMX for partial page updates while keeping Django server-rendered templates. The shell loads once; #mainContent and #modalBox swap HTML fragments on each interaction. This post is Part 5 of 28 in the Horilla CRM Technical Blog series. What is HTMX in Horilla CRM? HTMX in Horilla CRM enables you to: The page […]

How Horilla CRM’s Four-Layer Permission System Enhances Data Security

Horilla CRM stacks four permission layers on top of Django auth: model-level CRUD (including _own variants), field-level read/write/hide, row ownership via OWNER_FIELDS, and hierarchical roles. This post is Part 4 of 28 in the Horilla CRM Technical Blog series. What is the four-layer permission model? The four-layer permission model enables you to: Overview Layer Mechanism […]

How horilla.contrib.generics Powers CRM List, Kanban, and Detail UIs

horilla.contrib.generics is Horilla CRM’s CBV framework. You subclass list, kanban, detail, and form views and configure columns, filters, and permissions instead of writing repetitive template logic. This post is Part 3 of 28 in the Horilla CRM Technical Blog series. What is horilla.contrib.generics? horilla.contrib.generics enables you to: The generics toolkit Import from horilla.contrib.generics.views: Class UI […]

A Complete Guide to HorillaCoreModel and Multi-Tenant CRM Architecture

HorillaCoreModel is the abstract base class that every CRM business record extends. It provides audit columns, company scoping, JSON metadata, and change history in one place. This post is Part 2 of 28 in the Horilla CRM Technical Blog series. What is HorillaCoreModel? HorillaCoreModel enables you to: Why Not Plain models.Model? In a multi-company CRM, […]

How Horilla CRM Apps Work: A Deep Dive into registration.py, menu.py, and AppLauncher

A Horilla CRM app is a self-contained Django module that plugs into the platform through AppLauncher. Each app ships convention files that register features, menus, signals, and dashboards without editing the root urls.py. This post is Part 1 of 28 in the Horilla CRM Technical Blog series. What is a Horilla CRM App Module? A […]