Horilla CRM

Horilla CRM Activities Explained: Calls, Meetings, Tasks, and More

horilla.contrib.activity uses one Activity model (task, meeting, log_call, event) attached via GenericForeignKey. Detail tabs load through HorillaActivitySectionView. This post is Part 13 of 28 in the Horilla CRM Technical Blog series. What is the activity module? The activity module enables you to: Activity model and record ownership The activity subsystem is located in horilla.contrib.activity. It […]

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 […]

How to Add and Manage Partner Account Relationships in Horilla CRM

Managing partner relationships is a critical part of growing your business ecosystem. Horilla CRM provides a dedicated Partner Account Relationship feature that allows you to link accounts together, assign partner roles, and track who is working with whom—all within the CRM’s Account module. This guide walks you through how to set up partner roles, mark […]