Laws for the Practical Technician

By  
Mendy Green
July 5, 2024
20 min read
Share this post

Over the years of training and assisting various technicians, I've formed a set of guidelines that I've been known to drill constantly. The other day while talking to a newer technician and working with them I realized that I now have the time I didn't have before to actually write down what I've been ranting about for 14 years. I've dubbed them as the Laws for the Practical Technician.

  1. Keep an open mind when approaching the problem and avoid falling back into the "End User" mindset
  2. Read and explore everything on the screen! Pay attention to what's being done and what its telling you
  3. Understand the problem at least as well as the person asking you for help
  4. Be intentional in your troubleshooting, closing your eyes and throwing darts at the wall is not helpful
  5. Question everything you think you know and are being told
  6. Always have a way out, make sure you can undo anything you do

There's a lot of nuance in each "law" so now that we got the TLDR version out of the way let's dive into the specifics. Note for the purposes of this post, each law has been given a title.

1. The "Technician" Mindset

Keep an open mind when approaching the problem and avoid falling back into the "End User" mindset

If you run around with your eyes closed expecting nothing to get in your way, you're bound to smack into a wall (or something) and fall down.  If you keep your eyes open and aware of your surroundings you can navigate the obstacles and overcome them.

End users typically expect systems to work seamlessly and view issues as problems needing external help. Technicians, on the other hand, approach systems with the expectation that things might not work and are prepared to "figure it out" each time.

Key Points:

  • Expect Issues: Approach every situation with the mindset that things might not work as expected. This keeps it fresh in your mind and allows you to figure out what should or should not be happening each time, and usually during that process you'll identify the disconnect that's causing the issue.
  • Problem-Solving Approach: View issues as challenges to be solved rather than insurmountable problems. This proactive mindset helps in finding creative solutions.
  • Context Matters: The difference in mindset is less about the person and more about the context! Everyone (for the most part) handles their own problems for their personal lives daily. The moment it becomes a work or tech issue suddenly its hands-off. Be aware of the context you're in, this affects Clients escalating to IT and IT escalating to a higher tier! Don't fall into the trap.

Example: When dealing with a software bug, an end user might see it as "broken" and wait for a fix. A technician, however, will explore various angles—checking logs, considering recent changes, and testing different scenarios to identify the root cause, or find a viable workaround

2. Read the Entire Screen

Read and explore everything on the screen! Pay attention to what's being done and what its telling you

Computers and software are designed to be used, (it's actually the only way they make money!). Therefore, the information needed to operate or troubleshoot them is generally available on the screen or in logs, (although the language can be context-specific for the industry). To effectively identify and solve issues, it's crucial to explore the interface and ask questions. Thoroughly reading on-screen messages and prompts can provide insights into what might be wrong and how to address it.

When encountering an error message or unexpected behavior, don’t rush to conclusions, AND DO NOT SKIP IT! 

Instead, read all the details provided. Error codes, system messages, and even seemingly minor details can offer significant clues. For instance, a message that seems obscure at first glance might make sense when considered within the context of the application or system you're working on. Even comparing against a computer that is working, looking for differences in behavior, or order of operations, screen activity, and so on, can provide clues (for example an error that takes a while to appear is likely caused by a timeout, vs an error that appears immediately is likely caused by an immediate rejection).

Example: If a user reports an issue with a software application crashing, instead of just noting "application crashes," you should read any error messages, logs, or system prompts that appear when the crash occurs. These details can guide you towards understanding the root cause and potential fixes.

3. Understand the Problem

Understand the problem at least as well as the person asking you for help

To effectively troubleshoot, ensure you can recreate the problem and understand its significance. Start by asking the person reporting the issue why it's a problem and why it's important to solve it. Gather as much information as possible to understand all sides of the issue. You should be able to understand the problem at least as well as the person reporting it to you, otherwise how do you expect to fix it? Or even explain it to the next escalation point if you have to reach out for help?

Here are some ways you can work to understand the problem.

  • Recreate the Problem: Attempt to replicate the issue in your environment. This step is the best option because it allows you to see the problem firsthand and understand its nuances, at the same time as testing to see if its a problem with their computer only or a wider issue. You can also choose to recreate the problem on a different system, if it requires specific applications or files you don't have on your computer directly.
  • Understand the Impact: Determine why the issue is significant. Is it causing data loss, preventing critical operations, or just a minor inconvenience? Understanding the impact helps prioritize the issue and communicate its importance to others.
  • Gather Detailed Information: Ask the user detailed questions about the problem. When did it start? What were they doing when it occurred? Has anything changed recently (e.g., new software, updates, hardware changes)? What's normally supposed to happen?
  • Prepare for Escalation: If you cannot resolve the issue, you might need to escalate it to a vendor or higher-level support. Having detailed information and a clear understanding of the problem will make this process smoother and more effective.

Example: If a user cannot access a shared network drive, ask them about any recent changes to their system, any specific error messages they receive, and how critical this access is to their work. Look at what the shared drive is mapped to, and if other people have access to it that are working. Identify the network the user who is complaining about is on and if it has connectivity to the shared drive host. This comprehensive understanding allows you to troubleshoot more effectively and escalate if needed.

4. Be Intentional

Be intentional in your troubleshooting, closing your eyes and throwing darts at the wall is not helpful

Being intentional in your actions means making deliberate, thoughtful decisions rather than taking random stabs at fixing an issue. This approach prevents exacerbating the problem and leads to more efficient troubleshooting. Most technicians below Tier 3 will perform troubleshooting by way of "trying different thing to see what works", this is essentially closing your eyes and trying to pin the tail on the donkey, make sure you understand what is going on, and the logical reason why what you're attempting will affect (either negatively or positively) the current outcome so that you can make progress with every step.

Expand on This:

  • Map out the "Attack" Chain: Before diving into fixing an issue, outline the Chain that exists to allow the system you're troubleshooting to work during normal behavior. What are the potential areas for disconnect? What steps will you take to test that the chain is working throughout?
  • Progress is Progress (both good and bad): Any change in outcome is desired, as it'll help provide information about the underlying behavior that we don't have visibility into. Look for error messages, success messages, timers, lags and so on. No detail is too small.
  • Evaluate and Adjust: After each step, evaluate whether it has brought you closer to resolving the issue. Adjust your approach based on these evaluations.

Example: If a printer isn’t working, don’t randomly try different fixes like restarting the printer, reinstalling drivers, or changing settings. Instead, follow a logical sequence—check for error messages to help point you towards a connection issue or a driver issue.

5. Question Assumptions

Question everything you think you know and are being told.

Always be prepared to reassess what you know. Technology and systems evolve, and what was true yesterday might not hold today. Keeping an open mind and questioning assumptions can lead to discovering the true cause of an issue.

Expand on This:

  • Expect to be wrong all the time: When you're right about something there's no reason to go back and check because you know you're right. If you're wrong about something then you'll be looking to validate that you are wrong, or what the right answer is. This mindset helps keep your knowledge fresh and reminds you to double check everything you think you know or are being told.
  • Seek Out Information: Be proactive in seeking out new information and learning from others. Forums, user groups, and official documentation can offer insights you might not have considered. Often times all it takes to help find the answer is asking the question, not to the person next to you, but even to yourself! Use the Rubber Duck method if you need to.

Example: If a network issue arises, don’t assume it’s due to the same cause as last time. Reevaluate the situation - start the troubleshooting process from scratch everytime until you've identified the root cause to the be the same as last time.

6. Never Do Something You Can't Undo

Always have a way out, make sure you can undo anything you do

Always have a contingency plan before making changes. Ensure that any action you take can be reversed if it doesn’t resolve the issue or causes new problems.

Expand on This:

  • Backup First: Before making destructive changes, find a way to keep a good copy of what you're changing. This ensures that you can revert back if needed.
  • Test Changes: Where possible, test changes in a controlled environment before applying them to the live system.
  • Document Reversible Steps: Ensure that every action you take can be undone. Document the steps if necessary so you can revert configurations and settings.

Example: Before modifying a system registry, backup the registry or export the key in question. Rename something instead of deleting it, or cut/paste it somewhere else. This way, if the change has unintended consequences, you can easily revert to the previous state.

----

Edit 2024/11/13 | This article has been presented and recorded at The IT Nation Connect 2024 in Orlando, Florida! You can watch it here: https://youtu.be/ZJqhT48pnLU

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...
May 26, 2026
8 min read

By the [run]Book: Episode 22

HaloPSA v2.216 delivers several impactful improvements for MSPs, including new SLA-aware database functions, enhanced integrator troubleshooting tools, OAuth token refresh controls, improved sensitive ticket permissions, and expanded invoicing flexibility. Episode 22 continues reviewing features in 2.216 while highlighting the changes that will have the biggest day-to-day operational impact.
Read post

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.

Important Mentions

New database functions have been added to be used to calculate time between dates | v2.216 #1083601 | 2:17

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.

  • Enables SLA-aware reporting calculations.
  • Accounts for working hours, holidays, and SLA calendars.
  • Simplifies SQL reporting that previously required complex logic.
  • Particularly useful for custom reports and analytics.

Why it matters: MSPs building advanced reporting can now calculate true business time rather than relying on raw SQL date math.

Added two additional options to the tickets setting 'Sensitive Ticket restrictions' | v2.216 #1056127 | 22:45

Sensitive tickets gain more granular visibility controls.

  • Additional restrictions for end-user visibility.
  • Additional restrictions for agent visibility.
  • Better handling of confidential or executive-level requests.
  • Improves internal governance and privacy controls.

Why it matters: MSPs supporting executive teams or handling confidential projects gain stronger access controls.

Integrator log columns ID and config ID are now filterable | v2.216 #1039846 | 33:06

Connor and Mendy highlighted this as one of the most valuable operational improvements in the release.

  • Makes troubleshooting Halo Integrator jobs significantly easier.
  • Allows administrators to filter logs by specific integration configuration.
  • Simplifies debugging failed syncs.
  • Reduces time spent searching through large log files.

Why it matters: Faster troubleshooting means less downtime and quicker resolution when integrations fail.

Custom integrations that use OAuth 2.0 now have a button to clear the access/refresh tokens, allowing permissions to be refreshed | v2.216 #1029548 | 45:49

This feature received strong praise from both hosts.

  • Allows OAuth tokens to be cleared without recreating integrations.
  • Makes permission testing much easier.
  • Eliminates the need to duplicate integrations during troubleshooting.
  • Simplifies development and integration configuration work.

Why it matters: Anyone building custom integrations or working with APIs will immediately appreciate the time savings.

Full Feature List

New database functions have been added to be used to calculate time between dates | v2.216 #1083601 | 2:17

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.

When using the new storage data method, Text custom fields will now be extended up to 1000 characters | v2.216 #1083130 | 4:36

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 has been added to the menu options at Configuration > Tickets, as well as being added to the Action configuration | v2.216 #1082462 | 6:08

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.

Quotes will no longer be automatically expired if they have a Status that is either used as "Closed" or "Accepted" | v2.216 #1080343 | 7:32

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.

Added a new Mail Campaign Type: Nurture Campaign - Scheduled | v2.216 #1080219 | 8:29

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.

You can now use $ChatTranscript on a Ticket at any time when there is a linked Chat with a User | v2.216 #1079619 | 10:21

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.

Added $_INVOICELONGDESC to the available variables that can be used during pro-rata creation | v2.216 #1079617 | 10:57

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.

Added a setting to only apply date validation upon creation of entities | v2.216 #1075315 | 14:40

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.

Added the permission "Can Override Device Change Who" | v2.216 #1072389 | 15:23

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.

Added the option "Visible - Read Only" to asset type system field settings | v2.216 #1069805 | 17:05

Asset system fields can now be configured as visible while remaining read-only.

This helps expose important information to users without allowing accidental edits.

Added a setting to enable customer specific agreement reference generation | v2.216 #1068707 | 17:22

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.

It is now possible to enforce uniqueness for asset fields per asset type | v2.216 #1067257 | 18:28

Asset custom fields can now be configured to require unique values.

This is particularly useful for:

  • Serial numbers
  • Asset tags
  • External identifiers
  • Device reference numbers

It helps improve data quality and prevents duplicate asset records.

Sage Intacct Entity mapping defaults and manual settings are now available across more entities | v2.216 #1062134 | 19:10

Sage Intacct mapping capabilities have been expanded to additional entities.

This improves flexibility for organizations integrating HaloPSA with Sage Intacct accounting workflows.

You can now map Halo Custom Fields to Sage Intacct fields where mappings are available | v2.216 #1062129 | 20:34

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.

Added a setting to Users Settings > Defaults to determine if a new Users' username should be set to their Email or not if there is already a User at the Site with the same Username | v2.216 #1060115 | 20:46

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.

Added two additional options to the tickets setting "Sensitive Ticket restrictions" | v2.216 #1056127 | 22:45

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:

  • Executive requests
  • HR-related tickets
  • Confidential projects
  • Restricted internal discussions
Added settings to group by Agent Status in the Treeview, and to show a grouping of Agents by Status to Ticket Areas | v2.216 #1056112 | 25:43

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.

Added a setting for Asset Custom Buttons to disable the runbook queued confirmation popup | v2.216 #1054838 | 26:19

Asset custom buttons can now suppress the runbook queue confirmation message.

A small but useful quality-of-life improvement for heavily automated workflows.

Added a Chat flow action which can retrieve data from the User's browser local storage and map to Ticket or Chat Custom Fields | v2.216 #1054416 | 26:40

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.

Allowed non-integer IDs for multi-select custom fields | v2.216 #1054352 | 28:54

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.

Added new $ variables for Client Mention notifications | v2.216 #1045900 | 30:07

Additional variables have been added for Client Mention notifications.

This supports richer notification templates and more contextual messaging.

Added "Mailbox" field to Ticket Types to allow Agents to set the default mailbox when creating new Tickets | v2.216 #1044902 | 32:28

Ticket types can now define a default mailbox during ticket creation.

This provides additional control over ticket routing and mailbox selection.

Integrator log columns ID and config ID are now filterable | v2.216 #1039846 | 33:06

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.

Variables used in Runbooks can now be JSON escaped using the following format - ##jsonstringify##<<ticket^example_field>>##/jsonstringify## | v2.216 #1037026 | 38:42

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.

In the config commit list view, agent names will now display the stored name for consistency across instances | v2.216 #1032902 | 39:54

Configuration commit history will now display stored agent names consistently across linked instances.

A small but welcome improvement for organizations managing multiple Halo environments.

Added the v2 invoice merging method to allow more customisable merging options | v2.216 #1032275 | 40:15

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.

Service status improvements to the Self Service Portal | v2.216 #1031911 | 42:27

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.

Custom integrations that use OAuth 2.0 now have a button to clear the access/refresh tokens, allowing permissions to be refreshed | v2.216 #1029548 | 45:49

Another major highlight from the episode.

Administrators can now clear stored OAuth tokens without recreating integrations.

Benefits include:

  • Easier permission testing
  • Faster troubleshooting
  • Reduced integration rebuilds
  • Simpler development workflows

For anyone building custom integrations, this feature alone can save a significant amount of time.

You can now use End Users and Site level Custom Fields on Ticket Column Profiles | v2.216 #1029518 | 47:36

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.

Added runbook ID as a filterable column on the integration runbook list view | v2.216 #1029237 | 48:32

Runbook IDs can now be used as a filterable column within integration runbook views.

A small administrative improvement that makes locating specific runbooks easier.

Add new Ticket Notification triggers for when there have been no Actions on a ticket for X hrs/days | v2.216 #1021268 | 48:48

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.

A database table has been added named "InvoiceCreationTrace" that will be used to record what happened during Invoice creation from the Ready For Invoicing lists | v2.216 #1013403 | 49:49

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.

Added an end date column for software licences | v2.216 #1013163 | 51:38

Software licence records can now display an end date column.

A straightforward improvement that provides better visibility into licence lifecycle information.

Added ticket type groups to change tracking | v2.216 #1009333 | 51:47

Ticket type groups can now be leveraged within change tracking functionality.

This complements broader improvements around ticket grouping and permissions management.

You can now set automatic invoice reminders | v2.216 #1008361 | 54:10

Automatic invoice reminders can now be configured directly within Halo.

This helps reduce manual collections work and provides a more consistent accounts receivable process.

Added a setting 'approval delegation when out of office' to user settings | v2.216 #1005500 | 55:47

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.

May 12, 2026
8 min read

By the [run]Book: Episode 21

Episode 21 of By the [run]Book covers the final features from HaloPSA v2.214 and the start of v2.216, including major improvements to forecasting, category restrictions, auditing, integrations, email handling, and technician workflows. Mendy and Connor break down practical MSP use cases, hidden configuration risks, and operational tips for getting the most out of the latest Halo updates.
Read post

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.

Important Mentions

Improvements to forecasting | v2.214 #701659 | 31:48

Forecasting in HaloPSA received a major usability improvement by automatically calculating forecasted hours from estimated project task time.

  • Forecasting no longer requires manual hour entry
  • Project workload visibility becomes much more accurate
  • Helps service managers better plan technician capacity
  • Forecast data now updates directly from project task estimates
  • Significant quality-of-life improvement for project management workflows
  • Connor and Mendy discussed how this reduces one of the biggest pain points in Halo forecasting
Added the option to restrict categories by Category Group | v2.214 #775657 | 25:12

Category restrictions can now be controlled using Category Groups instead of manually configuring every category individually.

  • Simplifies ticket category management
  • Reduces administrative overhead for large environments
  • Makes workflow restrictions easier to maintain
  • Particularly valuable for MSPs with heavily customized workflows
  • Eliminates the need for repetitive category-by-category exclusions
  • Called out as a “massive” operational improvement during the episode
Added cost field to Agent Roles | v2.214 #831614 | 19:55

Agent Roles now support assigning cost values directly at the role level.

  • Enables profitability reporting without exposing exact technician salaries
  • Supports role-based costing models (Tier 1, Tier 2, etc.)
  • Improves margin reporting and service profitability calculations
  • Useful for MSPs standardizing labor costing across teams
  • Creates cleaner operational reporting structures
An option has been added to the Auvik Network import to ignore Networks with a Scan Status of “Unknown” | v2.216 #1093288 | 38:56

HaloPSA can now ignore “Unknown” scan status networks during Auvik imports.

  • Prevents unnecessary or incomplete network objects from syncing into Halo
  • Keeps asset inventories cleaner and easier to manage
  • Reduces noise from partially discovered or transient network devices
  • Particularly useful in large or segmented network environments
  • Helps improve data quality inside configuration management
The global setting for “Add 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:41

Halo now allows email suppression headers to be configured at the Action level rather than only globally.

  • Provides granular control over automatic reply suppression
  • Useful for limiting noisy out-of-office or acknowledgment emails
  • Allows specific actions to suppress responses without affecting all outbound email
  • Helps balance automation control with email reliability
  • Connor and Mendy strongly cautioned MSPs to test carefully, as improper configuration can unintentionally suppress legitimate responses or acknowledgements

Full Feature List

Added a Ticket setting that allows users to retain their selected tickets after completing a bulk edit | v2.214 #965079 | 1:38

This setting keeps tickets selected after completing a bulk edit, allowing technicians to chain multiple bulk updates together without re-selecting tickets.

  • Helpful during ticket cleanup or spam management workflows
  • Reduces repetitive selection actions during mass updates
  • Mendy and Connor discussed using closure categories plus automation rules to handle spam/noise tickets more effectively
You can now create Mail Campaign Groups | v2.214 #963652 | 4:44

Mail Campaigns can now be grouped for organizational purposes.

  • Primarily improves filtering and categorization
  • Useful for separating marketing, advisories, announcements, and service notifications
  • Current functionality is mostly organizational rather than operational
Asset software imported from Intune will now match to existing records based on the software's name instead of the ID | v2.214 #951596 | 8:01

Halo will now match imported Intune software records using software names instead of IDs.

  • Reduces duplicate software entries
  • Improves consistency during synchronization
  • Important for MSPs maintaining clean software inventories
The Datto RMM integration is now multi-tenanted | v2.214 #950768 | 8:38

Multiple Datto RMM integrations can now coexist within HaloPSA.

  • Particularly useful during mergers and acquisitions
  • Supports phased RMM migrations
  • Allows separate Datto environments to operate simultaneously
A setting has been added so that when sending an email from a Ticket that does not have a default mailbox set, the mailbox used will become the default | v2.214 #948587 | 10:16

Halo can now automatically assign the mailbox used during outbound communication as the ticket’s default mailbox.

  • Helps avoid orphaned mailbox references
  • Useful when old mailboxes are retired or renamed
  • Connor recommended caution to avoid unexpected mailbox switching behavior
Added the ability to determine the asset type for assets imported from Snow in via rules or from a field value | v2.214 #898813 | 13:01

Snow imports now support dynamic asset type assignment.

  • Asset types can be determined through rules or imported values
  • Aligns Snow behavior with more mature integrations
  • Improves asset categorization accuracy
Added a portal display name to services | v2.214 #897912 | 13:57

Services can now have a separate portal-facing display name.

  • Allows internal naming conventions to differ from customer-facing labels
  • Useful for client-specific service structures
  • Keeps portal terminology cleaner and more user friendly
Asset resource booking improvements | v2.214 #859017 | 15:35

Asset booking functionality received multiple improvements.

  • Added support for custom booking date ranges
  • Improves scheduling flexibility for shared assets
  • More relevant for internal IT and education environments managing loaner equipment
Added the option to have the ticket timer be a ticket details widget | v2.214 #832771 | 16:33

The ticket timer can now be displayed as a dedicated widget on the ticket screen.

  • Makes timers more visible to technicians
  • Allows SLA countdowns and timers to coexist in the widget area
  • Improves UI flexibility in the newer ticket layout
Added cost field to Agent Roles | v2.214 #831614 | 19:55

Agent Roles now support a cost field.

  • Helps MSPs model technician profitability at the role level
  • Useful when organizations avoid exposing exact technician salaries
  • Supports broader margin reporting strategies
Added the ticket setting “Only allow admins to clone tickets” | v2.214 #798650 | 22:22

Ticket cloning can now be restricted to administrators.

  • Prevents accidental ticket duplication
  • Reduces operational mistakes from inexperienced agents
  • Adds additional governance controls to ticket workflows
Further improvements to the new single sign-on functionality | v2.214 #795061 | 22:59

Halo’s newer SSO framework continues to evolve.

  • Supports multiple identity providers
  • Includes generic OIDC support
  • Useful for organizations centralizing authentication across systems
Added the option to restrict categories by Category Group | v2.214 #775657 | 25:12

Category restrictions can now be managed through Category Groups.

  • Simplifies ticket categorization controls
  • Reduces manual maintenance effort
  • Particularly useful in complex workflow environments
Improvements to forecasting | v2.214 #701659 | 31:48

Forecasting received major usability improvements.

  • Forecast values can now calculate automatically from estimated time
  • Removes previous manual forecasting workflows
  • Better visibility into future technician workload planning
Quotes & Purchase Orders are now audited | v2.214 #656127 | 36:34

Audit tracking now includes Quotes and Purchase Orders.

  • Improves accountability and historical visibility
  • Helps track changes made to financial records
  • Valuable for operational compliance and approvals
Reporting Datasources now show dependent reports | v2.214 #579888 | 36:53

Reporting Datasources can now display which reports rely on them.

  • Makes reporting maintenance significantly easier
  • Helps prevent accidental datasource changes
  • Useful for MSPs with large reporting libraries
Kaseya VSA X integration is now available | v2.214 #485469 | 37:02

HaloPSA now supports integration with Kaseya VSA X.

  • Expands RMM integration options
  • Useful for MSPs transitioning platforms
  • Adds support for newer Kaseya environments
SailPoint IIQ integration is now available | v2.216 #977581 | 38:09

HaloPSA now integrates with SailPoint IdentityIQ.

  • Supports identity and access management workflows
  • Useful for security-focused organizations
  • Extends enterprise authentication integrations
An option has been added to the Auvik Network import to ignore Networks with a Scan Status of “Unknown” | v2.216 #1093288 | 38:56

Auvik imports can now exclude unknown scan results.

  • Reduces clutter from incomplete discoveries
  • Keeps asset inventories cleaner
  • Helpful for noisy or segmented networks
Customer Trading Name (Third Party Name) is now audited | v2.216 #1091545 | 39:58

Changes to Customer Trading Names are now tracked in audit history.

  • Improves visibility into customer record changes
  • Supports accountability and compliance
  • Helpful during mergers, acquisitions, or rebranding
The setting to control how updating Cost affects Price or Margin has been updated to also work for Markup | v2.216 #1091171 | 40:11

Cost update logic now also supports markup calculations.

  • Improves pricing consistency
  • Helps maintain profitability models
  • Useful for organizations standardizing markup workflows
An option (button) has been added to the Quote approval fields to allow a custom message to be shown before the signature input | v2.216 #1088692 | 41:47

Quote approvals now support customizable messaging before signatures.

  • Adds additional instructions or disclaimers
  • Improves customer communication during approvals
  • Supports branded or compliance-focused messaging
A setting has been added that, when enabled, will balance the Contract and Billed hours when editing time entries | v2.216 #1087347 | 43:01

Time entry edits can now automatically rebalance contract and billed hours.

  • Helps maintain billing consistency
  • Reduces manual recalculation work
  • Connor and Mendy recommended caution until behavior is fully validated
A setting has been added to Advanced Configuration to allow the Device table IDs to be generated using a new method to avoid errors when adding devices in multiple threads | v2.216 #1086633 | 45:22

Halo introduced a safer device ID generation method.

  • Prevents ID reuse issues
  • Helps avoid asset mismatches after reimports
  • Important for large-scale asset synchronization workflows
The parameter 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:46

The /fieldinfo endpoint now supports bulk response handling.

  • Simplifies API integrations
  • Improves parsing of large object sets
  • Helpful for developers building advanced Halo integrations
JWT assertion can now be required as an extra security measure for Halo API applications using client credentials flow | v2.216 #1085535 | 48:04

Additional JWT validation can now be enforced for API authentication.

  • Improves API security posture
  • Aligns with stricter enterprise security requirements
  • Supports more secure client credential flows
The status to be used for Alert closures from ConnectWise Automate can now be chosen on the Alert configuration of the Integration | v2.216 #1085481 | 49:32

ConnectWise Automate alert closures can now map to configurable statuses.

  • Improves alert workflow handling
  • Adds flexibility for automation-driven ticket closures
  • Helps standardize service desk processes
The global setting for “Add 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:41

Halo now supports overriding email suppression headers at the Action level.

  • Gives more granular control over automatic reply handling
  • Useful for preventing noisy auto-responses
  • Mendy and Connor strongly cautioned MSPs to test thoroughly before enabling globally

April 28, 2026
8 min read

By the [run]Book: Episode 20

Episode 20 of By the [run]Book covers HaloPSA v2.214, highlighting practical updates across automation, integrations, and user experience. Key discussions include new dollar variables, improvements to Azure sync performance, and better control over portal actions. A great watch for MSPs looking to streamline workflows and get more out of their Halo setup.
Read post

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.

Important Mentions

Added ALLFIELDSCFQA dollar variable | v2.214 #1063336 | 5:48

Mendy and Connor noted this was very useful.

  • Outputs custom fields only in Q&A format
  • Perfect for onboarding/offboarding forms and portal submissions
  • Cleaner and more usable than dumping all fields
You can now hide user action on the customer portal | v2.214 #1034684 | 18:22

Highlighted during the user action demo as a practical workflow improvement.

  • Lets you use user actions via links without exposing buttons
  • Keeps portal UI clean for end users
  • Key for form-style workflows using “Link to User Action”
Added the ability to set colours for custom buttons | v2.214 #997636 | 44:35

Called out as a genuinely useful UI improvement.

  • Helps visually distinguish important actions
  • Improves technician usability in busy workflows
  • Small change, but high day-to-day impact

Full Feature List

Start and end email subject matching tags have been added to the site "Email Matching" configuration that allows an alternate matching ID to be used | v2.214 #1064486 | 3:57

Allows more flexibility in how incoming emails are matched to tickets.

  • Useful when third-party systems modify or strip subject tags
  • Enables alternate identifiers beyond the default ticket ID
  • Be cautious of misconfiguration causing duplicate tickets
Added the ability to an apply a template to an Asset via the API | v2.214 #1063514 | 5:23

Enables automation of asset configuration through API usage.

  • Apply standardized templates programmatically
  • Useful for onboarding and asset lifecycle automation
  • Reduces manual setup for large asset imports
Added ALLFIELDSCFQA dollar variable | v2.214 #1063336 | 5:48

Introduces a new variable to output custom fields in Q&A format.

  • Outputs only custom fields instead of all ticket data
  • Cleaner formatting for forms and structured data
  • Ideal for onboarding/offboarding workflows
Added More Asset System Fields to Device Change Tracking | v2.214 #1057703 | 9:08

Improves visibility into asset changes over time.

  • Expands audit tracking for asset updates
  • Useful for compliance and troubleshooting
  • Better lifecycle visibility for managed devices
Added new $-POUSEREMAILADDRESS variable | v2.214 #1054124 | 9:20

Returns the email address of the user associated with a purchase order.

  • Useful for billing and procurement workflows
  • Helps automate communications tied to POs
  • Reduces manual lookup of requester details
Various improvements to searching in the self-service portal | v2.214 #1054111 | 9:29

Enhances usability and visibility of search results in the portal.

  • Displays result counts across categories
  • Returns more granular service-related results
  • Helpful for large or complex service catalogs
Added a setting to prevent configuration changes being pushed into an instance | v2.214 #1052480 | 12:22

Provides control over configuration synchronization.

  • Prevents unintended overwrites in managed environments
  • Useful for multi-instance or partner-managed setups
Improved the accuracy of popup notification displays when multiple rules match at once | v2.214 #1048194 | 12:33

Ensures correct popup behavior when multiple rules trigger.

  • Reduces confusion from conflicting notifications
  • Improves reliability of rule-based alerts
Added Ticket Source to the Query Builder | v2.214 #1047023 | 13:24

Makes ticket source available for reporting and filtering.

  • Improves reporting on ticket intake channels
  • Helps analyze email vs portal vs API usage
Added validation when setting email start and end tags in Email Configuration | v2.214 #1043864 | 13:37

Adds safeguards when configuring email matching tags.

  • Prevents invalid or risky configurations
  • Helps avoid ticket parsing issues
Distribution Lists can now be configured to send emails to all email addresses associated with a user | v2.214 #1040191 | 17:03

Allows distribution lists to target all email addresses tied to a user.

  • Improves communication coverage for users with multiple emails
  • Useful for shared inboxes or alias-heavy environments
  • Reduces missed notifications
Transactions in Avalara will now be created with the customer name as the customer code | v2.214 #1038916 | 17:52

Improves clarity in Avalara transaction records.

  • Replaces less meaningful IDs with readable customer names
  • Simplifies reconciliation and reporting
  • Reduces confusion during billing audits
You can now hide user action on the customer portal | v2.214 #1034684 | 18:22

Adds control over visibility of user actions in the portal.

  • Keeps portal UI clean for end users
  • Still allows backend workflows to use the action
  • Ideal for link-based or automated user actions
In User settings, you can now hide the Top Level field on Account records. Additionally, you can set a default Top Level value for Account records | v2.214 #1032938 | 27:48

Improves flexibility when using Accounts and Prospects.

  • Allows separation of accounts from standard client hierarchy
  • Supports better reporting segmentation
  • Useful for sales pipelines and CRM-style setups
You can now use the status field on an asset for dynamic field visibility on assets | v2.214 #1032001 | 30:05

Enables dynamic fields based on asset lifecycle status.

  • Show/hide fields depending on asset state
  • Useful for decommissioned or retired assets
  • Improves data relevance and UI clarity
Added option to make Asset Tag mandatory when creating serialised assets during consignment or adding stock | v2.214 #1031510 | 31:02

Ensures asset tagging consistency during stock processes.

  • Prevents incomplete asset records
  • Improves inventory accuracy
  • Helpful for asset-heavy MSPs
You can now choose which entities get committed when syncing to Avalara | v2.214 #1027858 | 32:15

Adds control over Avalara synchronization scope.

  • Reduces unnecessary sync data
  • Improves performance and clarity
  • Useful in complex billing environments
Added the ability to set the default score on Satisfaction Survey | v2.214 #1027560 | 32:24

Allows a predefined score for surveys.

  • May simplify reporting setups
  • ⚠️ Can skew satisfaction metrics if misused
  • Generally less useful than one-click feedback
The Prorating date will now show when adding Products from a Sales Order to a Recurring Invoice | v2.214 #1024043 | 34:23

Improves visibility when prorating billing items.

  • Shows when proration is applied
  • Helps validate recurring billing accuracy
  • Reduces billing confusion
A setting has been added to Sales Order Configuration so that when a Sales Order is created a Ticket is also created for the purpose of admin tasks and communication | v2.214 #1021351 | 37:06

Automatically generates a ticket alongside sales orders.

  • Provides a workspace for admin and communication
  • Useful when not using Opportunities as the workflow driver
  • Helps track fulfillment tasks
You can now set a default width for columns on column profiles | v2.214 #1019311 | 38:19

Allows column width customization in list views.

  • Helps standardize layouts across teams
  • Uses pixel-based values
  • ⚠️ Less flexible than expected (manual configuration required)
A setting has been added to View configuration to show custom lists above the Teams in the "By Team" view | v2.214 #1015344 | 40:01

Changes ordering of lists in the team view.

  • Allows prioritization of key lists
  • Minor UI improvement
  • Alternative is restructuring list hierarchy
Added Asset Status variable for Asset Custom Buttons | v2.214 #1011860 | 41:32

Adds asset status as a usable variable in buttons.

  • Enables dynamic integrations or links
  • Useful for query-based actions
  • Supports more advanced automation
Default column profiles against an entity now allows for changing the column profile view in lists | v2.214 #1009740 | 42:46

Improves flexibility when viewing lists.

  • Users can temporarily override default column profiles
  • Reverts back after refresh
  • Reduces friction when switching contexts
Added the ability to set colours for custom buttons | v2.214 #997636 | 44:35

Allows visual customization of buttons.

  • Improves UI clarity and usability
  • Helps highlight important actions
  • Particularly useful in busy workflows
Added a new type of Distribution Lists where its Members are made up of Tickets | v2.214 #996443 | 45:34

Enables distribution lists based on ticket criteria.

  • Send communications based on ticket conditions
  • Useful for alerts or incident updates
  • Adds dynamic targeting capabilities
Added the ability to set upper and lower bounds for data in forecast outputs | v2.214 #995797 | 46:16

Adds control over forecast data ranges.

  • Improves reporting accuracy
  • Helps constrain projections
  • Useful for financial planning
Azure Delta improvements | v2.214 #982118 | 46:53

Enhances performance of Azure/Entra sync.

  • Reduces load by syncing only changed records
  • Improves performance in large environments
  • Speeds up nightly sync operations
Closure details will now expand by default | v2.214 #982083 | 52:51

Improves visibility of ticket closure information.

  • Saves clicks when reviewing closed tickets
  • Useful for QA and auditing
  • Minor UX enhancement
Minor webhook performance improvements | v2.214 #979558 | 54:22

Optimizes webhook performance and payload handling.

  • Reduces payload size with lightweight options
  • Improves integration efficiency
  • Helps avoid unnecessary data transfer
Improvements to asset access control | v2.214 #968048 | 56:11

Refines permissions for asset management.

  • Better control over who can edit asset types/groups
  • Adds restrictions at role and agent level
  • Improves security and governance