Home / Help Center / pos-app / Sell / Billing / Repairs & Service
🔧 Sell / Billing

Repairs & Service

Repairs & Service is a three-part service desk: Job Cards track each device from intake to pickup, the Repair Price List gives staff standard quotes without calling a manager, and Spare Parts tracks the parts inventory used to fix devices — all wired together (parts picked on a job card are priced straight from the Spare Parts catalog and its stock is drawn down automatically).

📍 Menu path: Sell / Billing → Repairs & Service (Job Cards / Repair Price List / Spare Parts)
👤 Who uses it: All roles with Billing access (featureKey: billing)
🏷️ Plan tier: advanced+

Overview

A repair Job Card records the customer, the device (type, brand, model, IMEI/IMEI2, serial number), an intake condition checklist and up to 3 damage photos, the reported issue and diagnosis, labour/parts cost, any advance paid, the assigned technician, and an estimated ready date.

Jobs move through a fixed pipeline — Received → Diagnosing → In Repair → Waiting for Parts → Ready → Delivered — with Cancelled available as a side-branch; the card's "→ Next status" button always advances exactly one step.

The moment a job reaches Ready, the page automatically opens a WhatsApp "come collect your device" message if the customer has a phone on file — no need to remember to notify them separately.

Every job card also gets a public tracking link (a random token, e.g. /repair/<token>) that customers can open with no login to see their repair's current stage, mirroring the same status pipeline shown to staff.

The Repair Price List tab is a standard price book (device type, brand, repair type, labour, parts min–max, estimated total) that any staff member can consult to quote a repair on the spot.

The Spare Parts tab tracks parts in stock (name, code, device/brand fit, compatible models, quantity, low-stock threshold, purchase/selling price, supplier) — parts added to a job card via its built-in catalog search pull their price from here and reduce this stock automatically.

Before You Start

Step-by-Step Guide

1 Job Cards — intake a new repair

The main day-to-day screen for logging a device drop-off.

  1. Click New Job Card.
  2. Fill in Customer Name * and Phone, then the device details: Device Type, Brand, Model Number, IMEI 1, IMEI 2 (for dual-SIM), Serial Number.
  3. Tap through the Condition at Intake checklist (Powers on, Screen cracked, Body scratches/dents, Water damage signs, Battery swollen, SIM/memory card inside, Pattern or PIN noted) so there is a record agreed at drop-off, and note any Accessories Received (charger, cover, box, bill…).
  4. Enter the Reported Issue * (required) and, if already known, a Diagnosis / Findings note.
  5. Add Parts Used either by searching the Spare Parts catalog (shows price and current stock per match, and lets you adjust quantity per line) or, if no catalog parts are added, by typing them as free text.
  6. Enter Labour, Parts (auto-filled and locked to the catalog-part total once catalog parts are added) and any Advance Paid — the running Total and Balance are shown live.
  7. Set Assigned To (technician) and an Est. Ready Date, add any Notes, optionally attach up to 3 Damage Photos (auto-compressed) and capture a Customer Signature on the built-in signature pad.
  8. Optionally expand Log OEM Warranty Claim to record a manufacturer warranty Claim No., Claim Date and Status (Submitted/Pending/Approved/Rejected/Completed).
  9. Click Create Job.

2 Job Cards — move a job through the pipeline and notify the customer

  1. Click the → [Next status] button on a job card to advance it one step (Received → Diagnosing → In Repair → Waiting for Parts → Ready → Delivered).
  2. When a job reaches Ready and has a phone number on file, a WhatsApp "ready for pickup" message is opened automatically, including the customer's public tracking link if one has been generated.
  3. At any other stage, click the WhatsApp icon on the job to manually send a status-update message instead of waiting for the automatic Ready notification.
  4. Click the link icon to copy the customer's public tracking URL to your clipboard (a tracking token is generated on first use for older jobs that do not have one yet) — share it by SMS, email or any channel you like.
  5. Use Print Job Card for a drop-off/pickup slip (with signature and photos if captured), and Print Tax Invoice (only shown once there is a cost) for a GST-aware invoice splitting labour and parts with CGST/SGST when the shop is on GST.

3 Job Cards — search, filter and manage workload

  1. Use the search box to find a job by customer name, job number, device type or IMEI.
  2. Click a status chip (All, Received, Diagnosing, In Repair, Waiting for Parts, Ready, Delivered, Cancelled) to filter the list to that stage.
  3. Use the Technician workload chips (auto-generated from jobs currently open) to filter to a specific technician's open jobs and see how many each has at a glance.
  4. Click the history icon on a job with an IMEI or serial number to open Device Repair History — every previous job logged against that same IMEI/serial, so repeat issues are visible before you start work.
  5. Delete a job card (trash icon) only if it is still Received or Cancelled — jobs further along the pipeline cannot be deleted, only progressed or cancelled.

4 Repair Price List — quote a repair instantly

  1. Switch to the Repair Price List tab (also reachable at /repairs/price-list).
  2. Click Add Price, choose a Device Type and optional Brand ("Any" if it applies to all brands), name the Repair Type (e.g. "Screen Replacement"), and enter Labour, Parts Min and Parts Max costs, plus any Notes.
  3. Use the search box and device-type chips to find an existing price when a customer asks "how much to fix X" — the Est. Total column already adds labour to the parts range so you can quote a range on the spot.
  4. Edit or delete a price entry with the pencil/trash icons on its row.

5 Spare Parts — manage the parts inventory used for repairs

  1. Switch to the Spare Parts tab (also reachable at /repairs/spare-parts).
  2. Click Add Part, enter the Part Name (required) and optional Part Code/SKU, Device Type, Brand, Compatible Models, Quantity in Stock, Low Stock Alert At threshold, Purchase Price, Selling Price and Supplier.
  3. Watch the amber banner that appears whenever one or more parts have dropped to or below their Low Stock Alert At threshold, and the ⚠ Low tag on the affected row.
  4. These same parts appear in the search-as-you-type picker on a Job Card's Parts Used field — selecting one there prices the job automatically from this catalog's Selling Price.
  5. Edit or delete a part with the pencil/trash icons on its row.

Every Field & Button, Explained

Field / ButtonWhat it does
Customer Name * / PhoneRequired customer identity for the job; phone enables WhatsApp status updates and addressing the tracking link.
Device Type / Brand / Model Number / IMEI 1 / IMEI 2 / Serial NumberDevice identification; IMEI/serial are also what Device Repair History searches on to find prior jobs for the same physical device.
Condition at Intake checklistToggleable tags (Powers on, Screen cracked, Body scratches/dents, Water damage signs, Battery swollen, SIM/memory card inside, Pattern or PIN noted) recorded at drop-off to avoid disputes at pickup.
Accessories ReceivedFree-text note of what came in with the device (charger, cover, box, bill…).
Reported Issue * / DiagnosisWhat the customer says is wrong (required) versus what the technician actually found on inspection.
Parts Used (catalog picker)Type-ahead search over Spare Parts showing price and current stock per match; adding one prices it from that part's Selling Price and lets you adjust quantity; falls back to a free-text field if no catalog parts are selected.
Labour / Parts / Advance PaidCost fields (all in the shop's currency); Parts auto-fills from catalog part selections. Total and Balance (Total − Advance) are computed live.
Assigned To / Est. Ready DateTechnician name (drives the Technician workload filter chips) and the promised ready-by date shown on the job list and printed slip.
Damage PhotosUp to 3 photos, auto-compressed client-side to a small JPEG before upload; shown on the printed Job Card slip.
Customer SignatureCaptured via an on-screen signature pad and printed on the Job Card slip as proof of intake conditions agreed.
OEM Warranty Claim (Claim No. / Date / Status)Optional log of a manufacturer warranty claim tied to this job — status options are Submitted, Pending, Approved, Rejected, Completed.
Status pipeline chip / → Next status buttonReceived → Diagnosing → In Repair → Waiting for Parts → Ready → Delivered (Cancelled is a side-branch); the button always advances exactly one step and is hidden once Delivered or Cancelled.
Technician workload chipsAuto-counted from jobs not yet Delivered/Cancelled, grouped by Assigned To; click a chip to filter the list to that technician.
WhatsApp iconSends a status-update message (or the automatic "ready for pickup" message when a job reaches Ready); includes the public tracking link if one has been generated.
Link icon (copy tracking link)Copies the customer-facing public tracker URL (/repair/:token); generates a token on first use for jobs created before the tracker existed.
History iconOpens Device Repair History — every other job logged against the same IMEI or serial number, excluding the current one.
Print Job CardPrints a compact drop-off/pickup slip with device, issue, cost breakdown, signature, damage photos and the tracking link if available.
Print Tax InvoiceOnly shown once totalCost > 0; prints a GST-aware invoice (CGST/SGST split at 18% inclusive when the shop is on GST) or a plain invoice otherwise.
Delete iconOnly available while a job is still Received or Cancelled; permanently removes the job card.
Repair Price List — Device Type / Brand / Repair Type / Labour / Parts Min–MaxA standard quote entry; the Est. Total column shows Labour + Parts Min through Labour + Parts Max as a quick quote range.
Spare Parts — Quantity in Stock / Low Stock Alert AtCurrent stock and the threshold below which the ⚠ Low tag and the page-level low-stock banner appear.
Spare Parts — Purchase Price / Selling Price / SupplierCost basis, the price charged to customers (also what a Job Card's catalog picker bills), and where to reorder the part.

Tips & Best Practices

Troubleshooting & FAQ

Repairs & Service is missing from my sidebar.
It requires the billing feature at the Advanced plan tier or above; below that tier all three tabs (Job Cards, Repair Price List, Spare Parts) are hidden.
I can't delete a job card.
Delete is only available while a job is still in the Received or Cancelled status — once it has moved further along the pipeline, progress it to Delivered or Cancel it instead of trying to delete it.
The WhatsApp button did not open a message.
The job needs a customer phone number on file; also note Delivered and Cancelled jobs no longer show the WhatsApp icon since no further status update applies.
Parts cost keeps resetting when I edit it manually.
Once you have selected one or more parts from the Spare Parts catalog picker, the Parts cost field is driven by those selections (quantity × selling price). Remove the catalog part lines if you need to enter parts cost manually.
A part shows a Low stock warning — where do I fix that?
Open the Spare Parts tab, edit that part, and either increase Quantity in Stock after restocking or adjust its Low Stock Alert At threshold if it was set too high.

🧑‍💻 Developer Notes

Source component(s):

  • frontend-app/packages/pos-react-lib/src/pages/repairs/RepairPage.jsx (Job Cards — default export, mounted at /repairs and /repairs/price-list is a separate component)
  • frontend-app/packages/pos-react-lib/src/pages/repairs/RepairPricePage.jsx (Repair Price List — mounted at /repairs/price-list)
  • frontend-app/packages/pos-react-lib/src/pages/repairs/SparePartsPage.jsx (Spare Parts — mounted at /repairs/spare-parts)
  • frontend-app/packages/pos-react-lib/src/pages/repairs/RepairTrackerPage.jsx (public, unauthenticated tracker at /repair/:token — not part of the sidebar)
  • frontend-app/packages/pos-react-lib/src/components/SignaturePad (customer signature capture)

Backend endpoints used:

  • GET /repairs, POST /repairs, PUT /repairs/:id, DELETE /repairs/:id (job cards)
  • POST /repairs/:id/tracking-token (mint a public tracker token for older jobs)
  • GET /repairs?search= (used by Device Repair History, searching by IMEI/serial)
  • GET /repairs/prices, POST /repairs/prices, PUT /repairs/prices/:id, DELETE /repairs/prices/:id (Repair Price List)
  • GET /repairs/spare-parts, POST /repairs/spare-parts, PUT /repairs/spare-parts/:id, DELETE /repairs/spare-parts/:id (Spare Parts)
  • GET /catalog/repair/:token (public, no auth — used by RepairTrackerPage)
  • GET /settings (store name/address/GSTIN used on the printed Job Card and Tax Invoice)

Related tables (db-core repositories):

  • ElectronicsRepair
  • ElectronicsRepairPrice
  • ElectronicsSparePart

Feature flag key: billing (requires advanced plan tier or above)

All three tabs are registered generically in every variant's App.js (/repairs, /repairs/price-list, /repairs/spare-parts) behind the single repairs nav key with children repairs-jobs/repairs-prices/repairs-parts in navItems.jsx, all sharing the same featureKey: billing + minTier: advanced gate. Damage photos are compressed client-side on a <canvas> to a max 480px JPEG at 65% quality before being stored as a JSON array of data-URIs on the job row. The printed Tax Invoice treats entered Labour/Parts amounts as GST-inclusive and back-calculates the 18% CGST/SGST split (SAC 998719 for labour, 996111 for parts) only when the shop's tax system is GST. Job status advancement and the automatic "ready" WhatsApp notification both mint a tracking token on demand via ensureToken() if the job predates the public tracker feature.