Cookies

We use analytics to see how the site is used so we can improve it.

Skip to content
Renada

Automate fixed fee billing so engineers can never skip the charge

A walkthrough for MSPs who charge flat fees for laptop setups, onboarding or offboarding and want HaloPSA to apply the charge automatically instead of relying on memory

17 December 2024 13 min watch Connor Fagan

The short version

This tutorial shows how Renada Solutions automates fixed fee billing in HaloPSA for things like laptop setups and onboarding fees. You will see how a custom ticket field, a workflow rule and a runbook combine to issue a product automatically, so engineers never forget to charge or accidentally double bill a contracted customer.

What you'll take away

  • A custom field drives the whole automation

    A single dropdown custom field called Fixed Fee Type, set on the ticket, is what the workflow rule watches for.

  • The runbook issues a product via the HaloPSA API

    An API action updates the ticket and issues an item using its product ID, with a fixed price and no cost attached.

  • Quantity shipped has to match quantity

    If you API in a product without setting quantity shipped to match quantity, HaloPSA marks it as not delivered.

  • You can't accidentally skip the charge

    Once the ticket type is set, the rule forces the product onto the ticket rather than leaving it to an engineer's memory.

  • Override the charge rate to avoid double billing

    Set fixed fee tickets to no charge, or clone workflow actions so engineers can't pick a charge type, otherwise a contracted customer could get billed twice for the same work.

  • Apply defaults on ticket type change

    If a ticket can convert into a fixed fee ticket midway through its life, remember to apply the no charge default or the automation may not behave correctly.

Key insights from the episode

  1. Create a custom single-selection dropdown field called Fixed Fee Type under Configuration, Custom Objects, Custom Fields.

  2. A workflow rule matches the custom field against values like laptop setup or desktop setup to trigger the automation.

  3. The runbook uses a Halo API action to update the ticket, issuing an item by its product ID with no cost, only a price.

  4. Quantity and quantity shipped must both be set to one in the API call, or the product shows as undelivered on the ticket.

  5. Set fixed fee ticket types to no charge so time still tracks but isn't billed against an agreement or invoiced separately.

  6. If a ticket can change into a fixed fee type mid workflow, apply the no charge default on that change or billing may break.

  7. Check your chart of accounts and tax rates align on the product before relying on this for QuickBooks Online or Xero sync.

Questions people actually ask

How do I set up fixed fee billing in HaloPSA?

Create a ticket type for fixed fee work, add a custom single-selection dropdown field to capture the fee type such as laptop setup, and build a workflow rule that matches that field to trigger a runbook. The runbook issues the relevant product to the ticket automatically via the HaloPSA API, so the charge is applied without an engineer having to remember to add it.

Why does HaloPSA show a product as not delivered after an API call?

If you issue a product through the API without setting quantity shipped to match the quantity, HaloPSA records it as undelivered. Manually added products default to delivered, but API-issued ones need quantity shipped set explicitly, usually to one for a single fixed fee item.

How do I stop engineers double billing a contracted customer in HaloPSA?

Set the charge rate on fixed fee ticket types to no charge, or clone the workflow actions so engineers cannot select a charge type at all. Without this, a break fix customer on contract could get billed both the fixed fee and remote or on-site support time for the same ticket.

Where do I find the product ID for a HaloPSA runbook action?

Open the product list and check the ID column, ignoring any leading zeros, or click into the product itself and read the item id value from the URL. That ID is what the runbook uses to issue the correct item to the ticket.

What's the difference between issuing a product manually and via a runbook in HaloPSA?

Issuing a product manually through the ticket's issue product option always marks it as delivered by default. Issuing it through a runbook or API call requires you to explicitly set quantity shipped, otherwise the ticket shows the item as undelivered even though it has been charged.

Can I use HaloPSA automations to apply fixed fees instead of a runbook?

Yes, a workflow action button can pop up the issue product screen for an engineer to pick manually, but this still relies on a human choosing the right product. Using a runbook to issue the product automatically removes that step and guarantees the charge is applied consistently.

Why is time tracking still useful on a no charge fixed fee ticket in HaloPSA?

Setting the charge rate to no charge stops the ticket from being invoiced or counted against an agreement, but engineers can still log their hours. This gives you accurate internal reporting on how long jobs like laptop setups actually take, without exposing that time to the customer as billable.

Full transcript

2,799 words

Read full transcript

Connor: Hello I'm Connor Fagan and welcome to 2024 another year of me being really inconsistent with making videos and I promise this year at some point I will cut my hair but with that being said you're here to understand how to do fixed fee billing inside of HaloPSA or at least I hope so because if not you might want to skip this video.

So what am I talking about well let's say you're an MSP and let's say that you charge laptop setup fees let's say you charge onboarding and offboarding fees but you're struggling with actually invoicing correctly for it. There's currently a lot of overhead where you have to manually remember to do it or you're having to quote upfront and it's a little bit arduous.

We see a lot I suppose and it kind of differs across the pond so in the UK I would say for the most part if we're charging a customer something we want to send out a quote first we want that quote to be accepted no hidden charges that type of thing. I would say across the pond though in America and Canada as well to be fair I see it quite frequently that your agreements will encapsulate you know there's always a fee for new device setups or onboarding or offboarding you and the customer have this relationship where you will just apply that charge every month and they'll kind of accept it and away you go. I'm not saying either way is right or wrong I'm just saying that is what I observe for the most part.

So how do we do it what does it look like and how does it work well let me jump into my Halo screen let me make this full screen not that one full screen this one full screen zoom in one more yeah I think that looks good enough.

So what have we done so what we do is we make a new ticket inside of HaloPSA we select the ticket type fixed fee and I'm going to type in here laptop setup and down at the bottom we have this custom field called fix fee type. Now don't get hung up on the fact you have to make a ticket for this don't get hung up that you have to make a custom field and select something just trust the process for the moment and I'm going to say this is a laptop setup that's going to apply a ticket rule to the ticket we'll cover that in a minute do not fear. And then we're going to submit the ticket and what that's going to do is that's going to queue a runbook run a runbook tell us that it applied successfully and it means I can then claim the ticket close the ticket and then I can go into invoicing ready for invoicing and you'll see here we have a laptop setup I can create the invoice for that and this will then invoice the customer that flat fee or fixed fee is how I've described it of £75 in my environment with the description laptop setup fee and all of the correct information with it.

So how have we done this and why have we done it this way well let's go through a little bit of what's actually happening and then I'll show you how we've done it. So this runbook here is essentially just issuing a product to the ticket. Now this isn't new information this is if you're an existing partner of ours this is the way I always recommended doing this. And I basically would say is hey if you've got a fixed fee for a ticket click the dots in the top right click issue product and then select the product from the list that will then apply the product and apply the charge and away you go.

Another way we've built it in the past is to you know change our workflow so we might have a form in our workflow that has an action button at the top the action button again pops up that issue product screen the engineer has to pick the product and away you go. I've never really liked it though it's always been like a you know it always comes with a with a clause and it's like yeah we can do it but this however I quite like this which is why I'm showing you how to do it.

Because we're defining at some level in Halo that this is going to happen you can't not issue this product yes you could go to products and you could you know edit it and remove it and do all of that but for the most part it's quite granular it's quite rigid. It's also me meaning sure that whenever we do a ticket of this nature and it could be driven from the self service portal it could be just handled as a part of a workflow of an automation before you know it could come in as an incident and you may have an option to make a fixed fee ticket or change it midway through there's so much control you could do with this but we've kept it really simple and really clean.

So I'm going to start with the runbook I'm going to show you how that's been built and as always there's going to be documentation in the description below. Quentin Robbie who's got to write that up in a minute but we are going to do that it's going to include basically what I've spoke about in this video but much more eloquently. So let's start with the runbook and let me show you what's happening and again this is this is really quite simple stuff we've not overbaked it for this demonstration but essentially we have a runbook called issue items. There's some spoilers in there so you don't get caught up on them yet not quite ready.

But essentially we have this very very very simple runbook the first runbook is a Halo API action to update the ticket and it's basically what it's doing is it's taking the ticket ID and it's issuing an item to it. Now the most important mechanism here is the item ID. Now the reason I say that and if I could just jump out of here very quickly is because if you use an accounting tool like QuickBooks Online like Xero you're going to want to make sure that your chart of accounts is aligned and you're going to want to make sure that you're taxing correctly. Much easier in the UK I must admit but we have a 50% spread now with America so I now have to worry about all that pain.

But essentially what it means is we can set up on here and I haven't in this environment but we could set up our tax rates we could set up our income and expense accounts we could make sure that this is going to be build to that customer correctly. Ignore the cost and pricing on here for now it's worthwhile doing it but we're having to manually override this I'll explain why in a minute but it's really important you have a product. If you're wondering where I'm getting the ID from where you see it's the ID in this column here ignore all the leading zeros or the the starting zeros. Alternatively click the product and you'll see in your URL it will say item ID equals and then the integer.

So going back to that runbook very quickly. Integrations integration runbook issue item flowchart we're saying issue the item with the ID 20 there is no cost associated with us on this there is labor or you know hours and man hours but don't worry about that for now. The price this is the important mechanism this is what we're going to be billing our customer. Quantity I'm just adding one and quantity shipped is also one. The reason I've added in quantity shipped one or matching the quantity here is because if you don't it'll say it's not been delivered.

Now if you add it in manually and I'll show you the product again in a second if you add it in manually it'll always say it's been delivered. But because we're having to you know API this in we're going to have to define that metric so quantity shipped is one and that is basically that we're just issuing a product defining some static values and away you go.

The next part in here is purely a success so what we like to do now whenever we're doing these integrations on a ticket we want to post back to the ticket to say it worked. And again all this JSON payload will be in the documentation and again it's posting back to the ticket and basically says that the fixed fee has been fixed fee has been applied. And essentially it's as simple as that. It then is either a success or a failure if it's failed it goes back to the start. And the reason we've done a success on unsuccessful here is because this is just a notification message it's not that important it can't get to this stage without actually being successful.

So let's issue in a product and then you'll see on the ticket that the product is here it has the cost and the price and you'll see that the delivery is been delivered one out of one which is what we're expecting.

So how does all this gel together Connor well we slow it down a little bit you'll see that when we make this we select the fixed fee ticket. Now this doesn't have to be this mechanism again you could handle this in many ways but what we basically said is it's fixed fee and we've made a custom field down here and then when we select something it starts a rule or applies or matches a rule. Now why does it apply or match that rule I hear you thinking in your heads well that is also super simple you'll get the name this video simple.

But essentially we say the rule is match this custom single drop down field and I'll show you that in a minute and if it includes laptop setup or desktop setup I want to start a new workflow and that workflow I've called fix feed laptop desktop. That workflow is simply applying that automation at the very start. The automation we've called issue item and essentially once that automation has run it will then move the ticket to the triage stage or the in progress stage depending on what you want to do with your workflow again super simple.

Workflow for those who don't know what automations are they're simply actions that are made quick some people would call them quick actions but I like to go around the houses so issue item and all that is literally doing on here is starting the webhook integration or runbook integration called issue item that is what I demonstrated a minute ago that is what's going to apply that product. And again you could really go to town with this you could do a lot more functionality with this we're just keeping it quite simple.

Now there is one last thing that I want to mention and that's on the ticket type itself if you go down this route my advice if you're doing this is one of two things actually. You either want to override the charge rate on the ticket to be no charge or clone the actions in the workflow and make it so your engineers can't actually pick a charge type. The reason that is is because of two things if you have a break fixed customer and this is left to defaults you could be charging for remote support or on-site support I.E your double billing for the ticket.

Or if they're in contract and the customer goes hey Connor how much time did we use in January you go oh you used 10 hours and they go cool can we have the breakdown so we so we know where we're at and then you go yeah five of those hours was building laptops they're going to turn around and go well Connor I thought we paid for all of those. Oh you do so why is it caught under our contract. Ah it shouldn't be that's why I do no charge here we can still track the time we're just not accounting it against either an invoice we're not billing for it or it's not being caught against the agreement and I think that's quite important.

The last thing you want to make sure you do is that you apply defaults whenever the ticket is changed to this type. In my build as of right now we've just seen this is not that important because the ticket type is created at the start but if you have an action that turns a ticket into this ticket or a child ticket spawns you're going to want to make sure that you apply the default the default being in this environment or this build the no charge. If you don't there's a chance that this won't work correctly.

And that's basically that we make a ticket we have a custom field which is a custom dropdown if you don't know how to make that again configuration custom objects custom fields we go to our second page I've made one down here called fixed fee just click new in the top right and it's just a single selection drop down with the values in it. And the reason we need that is because on the rule the rule is watching or checking for that field equaling something or containing that value and that's it.

That's how I now do fixed fee billing for customers that need it. I hope that's helped you I I I think this is quite a clean way of doing it I think this is quite a nice solution. It reduces error it reduces overhead. I could say it's a nice little automation just to you know help things along. But for me this works. If you have any questions put them in the comments below.

As always please do subscribe to us if you aren't already it really does help the channel grow I am aiming for that beautiful 1,000 subscribers this year and that's all down to you lovely people at home watching. And that's it I've been Connor Fagan we are Renada Solutions we are trust me. If there's anything else we can help with please let us know. Have a great day have a fabulous start to 2024 and I'll hopefully see you all soon take care bye-bye.

We've been working with Connor at Renada for as long as I've been here at Halo and I can't recommend him enough. One of our top technical consultancy partners and a gem to deal with in person. Looking forward to working with him and his team more in the future.
HaloPSA Google Logo

Our Core Services

Offering support to enable sustainable success for your organisation.

Consultation Harness the transformative potential of an agnostic advice tailored to your unique business needs. From PSA implementation to ongoing support, our exceptional consultation services pave the way for extraordinary success. Find out more
Virtual Admin Let us handle the technical heavy lifting. Our expert team builds solutions, creates powerful reports and dashboards, and develops automated integrations - giving you more time to focus on what matters most: your clients. Find out more
Product Onboarding We understand that the first steps in adopting a new product can be daunting, we are here to guide you through every stage of the process with precision and clarity. From initial setup to advanced features, maximise the value of your product from day one. Find out more
Virtual Chief Technology Officer (vCTO) Benefit from a remote and adaptable technology expert to seamlessly combine strategic guidance and effective leadership to propel your business to new heights and empower your organisation’s technology ability. Find out more
Where to next? Get the cutting-edge tools to support your MSP business. Contact us today to receive a bespoke quote tailored to your specific needs.