The MSP Business Model Fallacy

By  
Mendy Green
June 9, 2021
20 min read
Share this post

In any business where you’re not billing Time and Materials, the amount of time you spend on a project directly correlates to how profitable you are. In an MSP, this applies even more. MSP Businesses were designed years ahead of their time, bringing into practice concepts such as recurring revenue, outsourcing, efficient resources, and more; before people even realized the value. It’s the reason that today the MSP Businesses are blowing up with everyone you meet starting their own. Unfortunately, there’s a complex side to the framework of an MSP that is very often overlooked, especially by those just starting out.

Let’s discuss how the MSP business model is built. MSPs pitch to their prospective clients that they can provide the same level (or often times better) IT Services to their organization than they themselves can find if they go with someone internally. They ask for less money, and offer a bigger team with greater experience. These same MSPs then have to turn around and hire the same people that would have been hired directly, and not just one, but two or three or more depending on the size of the MSP.

MSPs have to pay the same salary with a smaller budget. How can these numbers possibly work?

This is where efficient resources come in; an MSP needs to stack multiple clients reusing the same resources for each client so that together all the clients combined pay enough money for the MSP to pay the technicians salary and make a profit. The income also needs to cover all base expenses of the MSP which includes infrastructure such as an RMM, PSA, Email, Phones, over-night team for emergencies and so on.

With an internal IT resource, that resource would be solely focused on the business they were working for and getting paid a full salary of say $52k/year, now the same resource at an MSP is getting paid $52k/year and needs to  stay on top of not one company IT needs, but actually 3 or 4 (or more depending on the contract size of each). This kind of expectation is unreasonable and when maintained results in high-stress work environments and eventual burn out for the technician. The saying “trial by fire” is very applicable to the technicians who work at an MSP. They are under constant barrage of tickets and stress, jumping from company to company each ticket wildly different from the next. This makes them unusually skilled and also rapidly exposes them to a wide range of experience they may not have received working for just one company. A good MSP technician of the lowest tier can easily go head to head in ability (if not knowledge) to a mid-tier internal IT resource.

Now keep in mind that when MSPs started we were a new phenomenon. There was no standard to follow, no existing business to copy, except for the existing internal IT department within a Company. We didn’t know what kind of pay structure was fair to offer a Tier 1 or Tier 2 technician because there was no “average pay” metric. The only thing we did know is that we are building a business with a stress on smaller dollar amounts per client, and more total clients. This means what we paid our technicians had to be less too, or that we keep the MSP as lean as possible with only the amount of technicians truly needed. Following the 80/20 rule we determined that 80% of the time with our clients running smoothly we would be fine and only 20% of the time when some kind “perfect storm” would occur we would need to motivate our technicians to put in more effort (or what was generally called “figure something out”).

What’s being described is not a sustainable long term plan. Simon Sinek likes to stress that business is an Infinite Game and that those who are not playing by those rules are doomed to failure eventually. The only way to stay in the game is by having resources, and the will to keep playing. We’ve already established that MSPs do not have the same pockets as a normal business, not without drastically imposing upon “will”, our employees, making them work in stressful environments and constantly being battered by the next broken issue.

The fix for this is easy, and its an iteration of what we already started. Efficient use of resources. Efficiency can help us spend less time per ticket, less time per client, and improve our technicians stress in the environment. There are two side to the efficient use of resources, one of which we already started (Sharing resources among companies) but the other is often overlooked “Work load management”. If we can make our work load efficient we can easily improve upon all the issues we just brought up. Here are some ideas that can be used to help facilitate the efficient workload.

Efficient resources is way more than just sharing resources. Making your workload efficient is just as important. Remember how profitable you are directly correlates to how efficient you can be
  • Proactively addressing age of client equipment
  • Proactively addressing ticket trends over time to help improve underlying issues
  • End User technology training for better understanding of the tools they use
  • Breaking Client’s business vertical into separate teams to allow for familiarity of Line of Business applications and setup
  • Building an MSP supported technical standard as your “stack” to ensure familiarity with technical infrastructure
  • Establishing formalized business processes for your MSP Teams so they know where to find information and how to proceed
  • Building an Automation First environment allowing you to offload work from your team to your technology decreasing the amount of time spent on tickets.

Remember, in the MSP business time isn’t a loss of potential profit, its actual profit lost as your contracted rate is the same every month. Automation and bulk actions are extremely important as the less time you spend doing something the more your Per Hour amount goes up.

Share this post
Mendy Green

I'm passionate about IT, driven by a dual love for solving complex problems and a commitment to transforming the stereotype of technical support into a positive and enjoyable user experience. For over 13 years, I've been deeply involved in the MSPGeek community, lending my expertise to various Managed Service Providers (MSPs), while also serving as the CTO at IntelliComp Technologies.

My journey in the tech world is fueled by a passion for teaching others. I find great satisfaction in imparting problem-solving and critical thinking skills, and offering practical guidance during the troubleshooting process. It's this enthusiasm for mentorship and improvement that led me to my current venture.

Today, as the founder of Rising Tide, I'm focusing on the MSP industry, dedicating my time to coaching and assisting both individuals and businesses. At Rising Tide, we're not just about providing solutions; we're about nurturing growth, fostering innovation, and building a community where everyone can rise together. Whether it's through hands-on problem solving or strategic planning, my goal is to make the IT experience not just efficient, but also empowering and enjoyable

See some more of our most recent posts...
April 14, 2026
8 min read

By the [run]Book: Episode 19

Episode 19 covers HaloPSA v2.212 and v2.214, focusing on admin quality-of-life improvements, billing visibility, and stronger workflow controls. Key highlights include clearing hidden ticket fields, email template previews, and improved API and invoicing capabilities.
Read post

Episode 19 walks through HaloPSA v2.212 and v2.214, covering a wide range of quality-of-life improvements, admin controls, and workflow enhancements. Connor and Robbie highlight updates around ticket forms, invoicing, templates, and automation, making this especially useful for MSPs looking to tighten processes and improve day-to-day efficiency.

Watch Now: By the [run]Book: Episode 19
For easier tracking, check out haloreleases.remmy.dev to filter and search HaloPSA updates by ID, version, and keyword.

Full Feature List

v2.212 Features

Asset-Client direct link added | v2.212 #843566 | 3:18

Allows assets to be linked directly to a client instead of only via a site.

  • Adds flexibility for non-site-specific assets
  • Useful for shared or virtual infrastructure
  • Be mindful of mixed client/site relationships
Dashboard views are now logged in ReportEvent, and reports loaded through a dashboard are also marked as such when auditing report runs | v2.212 #829218 | 4:56

Improves tracking of report usage across dashboards.

  • Adds visibility into report execution
  • Useful for auditing and troubleshooting
  • Helps manage multiple report versions
Added the 'End-User' field to ticket templates | v2.212 #814411 | 5:39

Adds control over end-user assignment in templates.

  • Enables overriding default behavior
  • Useful for internal workflows
  • Helps manage ticket ownership
Added new setting to hide actions on tickets when Client or Site Account Status is set to 'Stopped' | v2.212 #812986 | 7:28

Prevents actions on tickets for stopped clients or sites.

  • Reduces accidental work on inactive accounts
  • Can still be overridden by admins
  • Useful billing/service safeguard
You can now add Client, Site and User Custom Fields to Actions | v2.212 #812793 | 8:56

Allows updating custom fields directly via actions.

  • Removes need for runbooks in many cases
  • Speeds up workflows
  • Expands automation capability
Quotes are no longer able to be approved by the user if they have expired | v2.212 #808514 | 11:52

Prevents approval of expired quotes.

  • Avoids outdated approvals
  • Improves quote lifecycle control
  • Reduces billing risk
Adding $-ORIGINALCUSTOMERINVOICEADDRESS & $-ORIGINALCUSTOMERDELIVERYADDRESS for the addresses of the original customer of an invoice | v2.212 #789655 | 13:33

Adds variables for original customer addresses.

  • Useful for parent/child billing setups
  • Improves invoice clarity
  • Supports complex billing structures
Added a setting to clear fields on the new ticket screen when they are hidden by visibility conditions | v2.212 #783474 | 14:44

Ensures hidden fields do not retain values.

  • Prevents stale or hidden data
  • Improves form reliability
  • Critical for dynamic forms
You can now filter date fields on lists, views & filter profiles by 'Greater than X days ago', 'Greater than or equal to X days ago', 'Less than X days ago' & 'Less than or equal to X days ago' | v2.212 #781279 | 15:46

Adds advanced relative date filtering.

  • Enables precise SLA and reporting views
  • Helps identify stale tickets
  • Major usability improvement
Added Email Template Preview for Email Templates | v2.212 #767443 | 18:25

Adds preview functionality for templates.

  • Speeds up testing
  • Validates variables and formatting
  • Useful for multi-language setups
Added the ability to edit meter readings on recurring invoice lines | v2.212 #727713 | 20:59

Allows editing of existing meter readings.

  • Correct mistakes without rework
  • Improves billing accuracy
  • Adds flexibility
A setting has been added to Item Group configuration so that when adding Items from a Sales Order to an Invoice the Invoice Group Name will be used to match existing groups or create new groups | v2.212 #709218 | 21:58

Improves grouping of invoice items.

  • Keeps invoices structured
  • Reduces manual effort
  • Useful for standardized billing
Option to allow the merging of assets | v2.212 #671302 | 23:07

Enables merging duplicate assets.

  • Useful for cleanup scenarios
  • Prevents duplication
  • Maintains data quality
Added the setting 'Show related Ticket count' to ticket settings | v2.212 #652167 | 23:47

Displays number of related tickets.

  • Improves visibility
  • Adds quick context
  • Enhances UX
Customers and assets can now be matched off of incoming Site24x7 alerts | v2.212 #644267 | 24:56

Enhances monitoring integration mapping.

  • Reduces manual matching
  • Improves automation
  • Better alert accuracy
An option has been added to Purchase Order Statuses so that they can be marked as "Cancelled/Do not receive stock" | v2.212 #615288 | 25:12

Adds more control to purchase order lifecycle.

  • Prevents unwanted stock processing
  • Improves procurement accuracy
  • Clearer status tracking
An option has been added to the workflow step actions for "Email from Agent" | v2.212 #572585 | 26:43

Enables workflows triggered by agent emails.

  • Supports email-driven automation
  • Useful for niche workflows
  • Expands flexibility
Google Maps Integration is now available | v2.212 #160218 | 27:18

Adds mapping and geolocation features.

  • Visualize customers/sites
  • Helps plan visits
  • Auto-generates coordinates

v2.214 Features

Added the Project Setup Wizard | v2.214 #769329 | 29:45

Introduces guided project setup.

  • Simplifies project creation
  • Early-stage usability
  • Foundation feature
Input Chat flow steps can now update Ticket Fields after a Ticket has been logged in the Chat Flow | v2.214 #1079338 | 31:11

Allows updating ticket fields post-creation in chat.

  • Improves chat workflows
  • Enables dynamic updates
  • Better self-service
It is no longer possible to delete a Top Level if it contains Customers | v2.214 #1078032 | 33:00

Prevents deletion of populated top-level structures.

  • Protects hierarchy
  • Prevents accidental data loss
  • Important safeguard
Timesheet submission/revert can now be performed from the Timesheet side panel | v2.214 #1077825 | 33:32

Improves timesheet usability.

  • Faster workflow
  • Less navigation
  • Cleaner UX
Resolved an issue with the "Attach quotation PDF when sending email" setting failing to function for Actions that send Quote emails | v2.214 #1077103 | 34:09

Fixes inconsistent quote PDF behavior.

  • Ensures settings are respected
  • Prevents incorrect attachments
  • Improves reliability
Actions with system use 'Email Quotation' now follow the Quote setting 'Attach quotation PDF when sending email' | v2.214 #1076914 | 34:47

Aligns quote email behavior with configuration.

  • Consistent output
  • Reduces confusion
  • Improves automation
Recurring Billing Profiles can now be used from the Recurring Invoice screen using the List context menu | v2.214 #1076256 | 34:56

Adds access to billing profiles from invoice screen.

  • Reduces navigation
  • Speeds up workflows
  • Useful for bulk billing
Quote variables can now be used on Ticket actions | v2.214 #1075404 | 36:06

Allows use of quote data in actions.

  • Enhances automation
  • Improves communication
  • Reduces manual entry
Item/Product Updated has been added as a runbook trigger | v2.214 #1074755 | 36:55

Adds new automation trigger.

  • Enables reactive workflows
  • Useful for inventory updates
  • Expands automation scope
Added 'Rich' as a type of field for asset fields | v2.214 #1073877 | 37:07

Adds rich text support for asset fields.

  • Supports formatted content
  • Useful for documentation
  • Allows more detailed records
A setting has been added so that when a Ticket has open Appointments/To-do lists and an SLA procedure closes it then it will not be closed and can have it's status changed instead | v2.214 #1073377 | 37:59

Prevents closure when tasks remain open.

  • Protects incomplete work
  • Improves SLA handling
  • Adds control
Option added to add approval votes to the Feed | v2.214 #1073347 | 39:18

Adds approvals to activity feed.

  • Improves visibility
  • Centralizes approvals
  • Helps auditing
A setting has been added to Self Service Portal configuration so that the "Log in to agent application" option will not show for the self service portal login form | v2.214 #1072163 | 39:43

Removes agent login option from portal.

  • Cleaner UX
  • Reduces confusion
  • Better user experience
The option to order/sequence all Lookup Codes has been added | v2.214 #1072076 | 40:41

Adds ordering control to lookup codes.

  • Improves dropdown organization
  • Helps standardization
  • Better admin control
Added a target date field to software releases | v2.214 #1069542 | 42:21

Adds planning field to releases.

  • Supports tracking
  • Useful internally
  • Minor feature
A UserGuiding container can now be added to the application and portal in Config > Advanced Settings | v2.214 #1068717 | 42:47

Enables guided onboarding tools.

  • Supports walkthroughs
  • Improves onboarding
  • External integration
Consignment line note property has been added | v2.214 #1068640 | 44:54

Adds note field to consignment lines.

  • Improves detail tracking
  • Useful for logistics
  • Adds flexibility
An option has been added to Agent and Role configuration to show all Teams for all departments in the "by team" view/tree. This will only show if "Membership level to all Departments" is used | v2.214 #1067771 | 45:36

Expands team visibility.

  • Useful for large orgs
  • Improves navigation
  • Role-based control
The UserWay widget can now be enabled withing Advanced Settings for the main application (previously only available for the self-service portal) | v2.214 #1067551 | 45:49

Extends accessibility tools to main app.

  • Improves accessibility
  • Broader coverage
  • Better compliance
A setting has been added to add a column for the last invoiced value when viewing recurring invoices in the ready for invoicing area | v2.214 #1066844 | 46:36

Displays previous invoice values.

  • Helps spot anomalies
  • Improves validation
  • Saves time
Action Billing Plan ID has been exposed to the API for the Actions endpoint | v2.214 #1066754 | 49:38

Exposes billing data to API.

  • Improves integrations
  • Enables automation
  • Adds flexibility
The Item selection used in Automation Criteria will now allow searching | v2.214 #1066435 | 49:59

Adds search to selection fields.

  • Improves usability
  • Saves time
  • Reduces friction
Choosing a User on the call screen will now follow the settings relating to a Ticket User's Client/Site relationship | v2.214 #1066332 | 50:43

Aligns call screen logic with ticket settings.

  • Improves consistency
  • Reduces errors
  • Better UX
Original Sales Order reference is now populated for Credit lines that were generated from Sales Order Invoices | v2.214 #1066311 | 51:24

Links credit lines to original sales orders.

  • Improves traceability
  • Useful for finance workflows
  • Adds clarity
An Advanced Configuration setting has been added to change the way that the primary key value is generated for Invoices and Invoice Lines | v2.214 #1065645 | 51:39

Improves invoice ID handling.

  • Supports bulk operations
  • Prevents conflicts
  • Useful for integrations
Added option to specify Application identity roles when "Agent to log in as" is not set to an Agent on a Halo API application | v2.214 #1065228 | 57:36

Introduces role-based API identity.

  • Decouples API from agents
  • Improves security model
  • Better for integrations at scale

March 31, 2026
8 min read

By the [run]Book: Episode 18

This episode of By the Runbook breaks down HaloPSA 2.212 updates with a focus on what actually matters for MSPs. The team covers key changes to automation, ticket views, and integrations, along with practical advice on what to enable, what to watch out for, and how these updates impact real-world workflows
Read post

In this episode of By the Runbook, the team continues through the HaloPSA 2.212 release notes and spends time unpacking what several of these changes actually mean in practice. The conversation covers workflow design, mail campaigns, ticket views, reporting, and automation behavior, with especially useful commentary for MSPs trying to decide what to enable, what to ignore, and what to be careful with.

Watch Now: By the [run]Book: Episode 18
For easier tracking, check out haloreleases.remmy.dev to filter and search HaloPSA updates by ID, version, and keyword.
Check out MSP Blueprint for info on runbooks: MSPBlueprint

Important Mentions

Ticket details can now auto-refresh when a background automation completes | v2.212 #1003085 | 25:29

This allows the ticket screen to automatically refresh when a background automation completes.

  • Eliminates the need for manual refresh after automations run
  • Keeps available actions, workflow steps, and ticket data in sync
  • Especially useful in environments with heavy automation usage
  • ⚠️ Not enabled by default — go turn this on
Additional rule types have been added to qualification matching criteria for custom fields | v2.212 #1009694 | 19:02

Expands qualification matching to include custom field criteria.

  • Enables highly granular ticket routing and assignment logic
  • Can support advanced use cases like skill-based routing or segmentation
  • ⚠️ Powerful but rarely practical for most MSPs without significant planning
Added the option to use the incoming webhook service for QuickBooks Online webhook processing | v2.212 #1021654 | 8:39

Adds delayed and retry-based webhook processing options.

  • Helps prevent failures during high webhook volume
  • Introduces retry logic for more reliable integrations
  • ⚠️ Can introduce delays (10–15+ minutes in some cases depending on configuration)
  • ⚠️ Default behavior vs delayed processing needs to be reviewed carefully


FullFeature List


You can now restrict the ‘From’ address options on a Ticket Action to mailboxes the assigned team can access | v2.212 #1031882 | 2:50

This change limits the available “From” addresses on a ticket action to mailboxes the assigned team can actually access.

  • Prevents agents selecting mailboxes they don’t have access to
  • Reduces confusion in multi-mailbox environments
  • Helpful for teams split across departments or service lines
Added Email Address as another attribute option for the Followers field on the Self-Service Portal | v2.212 #1031728 | 3:23

Adds Email Address as another attribute option for follower behavior on the portal.

  • Improves flexibility for notifications
  • Useful for including external stakeholders
  • Expands portal configuration options
You can now edit various parts of a Mail Campaign after starting it | v2.212 #1030951 | 3:32

Allows changes to Mail Campaigns after they have started.

  • Removes need to recreate campaigns due to small mistakes
  • Makes campaigns more practical to use
  • Signals continued investment in this feature area
You can now restrict Pipeline Stages at the Opportunity Type level | v2.212 #1027853 | 4:58

Restricts pipeline stages based on opportunity type.

  • Keeps sales workflows cleaner
  • Avoids irrelevant stage options
  • Useful for more structured sales processes
Added the option to use the incoming webhook service for QuickBooks Online webhook processing | v2.212 #1021654 | 8:39

Adds webhook processing options including delayed and retry handling.

  • Helps manage high webhook volume
  • Reduces risk of dropped events
  • ⚠️ May introduce delays depending on configuration
Added in the ability to hide certain tickets from the change calendar | v2.212 #1017196 | 13:21

Adds the ability to hide tickets from the change calendar.

  • Useful for sensitive or internal tickets
  • Helps reduce noise in calendar views
  • Currently tied to the “Sensitive” flag
Service Users are Subscribed to has been added as an option to Distribution Lists and User Lists | v2.212 #1013148 | 13:55

Adds Service Users as a selectable option in distribution and user lists.

  • Expands targeting logic
  • Improves automation flexibility
  • Useful for advanced filtering scenarios
You can now send Mail Campaigns from Sales Mailboxes | v2.212 #1011772 | 14:54

Allows campaigns to be sent from sales mailboxes.

  • Improves branding and ownership
  • Separates sales vs support communications
  • ⚠️ Be cautious of Microsoft send limits
A warning will now be shown on an action and the ticket will be updated if an action email will fail to send | v2.212 #1010891 | 16:49

Adds a warning when an action email will fail.

  • Improves visibility into email failures
  • Helps prevent missed communications
  • Updates ticket automatically with failure state
Added the ability to map relationship types for parent, child, and sibling assets in SQL imports | v2.212 #1010659 | 18:17

Adds asset relationship mapping during SQL imports.

  • Preserves structure during migrations
  • Supports complex asset environments
  • Useful for onboarding/import projects
Added isRunning to Halo Asset Discovery integration | v2.212 #1010606 | 18:54

Adds an isRunning field to asset discovery.

  • Helps track discovery state
  • Useful for monitoring and automation
  • Adds visibility into background processes
Additional rule types have been added to qualification matching criteria for custom fields | v2.212 #1009694 | 19:02

Expands qualification matching with custom field rules.

  • Enables more advanced routing logic
  • Supports complex assignment scenarios
  • ⚠️ Often overkill for most MSPs
Ticket details can now auto-refresh when a background automation completes | v2.212 #1003085 | 25:29

Allows ticket view to auto-refresh after automation runs.

  • Keeps UI in sync with backend updates
  • Eliminates need for manual refresh
  • ⚠️ Not enabled by default — turn this on
Added 'Update Currency' to Quotes | v2.212 #992111 | 29:17

Adds ability to update currency values on quotes.

  • Supports multi-currency environments
  • Updates cost and price together
  • Improves quote accuracy
Added option to make a Knowledge Base's negative feedback comment mandatory | v2.212 #991702 | 30:41

Requires comments for negative KB feedback.

  • Improves feedback quality
  • Helps refine documentation
  • Useful for KB governance
New default setting for showing grandchildren in child ticket lists | v2.212 #990317 | 30:49

Adds control for showing nested tickets.

  • Improves visibility in projects
  • Useful for multi-level ticket structures
  • Configurable behavior
Improvements to AI report analysis | v2.212 #987946 | 31:27

Enhances AI reporting capabilities.

  • Can now be scheduled
  • Can be embedded in PDFs
  • ⚠️ Still not widely used in practice
Added a setting to restrict knowledge base article amendments to owners only | v2.212 #982079 | 33:06

Restricts KB edits to owners only.

  • Improves control over content
  • Prevents unintended edits
  • Supports structured documentation workflows
Added a global setting to allow users to translate actions on the portal when using Azure AI Translator | v2.212 #978595 | 33:22

Adds translation support in the portal.

  • Useful for multilingual environments
  • Improves accessibility
  • May not be necessary for all MSPs
Added the setting 'Secondary Asset MAC address field' to the Splashtop integration | v2.212 #978176 | 34:08

Adds secondary MAC address support.

  • Helps with multi-adapter devices
  • Improves asset matching
  • Integration-specific enhancement
You can now set character limits on memo and rich text custom fields | v2.212 #976975 | 34:39

Adds character limits to text fields.

  • Prevents overly large inputs
  • Improves data consistency
  • Helpful for structured data entry
Added additional fields to assist with reporting on OLAs and rules | v2.212 #976953 | 34:47

Adds more fields for OLA and rule reporting.

  • Improves internal tracking
  • Supports more detailed reporting
  • Still primarily useful for advanced setups
Added the setting 'Prevent email responses from continuing the approval flow' at approval step level | v2.212 #974172 | 39:10

Prevents approvals from email replies.

  • Avoids accidental approvals
  • Forces structured approval process
  • Improves workflow control
Added a setting to the Custom Field configuration to copy values to grandchild tickets when updated | v2.212 #970536 | 40:25

Extends field copying to deeper ticket levels.

  • Maintains consistency across ticket hierarchy
  • Useful for projects and task trees
  • Reduces manual updates
Added Primary Asset as a criteria for Runbooks | v2.212 #970066 | 40:41

Adds primary asset as a runbook condition.

  • Enables asset-based automation
  • Improves targeting of runbooks
  • Useful for device-specific workflows
Added $-AgentID as an available $ variable for Database Lookups | v2.212 #961283 | 40:48

Adds AgentID variable for lookups.

  • Expands database query capabilities
  • Useful for advanced automation
  • Improves flexibility in integrations
Added reports and dashboards to configuration change tracking | v2.212 #959264 | 40:55

Adds reporting changes to config tracking.

  • Improves audit visibility
  • Helps track admin changes
  • Pairs well with settings search feature
Filter Profiles can now be used on Child Ticket lists | v2.212 #922698 | 42:56

Adds filter profiles to child ticket views.

  • Reduces clutter (especially closed tickets)
  • Improves usability in projects
  • Strong practical improvement
Added multiple settings to the 'Other Open Tickets' views | v2.212 #882375 | 45:18

Adds more configuration options to other open tickets view.

  • Improves visibility of related tickets
  • Can be moved to its own tab
  • Enhances day-to-day ticket context

March 17, 2026
8 min read

By the [run]Book: Episode 17

Episode 17 wraps up 2.21 and begins 2.212 covering key HaloPSA updates across billing, SLAs, and ticket workflows. Highlights include dynamic ticket filters, default billing templates, and improved billing visibility—making this a must-watch for MSPs optimizing operations and reporting.
Read post

Episode 17 warps up the breakdown of version 2.21 and begins 2.212, highlighting impactful updates across billing, SLA visibility, and ticket management. The team dives into major improvements like dynamic ticket filters, default billing templates, and better billing tab access controls. This episode is especially useful for MSPs looking to tighten billing accuracy, improve reporting visibility, and streamline ticket workflows.

Watch Now: By the [run]Book: Episode 17
For easier tracking, check out haloreleases.remmy.dev to filter and search HaloPSA updates by ID, version, and keyword.

Important Mentions

Billing Tab Visibility Changes | v2.212 #1062249 | 30:16

The Billing tab is now visible to agents without requiring full billing permissions, with actions locked based on access.

  • Improves visibility without over-permissioning agents
  • Reduces need to grant risky billing permissions
  • ⚠️ Be cautious: exposing billing data still requires process control and training (as discussed in the episode)
SLA Breach Visibility for On-Hold Tickets | v2.21 #795425 | 12:33

Tickets on hold can now be included in SLA breached filters.

  • Previously, putting a ticket on hold could hide SLA breaches
  • This setting ensures accurate reporting and accountability
  • ✅ Recommended: turn this on immediately
Default Billing Template for New Customers | v2.21 #792419 | 13:01

You can now define a default billing template applied automatically when creating a new customer.

  • Removes need for custom automation to apply templates
  • Ensures consistent billing rules across all customers
  • ✅ Recommended: enable this and retire older automation-based approaches
Dynamic Ticket Filters | v2.21 #772177 | 16:52

Dynamic filters can now be used on ticket lists for more flexible querying.

  • Enables complex AND/OR filtering logic
  • Reduces reliance on multiple saved views
  • Opens the door for more advanced automation without SQL
  • 🚀 One of the most impactful usability improvements in this release

FullFeature List

Changing the Product/Item 3rd Party ID reference will now be copied to recurring invoices when configured in Item Settings | v2.21 #956174 | 5:23

This helps keep recurring invoices aligned when item third-party IDs change.

  • Useful during accounting platform migrations
  • Reduces manual cleanup on recurring invoice records
  • Helps preserve item mapping consistency across systems
Invoice Due Date option "Equal to Invoice Date" has been added to the Recurring Invoice options to match the options at Customer setup | v2.21 #933961 | 6:09

Recurring invoices now get the same due date option already available at customer setup.

  • Brings recurring invoice behavior into line with customer billing settings
  • Helpful for teams that want cleaner due date standardization
You can now hide the ‘Approve/Reject All’ buttons on the Portal My Approvals page and require approval notes to always show ticket details | v2.21 #898703 | 6:22

This adds more control to portal-based approval workflows.

  • Helps avoid overly broad one-click approval behavior
  • Encourages better review discipline
  • Improves auditability around approval notes and detail visibility
Added 2 new Site-level settings to create invoices against a different Customer | v2.21 #859082 | 6:40

This extends alternate invoicing behavior down to the site level.

  • Adds more flexibility for multi-site or multi-entity billing setups
  • Useful where billing responsibility differs by site rather than customer
Added a setting "Re-assign tickets to unassigned when the assigned agent is made inactive" to the Microsoft Entra integration to allow agent tickets to be re-assigned if they are deactivated via an import | v2.21 #833690 | 7:04

This helps prevent tickets from disappearing into inactive-agent limbo.

  • Particularly useful when Entra sync deactivates agents automatically
  • Helps surface tickets that might otherwise get lost
  • Worth reviewing carefully because reassignment can also affect downstream reporting
You can now add Primary Agent, Secondary Agent & Account Manager as criteria for ticket filter profiles and lists | v2.21 #827931 | 9:50

More ticket list criteria means more practical operational views.

  • Lets you filter based on responsibility relationships, not just ticket ownership
  • Useful for dashboards, routing views, and account oversight lists
Improvements to ManageEngine Endpoint Central Integration | v2.21 #815251 | 10:11

This update improves the ManageEngine Endpoint Central integration.

  • Better integration maturity is always welcome for teams relying on external RMM/endpoint tooling
  • Useful for shops standardizing around that stack
Added the ability to use generic Open ID Connect single sign-on | v2.21 #814980 | 10:36

Halo now supports generic OpenID Connect SSO.

  • Expands identity provider compatibility beyond more limited built-in options
  • A solid improvement for organizations with more advanced authentication requirements
Added the ability to clone Item Bundles | v2.21 #801764 | 11:31

You can now duplicate item bundles instead of rebuilding them manually.

  • Saves setup time
  • Helpful when creating variations of similar commercial offerings
Added settings in asset management and services configuration for the name shown for the assets and services areas | v2.21 #798807 | 11:36

This adds more naming flexibility to the UI.

  • Lets teams align terminology with internal language
  • Helpful for organizations that want the platform to better match how they talk about assets and services
Added a setting to the SLA configuration to allow tickets that are on hold to be included in the SLA Breached filter for ticket lists | v2.21 #795425 | 12:33

This makes SLA breach reporting more honest and more useful.

  • On-hold tickets can still be breached, and now your filters can reflect that
  • Recommended setting to enable for better service visibility
You can now set a default billing template, picked up when creating a new customer. | v2.21 #792419 | 13:01

A major improvement for standard billing configuration.

  • Great for MSPs using a common template across all new customers
  • Replaces the need for custom customer-created automation in many environments
Added support for asset-based meters on recurring invoice lines, enabling managed print functionality | v2.21 #787149 | 15:28

This adds more flexibility to meter-driven recurring billing.

  • Especially relevant for managed print and other metered service models
  • Supports scenarios where an asset carries multiple billable meter values
Added the ability to use dynamic filters on ticket lists | v2.21 #772177 | 16:52

Dynamic ticket filters add a much stronger filtering experience.

  • Supports grouped filter logic beyond basic visible-column filtering
  • Helps reduce list sprawl and improves usability for operations teams
Added the ability to clone custom fields | v2.21 #722363 | 21:17

Cloning custom fields speeds up admin work.

  • Useful when building multiple similar fields
  • Cuts down repetitive configuration effort
Improvements to Pie and Doughnut Chart data labels | v2.21 #638315 | 21:49

This update improves chart label readability.

  • Helpful for dashboard clarity
  • A small but welcome quality-of-life improvement
Improvements to the Update Encryption option found in Security/Advanced Settings | v2.21 #510731 | 22:24

This update refines the encryption update workflow.

  • Relevant for teams actively managing advanced security settings
  • Another admin-side quality improvement
A setting has been added to Call Management configuration to show the user's preferred number on the call screen | v2.21 #510517 | 22:56

This improves call handling context.

  • Puts the preferred number front and center
  • Helpful for service desks handling inbound and outbound calls
Properties have been added to Item and Item Group for "Number of decimal places to use for quantity" that will affect the default decimal behaviour | v2.21 #228735 | 23:17

This gives more control over quantity precision.

  • Useful for products or services sold in partial units
  • Helps tailor quantity behavior to the actual commercial model
When using the configuration option to allow all Project and Tasks to be chosen when creating a Project from a Sales Order line, this will now include Tickets if they are linked to a Sales Order line | v2.212 #1062502 | 25:12

This improves flexibility when linking work records from sales orders.

  • Helpful for teams using tickets instead of projects in some fulfillment scenarios
  • Better supports mixed service delivery workflows
The Billing tab of a Ticket will now show for agents without requiring the Billing Details permission. Actions and properties within the Billing tab will be locked depending on permissions | v2.212 #1062249 | 30:16

This adds better billing visibility without fully exposing billing controls.

  • Good balance between awareness and security
  • Still requires caution around how teams use the billing area
ID can now be specified in a Ticket spreadsheet (XLS/CSV) import to update existing Tickets | v2.212 #1062155 | 32:34

Spreadsheet imports can now target existing tickets by ID.

  • Makes bulk updates easier
  • Useful for admin cleanup or migration workflows
The heading for the timer on the Ticket details pane has been removed | v2.212 #1061107 | 32:50

A small UI cleanup on the ticket details pane.

  • Frees up a bit more space
  • Minor but sensible interface polish
A configuration option has been added to allow Co-managed agents to log time | v2.212 #1060620 | 33:09

This adds flexibility for co-managed support models.

  • Lets co-managed agents participate more directly in time tracking
  • Helpful for shared-service or hybrid support arrangements
An option has been added to the CSP Integration so that you can map Users to "Do not import" so that mappings will not be automatically created for them in cases when the Users are not within the scope of a specific tenant permissions. | v2.212 #1060619 | 36:23

This improves control over CSP user mapping behavior.

  • Helps avoid unwanted user mappings
  • Useful where tenant scope or permissions are intentionally limited
Added a hint has been added to the Customer Tax rate selection when using Xero to better explain when this rate is used | v2.212 #1060166 | 38:25

This adds clarification around tax rate usage in Xero-linked setups.

  • A small but useful usability improvement
  • Helps reduce confusion in finance configuration
A button has been added to the Client Billing tab to clear the current Avalara Tenant. | v2.212 #1059696 | 38:34

This makes Avalara tenant cleanup easier from the client billing tab.

  • Handy for correcting configuration mistakes
  • Saves time compared with more awkward reset workflows
Runbooks can now be triggered from Custom Buttons on the following entities: Client, Site, User, Device, Quotation, Purchase Order, Invoice | v2.212 #1059597 | 38:56

This is a strong automation improvement.

  • Lets you trigger runbooks directly from more parts of the UI
  • Opens up practical workflows for service, sales, procurement, and account management
It is now possible to delete specific rows from a custom table using the property "delete_these_rows" | v2.212 #1059297 | 40:35

Custom table row deletion gets more precise.

  • Useful for automation and structured data maintenance
  • Reduces the need for full-table replacement logic
When using the configuration option to not create invoice lines with 0 value, recurring invoices lines shown in recurring invoice lists will be hidden if they have 0 value | v2.212 #1058650 | 40:54

This cleans up recurring invoice visibility.

  • Keeps invoice lists tidier
  • Makes review screens easier to scan
Minor changes to configuration to better explain how the function to automatically add Asset to Contracts can be configured | v2.212 #1058609 | 41:04

This is a documentation/config clarity improvement.

  • Helpful for admins configuring asset-to-contract automation
  • Less ambiguity is always welcome in contract automation settings
Additional options have been added to Ticket Rule assignment for Regional Manager, Logistics Manager, Sales Representative, Account Owner and CXM Lead | v2.212 #1057719 | 41:13

Ticket rule assignment now supports more role-based options.

  • Improves routing flexibility
  • Better reflects broader operational ownership models
Added approval rule criteria "Already approved by agent" | v2.212 #1057491 | 41:21

Approval rule logic gets another useful condition.

  • Adds more nuance to approval workflows
  • Helpful for reducing redundant approval steps
Added Supplier as a criteria field for dynamic field visibility, and added Supplier as notification criteria | v2.212 #1057372 | 41:56

Supplier-related configuration gets more flexible.

  • Helps tailor field visibility based on supplier context
  • Adds supplier-aware notification scenarios
Variables have been added that can be used on Project Templates when created from a Sales Order line | v2.212 #1057339 | 42:34

Project templates now get more dynamic input from sales-order-driven creation.

  • Improves template flexibility
  • Helpful for standardized fulfillment workflows
Additional columns have been added to the Quote and Sales Order line column profiles | v2.212 #1057260 | 42:47

This expands visibility in quote and sales order line views.

  • Helpful for finance and sales review workflows
  • More columns means less need to jump into detail views
An option has been added to the setting "Allow a Tickets Customer and Site to be different from the Users Customer and Site" to allow only the Site to be changed for a given User | v2.212 #1057242 | 42:59

This makes customer/site control more precise.

  • Adds a middle ground between fully matching and fully independent customer/site behavior
  • Useful for environments with stricter user association rules
Added additional response schemas to the API swagger documentation | v2.212 #1053435 | 43:56

The API docs continue to improve.

  • Better documentation supports better integrations
  • Especially useful for teams building custom API workflows
You can now specify the amount of columns you'd like like to show when logging a ticket through the agent app | v2.212 #1053014 | 44:35

This improves ticket logging layout flexibility in the agent app.

  • Lets teams control form density
  • Helpful when designing cleaner ticket intake experiences
Auto payments processed via Stripe on the integrator now use idempotency keys | v2.212 #1052572 | 45:31

This is an important reliability improvement for payment processing.

  • Helps prevent accidental duplicate processing
  • Good back-end hardening for Stripe-integrated billing
Added the ability to be able to change a service's category when the service is created from an asset | v2.212 #1050926 | 45:52

This adds more flexibility when services are generated from assets.

  • Useful where the default category is not the right long-term fit
  • Gives admins more post-creation control
Added the setting 'Copy values to parent Tickets on new Ticket screen' at custom field and ticket type field level | v2.212 #1042761 | 45:59

This improves parent/child ticket data behavior.

  • Lets values flow upward earlier in the ticket creation process
  • Helpful for service desks using child-ticket-driven workflows
Added the ability to link a 3rd party ID against agents, teams, agent roles, user roles, and CABs | v2.212 #1041704 | 47:57

Third-party ID linking is now available across more entities.

  • Supports cleaner integrations
  • Helps external systems map records without relying on internal IDs alone
Added flastactiondate as a field within the Query Builder | v2.212 #1041176 | 50:52

Query Builder gets another field for reporting logic.

  • Gives admins more data points to build useful views and reports
  • Helpful for operational tracking
Account and Prospects can now be viewed in Top Levels | v2.212 #1034016 | 50:56

This expands visibility of account/prospect records in top-level views.

  • Useful for sales and account-management workflows
  • Continues the gradual maturity of account/prospect handling
Added access control for custom buttons | v2.212 #1033683 | 51:35

Custom buttons now get access control.

  • Lets admins expose UI actions more safely
  • Important for governance as button-triggered automation becomes more powerful
UI Improvements to the New Opportunity Screen launched from Accounts/Prospects records | v2.212 #1032933 | 51:42

This adds polish to the opportunity creation experience.

  • Makes sales workflows smoother from account/prospect records
  • A welcome UX improvement for CRM-oriented teams
API Key Authentication method added to the Halo API | v2.212 #1032829 | 51:47

This is one of the biggest integration-facing updates in the episode.

  • Makes API authentication easier in many practical scenarios
  • Especially useful for agent-based integrations and tooling
  • Important reminder from the episode: permissions are tied to the identity behind the key, so scope and access design still matter