Hello Tony,
My name is Miciah, a Certified ServiceM8 Partner and part of what my team does also is work with ServiceM8's API to develop custom solutions to augment ServiceM8 to fit unique workflows which ServiceM8 does not natively support.
Your situation is actually common and has been brought up a few times in the past.
While we could definitely look at a custom solution, there may be a fairly "native" workflow available to explore first. Assuming you are integrated with an accounting package (such as QuickBooks Online), you could take payment for the discounted package of services, and then apply that payment to their Customer record in the accounting package to where their record shows they have a credit available. Then when then have a Job which can use all or a portion of that credit, when you send the Invoice from ServiceM8 you can use that credit to pay for all or a portion of the Invoice. Granted this workflow does require some actioning within the accounting package and not within ServiceM8, and the credit is not presented within ServiceM8 so knowing the client has a credit / discounted package purchase is not readily visible without some additional tools (such as Custom Fields or Notes) and even then they would have to be updated manually.
Could a custom solution be more elegant? Perhaps, but there is obviously some additional cost to consider there. However hopefully this may be a viable workflow for you to try, and if not my team is happy to discuss a more custom alternative!
https://www.dddesigned.com/plan-a-call