Job Orders
Repair and service tickets — taking a job in, tracking it on the board, adding parts and labour, and handing it to the counter for payment.
12 min read · Updated 10 Sep 2026
On this page
A job order is a ticket for work that takes longer than a sale. A motorcycle comes in on Monday with bad brakes; you diagnose it, order a pad set, fit it on Wednesday, and the customer pays when they collect. That is one job order, and it collects the parts and the labour as you go so the customer pays once, at the end, for everything.
Repair shops, appliance and electronics servicing, laundries and car washes all run on this. If your work is finished before the customer leaves the counter, you do not need job orders — just ring up a sale.
Needs the Job Orders & Service Tickets add-on (₱400 per branch each month). It is also in the Repair Pack (₱1,149 a month), the Service Jobs Pack (₱849 a month) and the Everything Bundle (₱2,999 a month). See Plans & add-ons.
Finding it
Job orders live under SERVICES → Job Orders in the sidebar, at
/app/job-orders. There is also a Job Orders switch in Store Settings,
which controls whether that sidebar link is shown at all — it does not affect
whether the feature works.
The sidebar link does not appear for retail or food-and-beverage stores. The SERVICES group it belongs to is only built for service businesses, so a restaurant or a hardware store that buys the add-on has to reach the board by typing
/app/job-orders. Everything works normally once you are there.
There are five screens, all of them real web pages:
| Screen | Where | For |
|---|---|---|
| Board | /app/job-orders/board |
The day-to-day view: every open job as a card in a column |
| New job | /app/job-orders/new |
Taking a job in |
| Job detail | /app/job-orders/{id} |
One job: its parts, its labour, its history |
| List view | /app/job-orders/list |
Searching everything, including finished jobs |
| Configure Board | /app/job-orders/board-settings |
Renaming and rearranging the columns |
Taking a job in
Press New job and fill in the intake form. Only two fields are required:
| Field | Required | What it is for |
|---|---|---|
| Branch | Yes | Which branch is doing the work |
| Title | Yes | What the job is, in a few words: "Brake pad replacement" |
| Asset / vehicle | No | One free-text line: "Honda Click 125i, ABC-123" |
| Customer | No | Links the job to a customer record. New customer creates one without leaving the form |
| Assigned to | No | The staff member doing the work |
| Promised at | No | Date and time you promised it. This is what drives the overdue warning |
| Priority | No | A number from 0 to 9 |
| Deposit (₱) | No | What the customer paid up front. Read the warning below |
| Rush | No | Puts the card at the top of its column and marks it with a red badge |
| Deposit paid | No | A tick, nothing more |
| Diagnosis | No | What you found. Editable later |
| Customer notes | No | What the customer told you. Editable later |
| Intake note | No | An internal note that goes into the job's history |
Press Create job order. The job is numbered JO-2026-00001, counting up per year, per store, and lands in your first column.
The deposit is a note, not money. Filling in Deposit (₱) and ticking Deposit paid records those two facts on the job and nothing else. No cash is recorded, no payment exists, and the deposit is not subtracted from what the customer owes at checkout. If you take money up front, record it as a real payment at the counter and treat the deposit field as a reminder only.
Only Branch, Title, Asset, Customer, Assigned to, Promised at, Priority, Deposit, Rush and the notes can be captured. There is no field for a fault description beyond the title and notes, and none of these exist anywhere in Kassly:
- Photos. You cannot attach a picture of the damage.
- An accessories or condition checklist for what came in with the unit.
- A warranty period on the work or the parts.
- A customer signature, at intake or at release.
If those matter to you — and for a motor shop they usually do — keep taking them on paper against the job number.
The board
The board shows one column per stage, and one card per open job. Out of the box you get six:
| Column | Meaning |
|---|---|
| Intake | Just received, not looked at yet |
| Diagnosing | Being assessed |
| Awaiting Approval | Waiting on the customer to say yes |
| Awaiting Parts | Waiting on a supplier |
| In Progress | Being worked on |
| Ready for Pickup | Done, waiting for the customer |
Drag a card between columns to move the job. Kassly only allows moves that make sense — you cannot drag straight from Intake to Ready for Pickup, and a disallowed drag tells you so rather than sending anything. You can also move a job from the Move to menu on the job's own page, which offers a few destinations the board does not, such as Cancelled and Declined.
Each card carries the job number, a Rush badge if it is rushed, the title, the asset, a circle with the assignee's initials (a plain figure if nobody is assigned), the customer's name, the item count and the running total. The column header shows how many cards are in it.
The promised time chip is your only lateness signal. It reads in 3h while
you are inside the promise and turns red as overdue 2h once you are past
it. There are no other warnings — no colour bands per column, no limit on how
many cards a column may hold, no escalation.
Jobs inside a column are ordered rushes first, then oldest first, so the top of each column is the work you should be doing.
The board updates live. When someone at another terminal moves a card, adds a part or takes a job in, your board changes without you refreshing. There is no backup polling, though — if the live connection drops, the board quietly goes stale, so use Refresh if the board looks wrong.
Finished, cancelled and declined jobs disappear from the board. They are not gone; look for them in List view.
Adding parts and labour
Open a job and press Add item. There are three tabs:
| Tab | Use for | You choose |
|---|---|---|
| Product | A part out of your stock | The product, a variant if it has any, quantity, an optional discount |
| Service | Labour you have priced as a service | The service, quantity, an optional unit-price override |
| Custom | A one-off with no catalog entry | A name, a unit price and a quantity |
Each line shows a status you can change from a dropdown: Pending, Approved, In Progress, Done or Declined. These are labels for your own benefit — nothing in Kassly checks them, so a job can be handed over for payment with lines still marked Pending.
A stocked part leaves your inventory the moment you add it to the job, not when the customer pays. This is deliberate: the pad set is on the bike, so it should not still be on your shelf. Two consequences follow:
- Once a part is committed, its price and quantity are locked. Kassly refuses the edit and tells you to remove the line and add it again.
- The remove button on a committed part is disabled in the web app, with a note saying to remove it via a stock adjustment. So although removing such a line would return the stock, in practice you correct it with a stock adjustment instead.
Removing any other line is one click, and it is recorded in the job's history with your reason if you gave one.
The history
Every job has a Timeline down the right of its page, newest first. It records:
- Each status move, as
Diagnosing → Awaiting Parts, with any note - Each item added, as
Added Brake Pad Set × 1 - Each item removed, with the reason
Each entry is stamped with the time and who did it. This is the record you go back to when a customer argues about what was agreed.
Editing a job after intake
The job's own page lets you edit Diagnosis and Customer notes, and that is all. Title, asset, customer, assignee, promised date, priority, rush and deposit are fixed once the job is created — there is no web screen to change them.
Plan the intake form accordingly, particularly Promised at, since it is what the overdue chip is built on.
Getting paid and closing the job
There is no Complete button. The last step you take is Send to POS, and the job closes itself when the payment goes through.
- Move the job to a stage that allows handover. In Progress and Ready for Pickup both do by default; the earlier stages do not.
- Press Send to POS. Kassly creates an unpaid draft sale carrying every
line on the job, noted
Job Order #JO-2026-00001, and moves the job to Ready for Pickup if it is not there already. - Take the payment in the Kassly mobile app, on the phone or tablet you use as a till. This is the only place a sale can be paid — the web app has no working POS screen. See Making a sale.
- When that sale completes, the job moves itself to Closed and is stamped with the time.
The web app may say "Failed to send to POS" when it actually worked. This is a known display fault, not a failed handover. Before pressing it again, reload the job: if it now shows as sent, the draft sale exists and is waiting in the mobile app. Pressing the button twice does not create a second sale.
Two more rules to know:
- You cannot mark a job Closed by hand. Kassly refuses the move with a message saying Closed is set automatically when payment is recorded. That is the guarantee that a closed job is a paid job.
- Voiding the payment reopens the job, back to the stage it was in before, so the work is not lost. It does not put the parts back into stock — those movements stand, and you reverse them with a stock adjustment if you need to.
Nothing tells the customer their job is ready. There is no SMS and no email on a job order, so ringing them is on you.
There is also no printable intake slip or job card. The one job-order slip Kassly can print comes off the sale after Send to POS, and it lists the sale's items — it is not the ticket you hang on the handlebars.
Finding a finished job
List view searches everything, open and closed. You can filter by status (including Closed, Cancelled and Declined), branch, assignee and customer, and search by job number, title or the contact name typed onto the job.
Two quirks: the search box fires on every keystroke, so give it a moment on a slow connection; and the dates in the table do not show a year, so a job from last January looks like this January's. Check the job number, which carries the year.
Configuring the board
Configure Board lets you make the columns match how your shop actually works — a motor shop might add "With Supplier", a laundry might not need Diagnosing at all. It needs the Manage Job Orders permission, so owners and managers only; anyone else sees a "Permission required" message.
For each column you set:
| Setting | Notes |
|---|---|
| Slug | The permanent internal name, lowercase with underscores. It can never be changed, because the job history refers to it |
| Label | What staff see on the board. Change this freely |
| Color | One of nine: slate, blue, amber, orange, violet, brand, emerald, red, green |
| Role | What the column means to Kassly. See below |
| Initial column | New jobs land here. Exactly one column has it, and it must have the Intake role |
| Terminal column | Ends the job's life and hides it from the board. Only Completed and Cancelled roles may be terminal |
| POS-eligible | Send to POS is allowed from this stage |
The role is the part that has consequences, because Kassly's own behaviour keys off it rather than off the column's name:
| Role | What Kassly does with it |
|---|---|
| Intake | Where new jobs are created |
| Active | Nothing. Purely for your own organisation |
| Awaiting External | Nothing. For stages blocked on a customer, a part or a supplier |
| Ready for Handoff | Send to POS moves the job here automatically |
| Completed | Reached only by payment. Stamps the job as closed |
| Cancelled | A dead end for jobs that never finished |
Drag the rows to reorder the columns, and use the Allowed next picker on each column to say where staff may move a card from it, then press Save transitions.
Kassly refuses to save a board that cannot work. You always need exactly one initial column with the Intake role, at least one column with the Completed role, and at least one POS-eligible column.
To retire a column, Archive it and nominate a replacement. Every job sitting in the archived column is moved to the replacement, and the moves in and out of it are deleted. That cannot be undone, so pick the replacement carefully.
Reset to defaults puts the nine original columns back. It refuses if any job in your records — including long-closed ones — sits on a column you invented, so in a store that has been running custom columns for a while this will usually tell you no.
Who can do what
| Action | Owner | Manager | Cashier |
|---|---|---|---|
| See the board and jobs | Yes | Yes | Yes |
| Take a job in | Yes | Yes | Yes |
| Move a job between stages | Yes | Yes | Yes |
| Add a part or labour line | Yes | Yes | Yes |
| Change a line's status | Yes | Yes | Yes |
| Remove a line | Yes | Yes | No |
| Edit diagnosis and notes | Yes | Yes | No |
| Delete a job | Yes | Yes | No |
| Send to POS | Yes | Yes | No |
| Configure the board | Yes | Yes | No |
A cashier sees the Edit button on the notes and the remove icon on each line even though neither will work for them — clicking gives a permission error. And staff on the Staff role cannot open job orders at all, which matters if your technicians are set up that way: put them on Cashier if they need to update their own jobs.
Deleting a job is blocked outright while any part on it has left your stock. Take the parts off it first.