- Implemented PayrollPage for managing payroll runs with CRUD operations. - Created TimeClocksPage for tracking employee clock-ins and clock-outs. - Developed TimeSheetsPage for displaying employee timesheets. - Added EmployeeCertificationForm and EmployeeDocumentForm for managing employee certifications and documents. - Introduced LeaveRequestForm for submitting and managing leave requests. - Added usePermissions hook for UI-side permission checks. - Created LeaveRequestsClient and PayrollClient for API interactions.
18 KiB
Garage ERP — Feature Gap Plan vs. Industry Leaders
Comparison of the current Reparee Garage ERP against established automotive workshop management platforms (GarageBox, Tekmetric, Shopmonkey, AutoLeap, Garage Hive, Mitchell 1 Manager SE, MaxxTraxx, Workshop Software).
Goal: list what does not yet exist in this codebase, group it by impact, and give each gap an implementation hint so it can be picked up later.
1. What Reparee already has (baseline)
Captured from the current backend (reparee_backend/) controllers/models and
dashboard navigation (apps/dashboard/config/navGroups.tsx):
Sales & service workflow
- Customers (with notes, types, referral sources, import/export)
- Vehicles (owners, makes/models, body types, fuel, transmission, colors, documents, mileage history, import/export)
- Inspections + Inspection Templates (categories, checkpoints, labels)
- Public share link for inspections (token-based, rate-limited)
- Estimates → Job Cards → Invoices (services, parts, expense items, internal notes, labels, document attachments)
- Credit Notes
- Payments Received
- Appointments (calendar)
Purchases
- Vendors (addresses, status, credits)
- Expenses & Expense Items
- Purchase Orders (with internal notes, labels)
- Bills
- Payments Made
- Vendor Credits
Items / inventory
- Services and Service Groups (with includes/pricing/parts)
- Parts (with categories, unit types)
- Inventory Adjustments
- Labor Rates, Taxes
HR / productivity
- Employees (with documents, certifications, avatar, performance, permissions)
- Departments, Roles (with
permission.checkmiddleware on every route) - Leave Requests + Leave Balance
- Payroll Runs + Entries + Slips
- Tasks, Task Sections, Task Types, TimeSheet
- Shop Calendar, Shop Timing, Holidays
Platform
- PDF generation via
DocumentPrintController+ Blade templates - Document share tokens
- Settings (company, including logo + Terms & Conditions in
privacy_policy) - i18n EN/AR with RTL
- OpenAPI client (
packages/api/) regenerated from backend spec
Sidebar shows planned-but-disabled groups (commented out in
navGroups.tsx): CRM (leads/calls/tasks), Marketing (service reminders,
ratings/reviews, Google reviews), Accountants (manual journals, chart of
accounts), Reports, Payroll, Integrations, Templates.
2. Priority matrix
| Tier | Meaning |
|---|---|
| P0 | Table-stakes for a modern garage SaaS — competitors all ship it, customers ask first |
| P1 | Significant value-add, expected by mid-market shops |
| P2 | Differentiators / nice-to-haves |
| P3 | Long-tail integrations and advanced workflows |
3. P0 — Table-stakes gaps
3.1 Reporting & Analytics dashboard
Status: No /reports route exists; sidebar entry is commented out. A
/ dashboard page exists but is not analytics-rich.
What competitors ship:
- Revenue by day/week/month, by service category, by technician
- Open jobs / WIP value, ARO (Average Repair Order), gross profit %
- Aging receivables (already implicit in invoices, no view)
- Parts margin, labor margin
- Technician productivity (billed hours vs. clocked hours)
- Inventory turnover, stock-outs
- Customer retention / first-visit vs. repeat
Plan:
- New backend controllers:
ReportControllerexposing aggregations (revenue, AR aging, technician utilization, inventory turnover). - New dashboard area:
apps/dashboard/app/(authenticated)/reports/with sub-routes per report. - Re-use TanStack Query + a chart lib already approved (or ask before adding recharts / visx). KPIs on home page should pull from the same endpoints.
3.2 Service Reminders (mileage- and time-based)
Status: Vehicle has mileage logs (VehicleMileAndKm) and documents
have expiry dates, but no reminder engine. Sidebar Marketing group is
commented out.
What competitors ship:
- "Next service in 5,000 km" rules per vehicle/service
- Insurance / registration / inspection expiry reminders
- Auto-send via email/SMS X days before due
- Customer can click to book
Plan:
- New model:
ServiceReminderRule(per vehicle or template per make/model: due_at_date, due_at_mileage, service_group_id, channel). - Scheduled job (Laravel scheduler) that scans daily and queues notifications.
- Channel adapters wired to the notification stack from §3.3.
- UI under
productivityor newmarketing/area.
3.3 Customer notifications (Email / SMS / WhatsApp)
Status: No notification channels found beyond document share links. No
Notification or messaging tables in models.
What competitors ship:
- Twilio/Vonage SMS, WhatsApp Business API
- Two-way SMS thread per customer/job (Tekmetric, Shopmonkey)
- Templated estimate-ready / job-ready / pickup-ready messages
- Inbox view of all customer conversations
Plan:
- Add
notification_channelsconfig + adapter interface (App\Services\Notifications\Channel). - Provider drivers behind feature flags (SMS via Twilio/MessageBird, email via existing Laravel mail, WhatsApp via Meta Cloud API).
- Tables:
customer_messages(inbound + outbound),notification_templates(subject/body, locale, type). - Dashboard inbox under
/sales/customers/[id]/messages+ global/inbox.
3.4 Customer-facing portal (estimate approval, history)
Status: Only PublicInspectionController exists for public viewing.
Estimates and invoices have no customer-side approval flow.
What competitors ship:
- Customer logs in (or magic-link) and sees: vehicles, history, estimates, invoices, upcoming appointments.
- One-click approve / decline / partial-approve on estimate line items (digital authorization with audit trail).
- Pay invoice via portal.
Plan:
- Reuse
DocumentSharetoken pattern, broaden into acustomer_portal_token. - New
PublicEstimateControllermirroringPublicInspectionController, with POST endpoints for approve/decline per line item. - Persist signature/IP/timestamp on
EstimateAuthorisationHistory(model already exists — confirm fields cover approvals from portal). - Frontend: new public route group
app/portal/(no auth, token-scoped).
3.5 Online payments
Status: PaymentMode table exists, payments are recorded manually. No
gateway integration.
What competitors ship:
- Stripe / Square / regional gateway integration
- "Pay invoice" link inside email/SMS
- Saved cards, partial payments, tips
- Reconciliation back to
PaymentRecieved
Plan:
- Pluggable gateway driver under
App\Services\Payments\. - New endpoint
POST /api/invoices/{id}/payment-linkreturns hosted URL. - Webhook handler that creates
PaymentRecievedrows on capture. - Frontend
pay/[token]page bundled with the portal in §3.4.
3.6 Audit log
Status: No audit/activity table found.
What competitors ship: Who changed what, when, on every business record. Required for shops with multiple staff.
Plan:
- Adopt
spatie/laravel-activitylog(request before adding the dep) or hand-roll a polymorphicactivity_logtable. - Log on estimate/job-card/invoice state transitions, permission changes, payment events.
- Read-only view at
/settings/activity-log.
3.7 Workflow / Kanban board for Job Cards
Status: Job Cards live in a list view. No status pipeline UI.
What competitors ship: Drag-and-drop columns ("Checked-in", "Awaiting Parts", "In Progress", "QC", "Ready for Pickup"). Drives the shop's day.
Plan:
- Add
job_card_status(enum or FK tojob_card_statusestable editable in settings). - Backend: status transition endpoint with allowed-transition guard.
- Frontend: new
/sales/job-cards/boardroute using dnd-kit (already in the React ecosystem; confirm dep). Cards link to existing detail page.
3.8 Vehicle service history (per VIN, cross-customer)
Status: History is currently scoped via the vehicle's job cards, but there is no consolidated "vehicle history" tab summarizing services, inspections, mileage, and recommendations together.
Plan:
- New endpoint
GET /api/vehicles/{id}/timelinemerging job cards, inspections, recommendations, document expiries, mileage events into a single chronological feed. - Tab on the vehicle detail page rendering the timeline.
3.9 Recommended / deferred work tracking
Status: FastShopRecommendation and ShopRecommendation models exist
but there is no "deferred services" view that follows the vehicle across
visits.
Plan:
- Extend recommendations with
status(open/accepted/declined/expired) andnext_followup_at. - Surface on vehicle detail, estimate creation ("pull deferred items"), and in service-reminder logic (§3.2).
4. P1 — Significant value-add
4.1 Technician time tracking on job cards (clock in/out per labor line)
Status: Generic TimeSheet exists but is not bound to job-card lines.
The sidebar already shows "Time Clocks" — confirm whether implemented or
stubbed.
Plan:
- New table
job_card_labor_time(job_card_service_id, employee_id, started_at, stopped_at). - Mobile-friendly start/stop UI on the job-card page (tap-and-go).
- Feed billed-vs-clocked into the productivity report (§3.1).
4.2 Estimate templates / service packages with menus
Status: Service Groups exist (ServiceGroup, ServiceGroupService,
ServiceGroupPart, ServiceGroupPricing). Gap: no canned "menus" UI
(e.g., "30k-mile service" preset that drops services + parts + labor onto
an estimate in one click).
Plan:
- Repurpose Service Groups as menus; add a "Add menu" picker on the estimate editor that expands the group into individual lines (so they can still be edited).
4.3 Customer digital signature on documents
Status: Documents print to PDF; no signature capture.
Plan:
- Add a signature pad component (svg path → PNG) on the customer portal approval screen (§3.4) and in-shop tablet flow.
- Persist as a
document_signaturesrow (signer name, type, timestamp, IP/UA, image blob in storage). - Embed signature in printed PDF.
4.4 Parts barcode / QR scanning
Status: Parts have SKUs but no barcode field or scan UI.
Plan:
- Add
barcodecolumn toparts. - Use the device camera (BarcodeDetector API) on the inventory adjustment and job-card "Add part" dialogs.
4.5 Tablet / shop-floor UI
Status: UI is desktop-first.
Plan:
- Audit job-card detail, inspection editor, and time-clock screens for touch targets and one-hand portrait use.
- Optional dedicated route
/floor/[job-card]with a stripped-down layout.
4.6 Photos & videos on inspections (with public share)
Status: InspectionCheckPointAttachment and InspectionAttachment
models exist — confirm whether the share link renders attachments.
Plan:
- Verify the public inspection view (
PublicInspectionController@show) exposes media URLs with signed access. - Add front-camera capture in the inspection editor for fast photo-taking.
4.7 Multi-location / branch support
Status: Settings is single-tenant; no branch_id scoping on
business records.
Plan: This is a bigger lift. Phased:
- Add
branchestable andbranch_idFK on the major aggregates (job_cards, invoices, vehicles, parts, employees). - Default to a single seeded branch for existing deployments.
- Add branch selector in header and scope queries via global scope.
4.8 Custom fields
Status: No custom-field infrastructure.
Plan:
- New
custom_field_definitions(entity_type, key, label, type, options) andcustom_field_values(polymorphic). - Render dynamically on customer/vehicle/job-card forms.
4.9 Marketing campaigns
Status: Sidebar has the group commented out.
Plan:
- Reuse §3.3 channels.
- New
marketing_campaigns(name, audience filter, template_id, schedule) andmarketing_sends(per-recipient log). - Audience builder uses the customer/vehicle filters already in the table views.
4.10 Ratings & reviews capture
Plan:
- Post-pickup auto-message asking for a rating (1–5) and free text.
- If 4–5, deep-link to Google review URL (configurable in settings).
- Internal review wall + ability to publish to a public testimonials endpoint.
4.11 Accounting export (QuickBooks / Xero / Zoho)
Status: No GL / chart of accounts (sidebar group is disabled).
Plan (lightweight first):
- CSV export of invoices, payments, bills, payments-made tagged with configurable account codes.
- Later: OAuth integration with QuickBooks Online / Xero APIs.
4.12 Tire & wheel module (heavy in GarageBox, Tekmetric)
Plan: Tire size lookup, DOT tracking, storage racks (off-season tire storage is a common revenue line in cold-climate markets). Skip unless target market needs it.
4.13 Warranty tracking on parts and services
Plan:
- Add
warranty_months/warranty_kmon parts and services. - Show "under warranty" badge when re-invoicing the same VIN within the window. Block billing or flag for review.
4.14 Fleet customer accounts
Plan:
- Allow a customer to own many vehicles already supported, but add a "fleet" customer type with: bulk PO upload, monthly statement instead of per-invoice billing, optional driver/vehicle list.
4.15 Online appointment booking widget
Plan:
- Public route
/bookthat surfaces shop services + free calendar slots (derived fromShopTimingand existing appointments). - Creates a draft
Appointment+ customer/vehicle if new. - Embed snippet for the shop's marketing site.
5. P2 — Differentiators
5.1 VIN decoder integration (NHTSA free API + paid Carfax)
- NHTSA
vpic.nhtsa.dot.gov/api/is free, no auth — wire it into the vehicle create form to auto-fill make/model/year/engine from VIN. - Carfax/AutoCheck for paid history reports (US/CA).
5.2 OEM repair info integration (Mitchell 1, AllData, Identifix, Haynes)
- Big lift, paid feeds. Out of scope for v1; design the parts/services data model so labor times can be imported.
5.3 Parts catalog integrations (WorldPac, NAPA PROLink, PartsTech)
- Real-time pricing + availability + ordering from inside a job card.
- Phase 1: PartsTech (aggregator) since it covers the most vendors.
5.4 Two-way calendar sync (Google / Microsoft)
- iCal feed for read-only first.
- Full two-way sync via Google Calendar API later.
5.5 AI-assisted estimate writer
- "Customer says: knocking noise on left front when braking" → suggested service lines + parts list from history of similar jobs. Useful and novel; defer until enough invoice data exists.
5.6 Mobile apps (technician + customer)
- React Native (or PWA first) sharing
@garage/api. - Technician: today's jobs, start/stop labor, take photos, mark complete.
- Customer: portal features (§3.4) packaged as an app.
5.7 OBD-II / telematics integration
- Long tail. Plan only the data model now (
vehicle_telemetry_events).
5.8 Loyalty / gift cards / membership plans
- "Service plan: 2 oil changes/year + 10% off for $X/mo".
- Recurring billing on top of §3.5.
5.9 Discounts and promo codes at line-item or document level
- Currently no promo entity. Add
discounts(code, type, %/amount, scope, expiry, usage cap) with hook in estimate/invoice totals.
5.10 Multi-currency
Settingsis implicitly single-currency. Add currency on documents and a daily rates table if shops need cross-border invoicing.
6. P3 — Long-tail / future
- Insurance claim workflow (estimator → adjuster handoff, photos packet, EMS export).
- Inventory replenishment automation (min/max → auto PO draft).
- Bay / lift management (assign job card to a bay; show bay utilization).
- AI photo damage assessment for inspections.
- Recall lookup (NHTSA recall API by VIN).
- TPMS / tire pressure history per vehicle.
- Public price-list / "instant quote" widget.
- Webhook system for third-party integrators.
- Bring-your-own-domain customer portal branding.
- Backup export of entire tenant data (GDPR-friendly).
7. Cross-cutting platform work
These aren't a single feature, but unlock many of the above:
- Background job runner — Laravel Horizon + Redis if not already set up; required for §3.2, §3.3, §4.9.
- Storage policy — confirm S3-compatible storage so signatures, media, and PDFs scale.
- Feature flag system — many of the above are tenant-gated; even a
simple
tenant_featurestable beats hard-coded toggles. - OpenAPI coverage — every new backend endpoint must add an
annotation so
packages/apistays in sync (already a project convention). - Permission seeds — every new route requires a matching permission
(project rule: routes are gated by
permission.check). - Lang pairs — every
lang/en/*.phpkey must have a matchinglang/ar/*.phpkey (project rule). - PDF template — every new printable type needs an entry in
DocumentPrintController::TYPESplus a Blade template underresources/views/pdf/.
8. Suggested phased roadmap
A pragmatic build order that maximizes early customer value and reuses infrastructure:
Phase 1 — "Looks competitive" (P0 core)
- Reporting dashboard (§3.1)
- Workflow board for job cards (§3.7)
- Audit log (§3.6)
- Vehicle timeline (§3.8)
- Recommended / deferred work tracking (§3.9)
Phase 2 — "Talks to the customer"
- Notifications channel (§3.3) — SMS + email first
- Customer portal w/ estimate approval (§3.4)
- Online payments (§3.5)
- Service reminders (§3.2)
- Ratings & reviews capture (§4.10)
Phase 3 — "Runs the shop floor"
- Technician time tracking on labor (§4.1)
- Estimate menus / service packages UI (§4.2)
- Photos on inspections, end-to-end (§4.6)
- Customer digital signature (§4.3)
- Tablet / shop-floor UI polish (§4.5)
Phase 4 — "Scales the business"
- Multi-location (§4.7)
- Custom fields (§4.8)
- Marketing campaigns (§4.9)
- Online booking widget (§4.15)
- Accounting exports (§4.11)
Phase 5 — "Differentiators"
- VIN decoder (§5.1)
- Parts catalog integrations (§5.3)
- Calendar sync (§5.4)
- Loyalty / memberships (§5.8)
- Mobile apps (§5.6)
9. Open questions to confirm before starting
- Target market geography — drives gateway choice (Stripe vs. local), SMS provider, accounting integration (QuickBooks vs. Zoho vs. Tally), and whether tire/snow modules matter.
- Is multi-tenancy single-DB (current) or DB-per-tenant?
- Are Horizon + Redis available in production today?
- Is there an approved chart library, or does adding one need a green light? (CLAUDE.md says no new deps without approval.)
- Should the customer portal share auth with the dashboard (Sanctum) or use a token-only public route like inspections do today?