By
Mendy Green
June 9, 2021
•
20 min read
Business

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
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.

Episode 22 of By the [run]Book dives deep into HaloPSA v2.216, covering a wide range of enhancements across reporting, integrations, invoicing, ticketing, assets, and automation. Connor and Mendy spend extra time unpacking new SLA-aware database functions, improved integrator troubleshooting, OAuth token management, sensitive ticket controls, and several quality-of-life improvements that make Halo easier to administer and automate. This episode is particularly valuable for MSPs looking to improve reporting accuracy, streamline integrations, and gain better visibility into backend processes.
Watch Now: By the [run]Book: Episode 22
For easier tracking, check out haloreleases.remmy.dev to filter and search HaloPSA updates by ID, version, and keyword.
One of the most impactful features discussed in this episode introduces new database functions designed to calculate working time between dates using Halo's own business logic.
Why it matters: MSPs building advanced reporting can now calculate true business time rather than relying on raw SQL date math.
Sensitive tickets gain more granular visibility controls.
Why it matters: MSPs supporting executive teams or handling confidential projects gain stronger access controls.
Connor and Mendy highlighted this as one of the most valuable operational improvements in the release.
Why it matters: Faster troubleshooting means less downtime and quicker resolution when integrations fail.
This feature received strong praise from both hosts.
Why it matters: Anyone building custom integrations or working with APIs will immediately appreciate the time savings.
This feature introduces new database functions that calculate time between dates while respecting Halo's working hours, holidays, and SLA schedules. The hosts highlighted this as one of the most impactful additions in the release for reporting and analytics.
For MSPs building custom reports, this removes much of the complexity previously required to calculate true SLA working time instead of relying on standard SQL date calculations.
Text custom fields created using the newer storage method can now support up to 1000 characters instead of the previous 255-character limitation.
The team discussed real-world examples where long URLs, call recording links, and integration data would previously be truncated. This change reduces the need to switch fields to Memo types simply to accommodate longer values.
Action Group configuration is now surfaced more prominently throughout the Halo interface.
This doesn't introduce new functionality but makes Action Groups easier to discover and manage by exposing configuration options in more logical locations.
Previously, accepted or closed quotes could still transition to an expired status once their expiry date was reached.
This fix prevents completed quote statuses from being overwritten later, resulting in cleaner sales reporting and a more accurate quote lifecycle.
Scheduled nurture campaigns can now periodically re-evaluate recipient lists rather than only processing the list when the campaign initially launches.
This makes nurture campaigns much more practical for dynamic marketing lists where recipients may qualify after the campaign has already started.
The Chat Transcript variable can now be referenced whenever a linked chat exists for a ticket.
This provides more flexibility when building templates, notifications, automations, and workflows that need access to chat history.
A new variable has been added to support invoice long descriptions during pro-rata calculations.
The hosts spent time discussing how this improves consistency between invoice line descriptions and prorated billing entries, helping produce clearer invoices for customers.
Date validation can now be restricted to the creation process only.
This allows administrators to make changes to records later without triggering the same validation requirements that applied when the entity was originally created.
A new permission allows the recorded user associated with device change tracking records to be overridden.
The hosts noted this introduces additional flexibility but also raises questions around auditing and accountability, so it should be used carefully.
Asset system fields can now be configured as visible while remaining read-only.
This helps expose important information to users without allowing accidental edits.
Agreement reference numbers can now be generated on a customer-specific basis.
Organizations with structured naming conventions may find this useful when managing multiple agreements across different customers.
Asset custom fields can now be configured to require unique values.
This is particularly useful for:
It helps improve data quality and prevents duplicate asset records.
Sage Intacct mapping capabilities have been expanded to additional entities.
This improves flexibility for organizations integrating HaloPSA with Sage Intacct accounting workflows.
Custom field mapping support has been extended within the Sage Intacct integration.
This allows more business-specific data to flow between HaloPSA and Sage Intacct.
This setting helps determine how duplicate usernames are handled when new users are created.
The hosts generally felt most organizations would likely continue using traditional username formats rather than switching to email addresses automatically.
This was one of the more significant ticketing enhancements discussed during the episode.
Sensitive tickets now support additional visibility controls for both end users and agents.
This helps organizations handle:
Treeviews can now group agents by their availability status.
Dispatchers and service coordinators may find this particularly useful when reviewing ticket assignments and resource availability.
Asset custom buttons can now suppress the runbook queue confirmation message.
A small but useful quality-of-life improvement for heavily automated workflows.
Chat flows can now retrieve information stored within the user's browser and map that data into Halo records.
The hosts discussed potential use cases while also noting the broader security considerations associated with browser-side data access.
Multi-select custom fields are no longer restricted to integer-based identifiers.
This improves compatibility with external systems that use GUIDs and other non-numeric identifiers.
Additional variables have been added for Client Mention notifications.
This supports richer notification templates and more contextual messaging.
Ticket types can now define a default mailbox during ticket creation.
This provides additional control over ticket routing and mailbox selection.
One of the standout features from the episode, this enhancement makes Halo Integrator troubleshooting significantly easier.
Administrators can now filter logs by configuration ID, making it much simpler to locate and investigate integration runs.
For MSPs managing multiple integrations, this can dramatically reduce troubleshooting time.
Runbook variables can now be JSON-escaped before being passed to external systems.
This helps avoid formatting issues when sending structured data through APIs and automation workflows.
Configuration commit history will now display stored agent names consistently across linked instances.
A small but welcome improvement for organizations managing multiple Halo environments.
A new invoice merging method introduces additional customization options for invoice generation.
The hosts noted that this feature introduces significant complexity and should be thoroughly tested before being adopted in production billing processes.
The Self Service Portal now includes improvements for displaying service status information.
Organizations maintaining customer-facing status pages may benefit from improved visibility during outages and service disruptions.
Another major highlight from the episode.
Administrators can now clear stored OAuth tokens without recreating integrations.
Benefits include:
For anyone building custom integrations, this feature alone can save a significant amount of time.
Ticket column profiles can now display End User and Site-level custom fields.
This allows additional business data to be surfaced directly within ticket lists and views.
Runbook IDs can now be used as a filterable column within integration runbook views.
A small administrative improvement that makes locating specific runbooks easier.
New notification triggers can alert teams when tickets have been inactive for a specified period.
This may help identify tickets that have fallen through the cracks and improve follow-up processes.
Invoice creation now generates trace records that can be used for troubleshooting and diagnostics.
The hosts highlighted the importance of additional visibility into billing processes and invoice generation logic.
Software licence records can now display an end date column.
A straightforward improvement that provides better visibility into licence lifecycle information.
Ticket type groups can now be leveraged within change tracking functionality.
This complements broader improvements around ticket grouping and permissions management.
Automatic invoice reminders can now be configured directly within Halo.
This helps reduce manual collections work and provides a more consistent accounts receivable process.
Approval requests can now be automatically delegated when a user is marked out of office.
While relatively simple today, the hosts discussed how this may become increasingly valuable as Halo continues expanding its out-of-office functionality and approval workflows.

Episode 21 of By the [run]Book dives into the tail end of HaloPSA v2.214 and the first round of v2.216 updates, with Mendy and Connor unpacking practical MSP use cases, hidden configuration gotchas, and workflow improvements. Highlights include forecasting enhancements, category group restrictions, Datto RMM multi-tenancy, auditing improvements, ticket timer widgets, and advanced email handling settings that can dramatically impact service desk operations. This episode is especially useful for Halo administrators refining automation, billing accuracy, integrations, and technician workflows.
Watch Now: By the [run]Book: Episode 21
For easier tracking, check out haloreleases.remmy.dev to filter and search HaloPSA updates by ID, version, and keyword.
Forecasting in HaloPSA received a major usability improvement by automatically calculating forecasted hours from estimated project task time.
Category restrictions can now be controlled using Category Groups instead of manually configuring every category individually.
Agent Roles now support assigning cost values directly at the role level.
HaloPSA can now ignore “Unknown” scan status networks during Auvik imports.
X-Auto-Response-Suppress header to emails” can now be overridden using Action level configuration to enforce the headers when the global setting is not enabled | v2.216 #1085470 | 49:41Halo now allows email suppression headers to be configured at the Action level rather than only globally.
This setting keeps tickets selected after completing a bulk edit, allowing technicians to chain multiple bulk updates together without re-selecting tickets.
Mail Campaigns can now be grouped for organizational purposes.
Halo will now match imported Intune software records using software names instead of IDs.
Multiple Datto RMM integrations can now coexist within HaloPSA.
Halo can now automatically assign the mailbox used during outbound communication as the ticket’s default mailbox.
Snow imports now support dynamic asset type assignment.
Services can now have a separate portal-facing display name.
Asset booking functionality received multiple improvements.
The ticket timer can now be displayed as a dedicated widget on the ticket screen.
Agent Roles now support a cost field.
Ticket cloning can now be restricted to administrators.
Halo’s newer SSO framework continues to evolve.
Category restrictions can now be managed through Category Groups.
Forecasting received major usability improvements.
Audit tracking now includes Quotes and Purchase Orders.
Reporting Datasources can now display which reports rely on them.
HaloPSA now supports integration with Kaseya VSA X.
HaloPSA now integrates with SailPoint IdentityIQ.
Auvik imports can now exclude unknown scan results.
Changes to Customer Trading Names are now tracked in audit history.
Cost update logic now also supports markup calculations.
Quote approvals now support customizable messaging before signatures.
Time entry edits can now automatically rebalance contract and billed hours.
Halo introduced a safer device ID generation method.
bulkresponse=true can now be used when POSTs are made to the /fieldinfo endpoint to return a separate response for each object | v2.216 #1085574 | 47:46The /fieldinfo endpoint now supports bulk response handling.
Additional JWT validation can now be enforced for API authentication.
ConnectWise Automate alert closures can now map to configurable statuses.
X-Auto-Response-Suppress header to emails” can now be overridden using Action level configuration to enforce the headers when the global setting is not enabled | v2.216 #1085470 | 49:41Halo now supports overriding email suppression headers at the Action level.

Episode 20 of By the [run]Book dives into HaloPSA v2.214 with a mix of practical improvements and some quirky additions. Connor and Mendy walk through everything from new dollar variables and asset controls to Avalara fixes and portal enhancements—highlighting what actually matters for day-to-day MSP operations. This episode is especially useful for MSPs refining workflows, automation, and reporting accuracy in Halo.
Watch Now: By the [run]Book: Episode 20
For easier tracking, check out haloreleases.remmy.dev to filter and search HaloPSA updates by ID, version, and keyword.
Mendy and Connor noted this was very useful.
Highlighted during the user action demo as a practical workflow improvement.
Called out as a genuinely useful UI improvement.
Allows more flexibility in how incoming emails are matched to tickets.
Enables automation of asset configuration through API usage.
Introduces a new variable to output custom fields in Q&A format.
Improves visibility into asset changes over time.
Returns the email address of the user associated with a purchase order.
Enhances usability and visibility of search results in the portal.
Provides control over configuration synchronization.
Ensures correct popup behavior when multiple rules trigger.
Makes ticket source available for reporting and filtering.
Adds safeguards when configuring email matching tags.
Allows distribution lists to target all email addresses tied to a user.
Improves clarity in Avalara transaction records.
Adds control over visibility of user actions in the portal.
Improves flexibility when using Accounts and Prospects.
Enables dynamic fields based on asset lifecycle status.
Ensures asset tagging consistency during stock processes.
Adds control over Avalara synchronization scope.
Allows a predefined score for surveys.
Improves visibility when prorating billing items.
Automatically generates a ticket alongside sales orders.
Allows column width customization in list views.
Changes ordering of lists in the team view.
Adds asset status as a usable variable in buttons.
Improves flexibility when viewing lists.
Allows visual customization of buttons.
Enables distribution lists based on ticket criteria.
Adds control over forecast data ranges.
Enhances performance of Azure/Entra sync.
Improves visibility of ticket closure information.
Optimizes webhook performance and payload handling.
Refines permissions for asset management.