[Skip to content](#main)

[→](/)

[![Avunu](/brand/avunu-logo.svg)![Avunu](/brand/avunu-logo-light.svg)](/)[Services](/services/)[Consulting](/services/consulting/)[ERP](/services/erp/)[Odoo](/services/erp/odoo/)[ERPNext](/services/erp/erpnext/)[Custom software](/services/custom-software/)[Devices & IoT](/services/devices-iot/)[Websites](/services/websites/)[Infrastructure](/services/infrastructure/)[Partners](/partners/)

[Work](/work/)[Open source](/open-source/)[Knowledge base](/kb/)[About](/about/)

[About Avunu](/about/)[Team](/about/team/)[Insights](/insights/)[Contact](/contact/)

[Client portal](https://erp.avunu.net/projects)[Start a project](/start/)

- [Services](/services/)[Consulting](/services/consulting/)
- [ERP](/services/erp/)
- [Odoo](/services/erp/odoo/)
- [ERPNext](/services/erp/erpnext/)
- [Custom software](/services/custom-software/)
- [Devices & IoT](/services/devices-iot/)
- [Websites](/services/websites/)
- [Infrastructure](/services/infrastructure/)
- [Partners](/partners/)

[Work](/work/)[Open source](/open-source/)[Knowledge base](/kb/)[About](/about/)

- [About Avunu](/about/)
- [Team](/about/team/)
- [Insights](/insights/)
- [Contact](/contact/)

[Client portal](https://erp.avunu.net/projects)[Start a project](/start/)

A truck repair shop's whole job, from inspection to invoice, in one system

An Odoo Community and OCA system built to run a truck repair shop end to end, from inspections and e-signed estimates to parts, scheduling, a technician iPad app, and billing.

[Work](/work/)

Auto & heavy-truck repair

Auto & heavy-truck repair&#xA;
Odoo · NixOS&#xA;

IndustryAuto & heavy-truck repair

PlatformOdoo 18 Community (OCB) · NixOS

Services[Odoo implementation](/services/erp/odoo/)
,&#x20;
[custom software](/services/custom-software/)
,&#x20;
[consulting](/services/consulting/)
,&#x20;
[managed infrastructure](/services/infrastructure/)

StackOdoo 18 Community (OCB), OCA modules, Python, PostgreSQL, Vue, Nix, odoo-nix, NHTSA vPIC, and 3 more

StatusBuilt · deploying&#xA;

**Service desk**

Repair orders

**Inspections**

Estimates

Shop schedule

Parts

Vehicles

DVI-0318 · RO-2214 · Class 8 tractor · Odometer 412,880Digital vehicle inspection

Build estimate
Email report&#xA;

Checklist graded18 / 22

2 urgent
3 soon
13 good&#xA;

ItemMeasurementSeverityPhotosFront brake lining, left
&#x20;4/32 in · min 6/32Urgent
Brake chamber, front rightAir leak at diaphragmUrgent
Air dryer cartridgeDue by service intervalSoon
—Steer tires11/32 in treadGood&#xA;

The challenge

A repair shop runs on handoffs. A technician inspects the truck and finds more than the customer reported. The front office prices the work, waits for a yes, orders parts, and books a bay. The office then bills what the customer approved. When each step lives in a different place, details slip through the gaps and good people spend their day re-keying.

This shop services both passenger vehicles and Class 6–8 heavy trucks. Before Odoo, schedules were tracked on paper, and parts availability and appointments were coordinated by hand throughout the shop. The result was fragmentation, overwhelm, inefficiency, and downtime. The shop wanted one system for intake, inspections, estimates, parts, scheduling, technician time, and accounting, and a way off QuickBooks without per-seat licensing.

Odoo Community was the right foundation, but its repair app doesn't cover the whole job out of the box. A repair order can't invoice on its own, doesn't know what a vehicle is, and has a single scheduled date with no model of technician capacity. The work was closing those gaps without forking Odoo.

What we built

The repair order anchors every job:

**Recommended work**

Front brake service$720

Brake chamber, front right$243

Air dryer cartridge$214

$963Sign & approve&#xA;

Approval on the customer's phone

Findings become priced lines through canned service jobs. Customers add what they want, sign, and pay a deposit if the shop asks for one.

**Openings · Tue**

Brake service · 3 h

7:008:3011:0012:301:002:30

Assigned to the next free technician · Bay 3

Openings from real schedules

Slots come from every qualified technician's shift, time off, and calendar at once, and double-booking is blocked.

RO-221400:47:12

Scanned · brake chamber, type 30 · 2 of 2

Pause
Finish job&#xA;

An iPad app for the bay

Each technician sees their jobs, runs a timer, scans parts with the camera, and records inspections where the work happens.

Intake

The service writer finds the vehicle by plate or VIN, records the odometer and the customer's concern in their own words, and books an appointment.

Digital vehicle inspection

Technicians grade each checklist item by severity and record conditions, measurements, and photos; out-of-spec values flag themselves. One click emails the customer a branded report with a portal link to the photos.

Estimate from findings

A wizard prices each finding through the shop's canned service jobs. Must-do items become firm lines; the rest become optional services.

Customer approval

On the portal, the customer adds the jobs they want, watches the total update, signs, and pays a deposit if the shop asks for one. Approved jobs land on the repair order as parts and labor, flagged so nothing bills twice, and the order records what was approved and declined.

Parts

Confirming a repair reserves stocked parts and raises purchase orders for the rest. Vendor documents that arrive by email are imported automatically, and an AI matcher suggests which repair order an incoming purchase order belongs to, for one-click confirmation.

Scheduling

Openings are drawn from every qualified technician's shift, time off, and calendar at once. Taking a slot assigns whoever is free. Move the appointment, the job, or the date, and the other two follow.

Technician time and the iPad app

Technicians run a timer on the job, feeding estimated-versus-actual reporting while the customer pays the flat rate they approved. An iPad-first app shows each technician their jobs, the timer, parts with camera barcode scanning, and inspections.

Vehicles

A catalog of 2,387 models across 87 makes, including Class 6–8 trucks, plus a Decode VIN button backed by NHTSA's public VIN service.

Accounting

A US GAAP chart of accounts, automated FIFO inventory valuation, and a rehearsed QuickBooks cutover plan for accounts, customers, vendors, active products, and open receivables and payables, gated on a trial-balance match.

Results

Built · deploying&#xA;

The system is built, tested, and ready for deployment at the shop. It gives the shop one record per job, from the first call to the paid invoice, and each vehicle's history stays with it for every future visit. Estimates require a signature automatically, so "no work without a signed estimate" is how the system works, not a rule to remember. Declined recommendations are on record. Parts ordering starts itself, and an availability signal tells the office when a truck can go in the bay.

Every job follows one path in one system, from repair order and inspection through estimate, signed approval, parts, technician time, and invoiceCustomers see inspection photos, choose the recommended jobs they want on the portal, and sign onlineApproved jobs put their parts and labor on the repair order automatically, with a recorded trail of declined workParts the shop doesn't stock turn into purchase orders the moment a job is confirmedAppointment openings come from every technician's real schedule, and the system blocks double-bookingBuilt on Odoo Community and OCA modules, with no per-seat license and the whole install declared in code

Technicians log time where the work happens, and owners can compare actual hours with the hours they sold. Because it's Odoo Community and OCA, the shop owns all of it: no per-user license fees, and any qualified Odoo partner can support it.

Under the hood

Odoo 18 Community (OCB)OCA modulesPythonPostgreSQLVueNixodoo-nixNHTSA vPICTwilioCloudflare EmailQuickBooks (migration source)

Platform

Odoo 18 Community (OCB) with roughly 180 core and OCA modules listed in one file and pinned as git submodules, including OCA repair, fleet,&#x20;
`resource_booking`
,&#x20;
`queue_job`
,&#x20;
`l10n_us_gaap`
, MIS Builder, EDI, and the shopfloor app framework.

Declarative environment

[odoo-nix](/open-source/odoo-nix/)
&#x20;builds the Python environment, runs PostgreSQL and Odoo in development, and applies module migrations at deploy time.

**Small, tested custom modules,**
&#x20;one concern each (vehicles, inspections, estimates, scheduling, VIN decode, the technician app), with tests run by Odoo's own test runner.

Notable engineering

Dragging an appointment changes the calendar event, not the booking, so a targeted override keeps the repair order in sync. OCA's capacity checks run at every level, so double-booking is impossible rather than discouraged.

Demo shop

A demo module seeds a full shop with 18 repair orders across every stage, so we can show the whole flow on a fresh database.

**Shared building blocks**
&#x20;from our public Odoo addons:&#x20;
[email and SMS](/open-source/odoo-email-messaging/)
&#x20;through Cloudflare and Twilio,&#x20;
[document import from email](/open-source/odoo-document-import/)
, and the&#x20;
[Carbon theme and shopfloor tooling](/open-source/odoo-ui-shopfloor/)
.

More detail

Open source it's built on

[All open-source projects](/open-source/)

![]()NixOS[odoo-nix](/open-source/odoo-nix/)odoo-nix

Reproducible Nix infrastructure for Odoo Community (OCB) and OCA projects, from scaffolding and development to containers and NixOS.

![]()Odoo[Odoo Email and Messaging](/open-source/odoo-email-messaging/)Odoo Email and Messaging

Odoo 18 modules that send and receive email through Cloudflare and run two-way Twilio SMS and MMS conversations inside Discuss.

![]()Odoo[Odoo Document Import](/open-source/odoo-document-import/)Odoo Document Import

Odoo 18 modules that turn vendor emails, PDFs, and printed documents into Odoo records, with templates, structured extraction, previews, and routing.

![]()Odoo[Odoo UI and Shop Floor](/open-source/odoo-ui-shopfloor/)Odoo UI and Shop Floor

Odoo 18 modules for a Carbon-styled backend, a live timesheet timer in the navbar, and camera scanning and social sign-in for the OCA Shopfloor app.

“”

Related work

[All case studies](/work/)

![](/brand/avunu-icon.svg)Textile & home-decor printing

[Print-shop production on a tested, self-hosted ERP](/work/textile-print-shop/)

![](/brand/avunu-icon.svg)Professional services

[We run Avunu on what we build, from proposal to paycheck](/work/avunu-erp/)

![](/brand/avunu-icon.svg)Timber-frame structures manufacturing

[CAD drawings that become quotes, BOMs, and shop-floor work](/work/timber-frame-manufacturer/)

Have a challenge like this one?

Tell us how your work flows today and where it hurts. We'll tell you honestly whether ERPNext, Odoo, or something custom fits, and what a first phase could look like.

[Start a project](/start/)[Explore Odoo implementation](/services/erp/odoo/)

Services

- [ERP implementation](/services/erp/)
- [Odoo](/services/erp/odoo/)
- [ERPNext](/services/erp/erpnext/)
- [Custom software](/services/custom-software/)
- [Devices & IoT](/services/devices-iot/)
- [Websites](/services/websites/)
- [Infrastructure](/services/infrastructure/)

Resources

- [Our work](/work/)
- [Open source](/open-source/)
- [Knowledge base](/kb/)
- [Insights](/insights/)

Company

- [About](/about/)
- [Team](/about/team/)
- [Partners](/partners/)
- [Contact](/contact/)

Clients

- [Project portal](https://erp.avunu.net/projects)
- [Invoices](https://erp.avunu.net/)
- [Support](https://erp.avunu.net/)

[![Avunu](/brand/avunu-logo-light.svg)](/)[\<av-icon data-jx-static>\<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor" stroke="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">\<path d="M20.400 20.500h-3.600v-5.600c0-1.300 0-3-1.800-3s-2.100 1.400-2.100 2.900v5.700H9.400V9h3.400v1.600c.5-.9 1.600-1.900 3.400-1.900 3.600 0 4.300 2.400 4.300 5.500v6.300zM5.300 7.400a2.100 2.100 0 1 1 0-4.100 2.100 2.100 0 0 1 0 4.100zm1.800 13.100H3.600V9h3.500v11.500zM22.200 0H1.800C.8 0 0 .8 0 1.700v20.600c0 .9.800 1.700 1.800 1.700h20.400c1 0 1.800-.8 1.800-1.700V1.700C24 .8 23.200 0 22.200 0z">\</path>\</svg>\</av-icon>](https://www.linkedin.com/company/avunu)[\<av-icon data-jx-static>\<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor" stroke="none" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">\<path d="M12 .3a12 12 0 0 0-3.8 23.4c.6.1.8-.3.8-.6v-2c-3.3.7-4-1.6-4-1.6-.6-1.4-1.4-1.8-1.4-1.8-1-.7.1-.7.1-.7 1.2.1 1.8 1.2 1.8 1.2 1 1.8 2.8 1.3 3.5 1 .1-.8.4-1.3.7-1.6-2.7-.3-5.5-1.3-5.5-5.9 0-1.3.5-2.4 1.2-3.2-.1-.3-.5-1.5.1-3.2 0 0 1-.3 3.3 1.2a11.500 11.500 0 0 1 6 0c2.300-1.500 3.300-1.200 3.300-1.200.6 1.700.2 2.900.1 3.200.8.8 1.200 1.900 1.200 3.200 0 4.600-2.800 5.600-5.500 5.900.4.400.8 1.100.8 2.200v3.300c0 .3.2.7.8.6A12 12 0 0 0 12 .3">\</path>\</svg>\</av-icon>](https://github.com/Avunu)[Client portal](https://erp.avunu.net/projects)[Start a project](/start/)

Avunu LLC · 948 East Philadelphia Street, York, PA 17403 · (717) 814-8540Knowledge base articles are in the public domain[Privacy](/privacy/)[Terms](/terms/)
