PulsCar analysis of NHTSA public data, September 2026 — dealership vs independent mechanic Article: https://www.pulscar.io/blog/dealership-vs-independent-mechanic License: CC BY 4.0. Credit "PulsCar analysis of NHTSA public data" with a link to the article. SOURCE FILES - Complaints: https://static.nhtsa.gov/odi/ffdd/cmpl/ — COMPLAINTS_RECEIVED_2015-2019.zip, COMPLAINTS_RECEIVED_2020-2024.zip, COMPLAINTS_RECEIVED_2025-2026.zip. Unit = one ODINO (report number), PROD_TYPE V. Received dates (LDATE) 2015-01-01 to 2026-09-08. 777,040 unique complaints. Free text = CDESCR. - Recalls: https://static.nhtsa.gov/odi/ffdd/rcl/ FLAT_RCL, one row per make/model/year per campaign. Distinct CAMPNO counted. Report dates 2015-01-01 to 2026-09-09. - Manufacturer communications (TSBs): https://static.nhtsa.gov/odi/ffdd/tsbs/ — distinct NHTSA document IDs, dates received 2015-01-06 to 2026-09-12: 187,827. FILE: shop_type_by_year.csv Regular expressions (Python re, case-insensitive) applied to CDESCR: dealer_visit = (taken|took|towed|brought|went|drove|take it|bring it|go) (it |the (vehicle|car|truck) )?(in )?(back )?to (the |a |my |our |an? )?(local |authorized |nearest |\w+ )?dealer(ship)? OR dealer(ship)? (was|were|has|have|had|inspected|diagnosed|determined|found|confirmed|said|told|stated|replaced|repaired|looked|checked|tested|could|couldn|refused|declined|charged|wanted|quoted) independent_visit = (taken|took|towed|brought|went|drove|take it|bring it|go) (it |the (vehicle|car|truck) )?(in )?to (an|my|a|the|our) (independent|local|private|third[- ]party|outside|trusted)? ?(mechanic|shop|garage|repair shop|auto shop|transmission shop|tire shop)\b OR independent (mechanic|shop|garage|technician)s? (was|were|has|have|had|inspected|diagnosed|determined|found|confirmed|said|told|stated|replaced|repaired|looked|checked|tested) OR (my|our|local) mechanic (said|told|found|diagnosed|replaced|confirmed|inspected|looked|checked|stated|determined) EXCLUDING texts matching: not (been )?(diagnosed|repaired|taken)[^.]{0,60}independent Why: NHTSA call-center summaries contain the template sentence "The vehicle was not diagnosed or repaired by an independent mechanic or the dealer." A bare phrase count ("independent mechanic|local mechanic|my mechanic|...") returns 43,722 complaints; the visit-required pattern returns 33,186. could_not_find = (could ?n[o']?t|can ?n[o']?t|could not|cannot|unable to|were not able to|was not able to|failed to|did not|didn'?t) (duplicate|replicate|reproduce|find (anything|any problem|the problem|a problem|the issue|an issue|the cause|the source)| locate (the )?(problem|issue|noise|source)|hear (the|any|it)|verify) | no (problem|trouble|issue|fault)s? (was |were )?found | nothing (was )?(found|wrong) | could not be (duplicated|replicated|reproduced|determined|found) | operating as designed | normal (operation|characteristic) | is normal mentions_warranty = "warrant" anywhere; mentions_recall = "recall" anywhere. Hand reading: 40 random complaints describing both a dealer and an independent visit were read in full. In about one third the sequence was independent first, then dealer to ask about warranty/campaign coverage; in 4 the dealer found nothing and an independent later found the fault; in 5 the independent found nothing and referred the owner to the dealer. WARRANTY DENIALS TIED TO INDEPENDENT SERVICE OR AFTERMARKET PARTS (figure quoted in the article: 32 of 54,366) Applied to complaints containing "warrant": (void|denied|deny|denies|not cover|refus\w*|not honor|won't cover|will not cover)[^.]{0,120}(independent (mechanic|shop|garage)| aftermarket (part|equipment|filter|oil|wheel|rim|tune|exhaust|intake|bulb|battery|tire|suspension|lift)|non[- ]dealer| outside (shop|mechanic)|third[- ]party (shop|mechanic|part)|not (serviced|maintained|done|performed) (at|by) (the |a )?dealer) OR the reverse order ending in (warranty|claim|coverage). All 32 were read: about two thirds describe a refusal the owner attributes to non-dealer maintenance or a non-OEM part; the rest involve aftermarket tuning, springs, wheels or unrelated wording. A looser pattern without the part-word list returned 186 matches, most of them false positives ("independently" in ADAS complaints), and was discarded. FILE: diagnostic_fees_cited_by_period.csv (shared with the diagnostic-cost article) Candidate texts: CDESCR containing "diagnos". Amount patterns (either): \$\s?(\d{1,3}(?:,\d{3})?(?:\.\d\d)?)(?![\d,])\s*(?:\+\s*tax\s*)?(?:\w+\s+){0,4}?(?:diagnos\w*|to diagnose) (?:diagnos\w*)\s+(?:\w+\s+){0,5}?(?:of|was|is|for|cost|costs|at|charge of|fee of|around|about|approximately|approx\.?|roughly| over|nearly|almost|another|totaling|total of)?\s*\$\s?(\d{1,3}(?:,\d{3})?(?:\.\d\d)?)(?![\d,]) First match per complaint; kept if $20 to $600. 1,863 complaints. The negative lookahead stops "$4200" being read as "$420". dealer_only = text contains dealer/dealership and none of: independent (mechanic|shop|repair|garage|technician), local (mechanic|shop|garage), my mechanic, third-party, private, outside shop, transmission shop, repair shop. independent_only = reverse. Hand reading of 40 random matches: 4 bundled a small repair or a second test into the amount; 36 were a diagnostic fee. Treat medians as upper bounds by roughly that margin. FILE: recalls_by_year.csv One row per distinct campaign; vehicles = max POTAFF across the campaign's rows; remedy flags by substring of the remedy text: DEALER; FREE OF CHARGE / NO CHARGE / NO COST / AT NO COST; OVER-THE-AIR / OVER THE AIR / " OTA"; SOFTWARE. FILE: manufacturer_communications_by_type.csv Distinct NHTSA document IDs by communication type, dates received 2015-01-01 to 2026-09-12. LIMITATIONS Complaints are self-reported, unverified, and skewed toward unresolved problems, recall-era vehicles and safety systems. They do not measure the share of all repairs done at dealers or independents, nor diagnostic accuracy. "Could not find" is often the correct finding for an intermittent fault. Fee amounts are what owners wrote, not invoices. ADDED 18 SEPTEMBER 2026 (same source files and date range) FILE: diagnostic_fees_by_state.csv Same 1,863 fee complaints as diagnostic_fees_cited_by_period.csv, grouped by the complaint's STATE field. Rows for states with 30 or more fees; the article table shows states with 55 or more. Medians for 2024-01-01 to 2026-09-08 rest on 12-94 complaints per state. FILE: goodwill_by_year.csv Candidate texts: CDESCR matching \bgood ?will\b (1,720 complaints; FTS query goodwill OR "good will", then regex). denied_or_refused = (deni|refus|declin|reject|would not|will not|wouldn't|won't|no|not) within 60 chars before "goodwill", or goodwill followed within 100 chars by (deni|refus|declin|reject|was not offered/approved/granted|would not|will not). offered_or_covered = goodwill followed within 120 chars by (cover|paid|pay|agree|approv|offer|assist|contribut|reimburs|waiv|honor|replac). Denied takes precedence when both match. Hand reading of 40 random texts: 23 refusals, 6 offers (mostly partial), 11 requests pending or unclear. Counts by make (article text): HONDA 297, HYUNDAI 172, FORD 150, KIA 150, TOYOTA 129, NISSAN 78, SUBARU 77, JEEP 71, CHEVROLET 66, TESLA 48, BMW 46, VOLKSWAGEN 43, MERCEDES-BENZ 42, ACURA 39, MAZDA 37; per-10,000 uses each make's total complaints 2015-2026. The jump to 425 (2025) and 649 (Jan-Sep 2026) coincides with longer, more formal complaint letters; we make no claim about a change in manufacturer behaviour. FILE: warranty_extensions_by_make.csv Manufacturer-communications file, rows with COMM_TYPE = "Warranty Program/Extension", distinct NHTSA document IDs (681), counted once per make. All 681 carry received dates in 2024-2026; the category does not appear on earlier documents, which are typed "Service Bulletin/Repair Instructions". Part categories (article text) are regex matches on the summary: engine \bengine\b 175; emissions (catalytic|catalyst|oxygen sensor|emission|evap|pcv) 59; paint/corrosion 47; infotainment/display 46; fuel pump/injector 44; turbo 37; transmission/CVT/transaxle 33; airbag/seat belt 29; hybrid/EV battery 12. 30 random summaries were read; all were warranty or coverage documents (two were dealer claim-procedure memos rather than extensions). FILE: second_opinions_by_year.csv Complaints whose text contains "second opinion" (664). first_shop columns: the text before the phrase contains "dealer" and none of independent|local mechanic|my mechanic|shop (dealer only), or the reverse (independent only); the rest are ambiguous. Hand reading of 40: 20 second opinions confirmed the first diagnosis, 11 contradicted or changed it, 9 pending or unclear. OUTSIDE SOURCES OPENED 18 SEPTEMBER 2026 AAA, "Average mechanic labor rate and repair costs in your state, 2026" (state extremes Maine $213.90, Connecticut $281.53; PartsTech 2025 report; diagnostic-charge wording). Consumer Reports, 20 March 2024 survey (85% fixed on first visit). NHTSA recalls API records for campaigns 24V102000 and 24V794000. 15 U.S.C. 2302(c), 49 U.S.C. 30120(a),(g), FTC press release of 14 January 2011 (Cornell LII / ftc.gov).