SHOP MANAGEMENT · WORKSHOP ACCESS

AI-powered collision estimates,
built for your shop floor.

Upload damage photos, scan a VIN, or pull DTC fault codes — get an itemized, insurance-ready repair estimate in minutes, priced against real state labor rates and live parts sourcing.

See what it does
50
States' Labor Rates
tracked & updated
AI
Vision-based damage
detection per photo
VIN
Factory ADAS & spec
data, decoded live
PDF
Itemized, claim-ready
report every time

Everything the shop floor needs, in one workbench

📷

AI Photo Analysis

Upload damage photos and let the vision model identify affected parts, severity, and repair vs. replace calls automatically — with cropped evidence photos attached to every line.

🔧

Manual & Teardown Lines

Add hidden damage found during teardown, R&I-for-access, diagnostics, and sublet work directly — the same estimate, technician-supplemented.

🚗

VIN Decode + ADAS

Scan or type a VIN for instant year/make/model/trim, drivetrain, and confirmed factory ADAS/safety equipment straight from NHTSA — no guessing on recalibration billing.

🔌

OBD Fault-Code Estimates

Price a repair straight from DTCs when there's no visible damage — diagnostic-only until a technician confirms the actual fix.

💲

Real State Labor Rates

Every estimate prices against actual tracked labor rates and sales tax for the vehicle's state, not a flat national guess.

📄

Itemized PDF Reports

A complete, claim-ready document — labor breakdown, parts & pricing, ADAS lines, photo evidence, and your shop's own branding.

From photo to priced estimate

1

Intake

Photos, VIN, or fault codes — whatever the vehicle gives you.

2

Analyze

AI identifies damage and severity; you confirm and refine.

3

Price

Labor, parts, ADAS, and tax priced against real, current rates.

4

Deliver

A signed, itemized PDF ready for the customer or the claim.

🔧

RepairIQ

Workshop
Estimates over time
All sources · vision, manual, OBD
Revenue collected
Paid estimates only
Estimates by source
Last 30 days
Needs attention
Review requests + payment incidents
Recent estimates
Last 8 created
🚗New Estimate
📷Vehicle Photos 1–8 angles
🖼️ Drop photos here or click to browse
JPEG / PNG / WEBP · max 20 MB · up to 8 photos · min 640×480px
🔧Parts Sourcing optional — defaults to OEM / eBay
Applied to every replacement part this run prices. A technician can still re-quote an individual line afterward from the estimate editor.
🚘Vehicle Information
📍Location
📎Claim Information optional
Owner Contact optional
Vehicle Owner optional, distinct from Customer above — the third-party-submission case (a shop/adjuster submitting on behalf of the vehicle's owner)
Appraiser optional, distinct from Adjuster above
🔧OBD / Fault Codes optional — cross-checked against your photos
Click ✓ on a code you've already physically diagnosed to mark it confirmed — it skips straight to a priced repair line. Unconfirmed codes get a diagnostic-only line pending inspection.
🗒️Notes optional context for the technician/model
🎨App Branding

The software's own name, logo, and browser-tab icon — shown across the Workshop header, login screen, landing page, and (once you configure the same via customer-portal-web) the public wizard. Distinct from PDF Branding, which is your shop's own business identity printed on the generated estimate document itself.

Product Name
Logo & Favicon
🖼️PDF Branding

Configure the company details, logo, and watermark that appear on every generated PDF estimate.

Company Information
Branding & Watermark
Regulatory IDs optional, shown in small print under the company block
Site URL — this app's own public domain
Technician Review Disclaimer — shown in the PDF's technician-verification block for a plain Workshop review with no formal paid remote/physical request behind it
Legal Disclaimer — printed as a "Terms & Disclosures" footer on every generated PDF (liability, repair authorization, aftermarket parts, fraud warning)
Page Footer Text — short one-line note repeated at the bottom of every page (distinct from the Legal Disclaimer above, which prints once, as a full block, at the end)
Parts Vendor Attribution — eBay/online-sourced parts never come with a named seller (no address/phone), only a marketplace channel
💲State Labor Rate Cards
State Rate Status Body $/hr Paint $/hr Mech $/hr Supplies $/hr Parts Tax % Source / Date
Click Refresh to load
📜Rate History
📡System Status
Add User
👤Workshop Accounts
Username Role Contact Status Created
Click Refresh to load
🚗ACV Lookup

Actual Cash Value lookups (used for the total-loss threshold) fall back through three tiers: paid vendor APIs below, then a generated depreciation table, then a static estimate. Vendor API keys are never displayed once saved — only a short suffix, so you can confirm one is set.

Tier-1 is gated separately per calling surface — a shop can let paid vendors run for Workshop-created estimates while keeping the unauthenticated Public kiosk on the free fallback tiers, or the reverse. Both default to off; turning on paid vendor spend is an explicit choice.

CarAPI
MarketCheck
Edmunds (not yet implemented)
🔧Parts Pricing Lookup

Replacement-part price lookups (the eBay-sourced quote on REPLACE lines) are gated per calling surface the same way ACV Tier-1 is — a shop can allow a paid parts vendor for Workshop estimates while keeping the Public kiosk on the free vendor. Only eBay has a live backend today, so both toggles currently have no effect — they're ready for when a paid vendor (e.g. a dedicated used/LKQ or OEM-dealer-network API) is added.

eBay (via Xoftex Proxima)
RockAuto (not yet implemented)
Car-Part.com — Used/LKQ (not yet implemented)
🔢VIN Decoder

VIN decoding runs through a local NHTSA vPIC-backed microservice. It decodes locally first and falls back to a configurable third-party vendor when needed. The connection settings below are this app's own — the vendor's own API key/URL live on the decoder service itself.

Decoder Service Connection
Fallback Vendor
📋Estimation Policy

Shop/insurer business rules for estimate money math — applies to every estimate on every surface (Public kiosk and Workshop alike), not gated per surface like ACV/Parts.

Total Loss
ADAS Recalibration Billing — whether a heuristic-triggered ADAS recalibration line (bumper/grille/windshield/mirror/quarter-panel damage near a sensor) is auto-billed onto the total, or always shown as advisory-only pending a technician's manual confirmation
Diagnostic / Inspection Labor — flat hour billed when a fault code or a vision-detected part can't be confirmed yet; shared by OBD and vision INSPECT parts
Post-Payment Regeneration — "AI missed something" re-runs on an already-paid estimate; each attempt is free to the customer, no new charge
📸Photo Evidence (Grounding Model)

Controls how confident the grounding model (GroundingDINO) must be before a per-part AI-cropped photo is shown on an estimate. Real-world testing found no single value cleanly separates correct crops from wrong ones — a low floor lets some confidently-wrong photos through, a high floor can suppress nearly all crops. Tune this based on real estimates as they come in; takes effect on the very next estimate generated, no restart needed. Not gated per surface — applies identically to Public and Workshop.

Crop Reliability
💳Payment Providers

Stripe and PayPal configuration for the separate customer-portal (Angular + Node) app — this app never stores these values itself; every save here is proxied live to customer-portal-api over the internal service network. Takes effect on that service's very next request, no restart needed.

Stripe
PayPal — alternative to Stripe at checkout (per-estimate, signed-report, and subscription)

✉️Email & Notifications

How and where this app sends customer/admin email — provider config, the shared From Address, link-building base URL, and support routing. Proxied live to customer-portal-api, same as Payment Providers above.

From Address — shared by both providers below, whichever is actually sending
Resend (transactional email)
SMTP — a shop's own mail server, checked before Resend when configured
Site URL — used to build every link in outgoing customer emails
Support — dispute / data-error reports
💰Pricing

Pay-per-estimate and subscription pricing, both admin-configurable. Proxied live to customer-portal-api, same as the other Customer Portal tiles.

🚨Payment Incidents

Webhook signature failures, fulfillment errors after a payment already succeeded, and synchronous PayPal-capture failures — recorded with enough detail (event/order id, the affected estimate, a truncated stack trace) to actually debug, not just "something failed".

🆘Escalations

Customer-reported issues — exhausted regenerate attempts, general "Report an Issue" submissions, plain data-error reports, and generation failures — each carries a tracking code and, for a guest, a contact email. Processing a refund (generation failures only) charges nothing new; it reverses the original report-unlock payment via Stripe/PayPal directly.

🧠Training Data

Browse past vision-sourced estimates — photos, VIN/vehicle specs, OBD fault codes, and per-part damage/disposition labels — to curate a dataset for fine-tuning the vision model. Select rows and export a zip (original photos + a manifest.json of the labels). Filter to "Reviewed only" for technician-corrected labels, the higher-value signal.

🌐Public Branding

Name/logo/favicon shown to customers on the self-service wizard (customer-portal-web, selfestimator.com) — separate from App Branding's Workshop-internal identity (eadjustor.com).

Public-Facing Identity
Mobile Hero Image

The wizard landing page's mobile hero graphic (<768px only — desktop keeps its own photo/headline design). One complete image, no text drawn over it by this app except the "Get My Estimate Now" button. Independent of "Use the same branding as Workshop" above — Workshop has no hero-image concept to fall back to, so this always uses what's set here.

🚩Feature Toggles

On/off switches for optional customer-facing features, plus Google Sign-In — folded in here rather than given its own tile since it's a single field, not really payment/email/ pricing. Toggles below are proxied through a curated view of the Customer Portal's own config (not a second copy); Google Client ID is saved via the same general settings endpoint the other Customer Portal tiles use.

Google Sign-In — ID-token verification only, no client secret involved
📝Site Content

Edit the text shown on the public FAQ, Terms of Service, Privacy Policy, and Refund Policy pages — changes go live immediately, no deploy needed. This is a plain text editor, not rich formatting: for Terms / Privacy / Refund Policy, start a new section with a line beginning ## (e.g. ## 1. Refunds), and separate paragraphs with a blank line. For FAQ, start each entry with a line beginning Q: and its answer on the next line(s) beginning A: (an answer can span several lines — the next Q: line starts a new entry). Reviews is a real list editor below instead of raw text — add/remove entries directly, each with a name, star rating, and comment. Manually-entered reviews here are shown, with the name as typed, alongside real customer feedback in the landing page's "Reviews (N)" dialog — a real customer's own submitted feedback shows their own typed name if they gave one, otherwise "Verified Customer".