Car Detailing Cost Calculator

Help your auto detailing business book more appointments with an interactive quote calculator. This template lets customers select their vehicle type, condition, detailing package, and add-on services to see instant pricing. From basic washes to ultimate details with ceramic coating - customers can build their perfect service package. Capture vehicle details and contact info to streamline your booking process and reduce phone time.

AutomotivePopular

Try the Calculator

Auto Detailing Quote
🚗 Vehicle Information
 
 
🎯 Service Type
 
📦 Select Package
 
✨ Exterior Add-ons
 
 
🪑 Interior Add-ons
 
 
📍 Service Location
 
 
 

💰 Your Quote
$ 150.00

$ 150.00
⏱️ Est. 2-3 hours
Final price confirmed upon vehicle inspection. Ceramic coating requires paint assessment.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
export function carDetailingCalculator(form: FormTs) {
// Base rates by vehicle size
const sizeRates: Record<string, number> = {
'compact': 80,
'sedan': 100,
'suv-small': 120,
'suv-large': 145,
'truck': 140,
'truck-xl': 165,
'van': 150,
'sports': 130,
'luxury': 180,
'exotic': 250
};
 
// Package multipliers
const packageMultipliers: Record<string, number> = {
'express': 0.6,
'basic': 1.0,
'standard': 1.5,
'premium': 2.2,
'ultimate': 3.0
};
 
// Condition multipliers
const conditionMultipliers: Record<string, number> = {
'excellent': 0.9,
'good': 1.0,
'fair': 1.15,
'poor': 1.35,
'severe': 1.6
};
 
// Helper functions
const getVehicleSize = () => vehicleSection.radioButton('vehicleSize')?.value() || 'sedan';
const getCondition = () => vehicleSection.radioButton('condition')?.value() || 'good';
const getServiceType = () => serviceSection.radioButton('serviceType')?.value() || 'full';
const isTruck = () => {
const size = getVehicleSize();
return size === 'truck' || size === 'truck-xl';
};
const isConvertible = () => vehicleSection.checkbox('isConvertible')?.value() === true;
const isMobile = () => locationSection.radioButton('location')?.value() === 'mobile';
 
form.addRow(row => {
row.addTextPanel('header', {
computedValue: () => 'Auto Detailing Quote',
customStyles: { 'font-size': '1.5rem', 'font-weight': '600', 'color': '#1e293b' }
});
});
 
form.addSpacer({ height: 20 });
 
// Vehicle Details Section
const vehicleSection = form.addSubform('vehicleDetails', { title: '🚗 Vehicle Information' });
 
vehicleSection.addRow(row => {
row.addRadioButton('vehicleSize', {
label: 'Vehicle Size',
options: [
{ id: 'compact', name: 'Compact (MINI, Civic, Corolla)' },
{ id: 'sedan', name: 'Sedan (Camry, Accord, Model 3)' },
{ id: 'suv-small', name: 'Small SUV (RAV4, CR-V, Tucson)' },
{ id: 'suv-large', name: 'Large SUV (Tahoe, Expedition, X5)' },
{ id: 'truck', name: 'Truck (F-150, Silverado, Tacoma)' },
{ id: 'truck-xl', name: 'XL Truck (F-250+, Dually, Crew Cab)' },
{ id: 'van', name: 'Van / Minivan' },
{ id: 'sports', name: 'Sports Car' },
{ id: 'luxury', name: 'Luxury Vehicle' },
{ id: 'exotic', name: 'Exotic / Supercar' }
],
defaultValue: 'sedan',
orientation: 'vertical',
isRequired: true
}, '1fr');
row.addRadioButton('condition', {
label: 'Current Condition',
options: [
{ id: 'excellent', name: 'Excellent (-10%)' },
{ id: 'good', name: 'Good (standard)' },
{ id: 'fair', name: 'Fair (+15%)' },
{ id: 'poor', name: 'Poor (+35%)' },
{ id: 'severe', name: 'Severe (+60%)' }
],
defaultValue: 'good',
orientation: 'vertical',
isRequired: true
}, '1fr');
});
 
vehicleSection.addRow(row => {
row.addCheckbox('isConvertible', {
label: 'Convertible / Soft Top (+$30)',
defaultValue: false
});
});
 
// Service Type Section
const serviceSection = form.addSubform('serviceType', { title: '🎯 Service Type' });
 
serviceSection.addRow(row => {
row.addRadioButton('serviceType', {
label: 'What do you need?',
options: [
{ id: 'exterior', name: 'Exterior Only' },
{ id: 'interior', name: 'Interior Only' },
{ id: 'full', name: 'Full Detail (Interior + Exterior)' }
],
defaultValue: 'full',
orientation: 'horizontal',
isRequired: true
});
});
 
// Package Selection
const packageSection = form.addSubform('packageSelection', { title: '📦 Select Package' });
 
packageSection.addRow(row => {
row.addRadioButton('package', {
label: 'Detailing Package',
options: [
{ id: 'express', name: 'Express - Quick wash & vacuum (40% off base)' },
{ id: 'basic', name: 'Basic - Wash, vacuum, windows, tire shine' },
{ id: 'standard', name: 'Standard - Basic + interior wipe-down, dash treatment' },
{ id: 'premium', name: 'Premium - Standard + clay bar, wax, deep interior clean' },
{ id: 'ultimate', name: 'Ultimate - Premium + paint correction, ceramic coating' }
],
defaultValue: 'standard',
orientation: 'vertical',
isRequired: true
});
});
 
// Exterior Add-ons Section
const exteriorSection = form.addSubform('exteriorAddons', {
title: '✨ Exterior Add-ons',
isVisible: () => getServiceType() !== 'interior'
});
 
exteriorSection.addRow(row => {
row.addCheckboxList('paintAddons', {
label: 'Paint Care',
options: [
{ id: 'clayBar', name: 'Clay Bar Treatment (+$50)' },
{ id: 'polish', name: 'Paint Polish (+$75)' },
{ id: 'wax', name: 'Hand Wax (+$40)' },
{ id: 'sealant', name: 'Paint Sealant (+$60)' },
{ id: 'ceramic', name: 'Ceramic Spray Coating (+$100)' },
{ id: 'ceramicFull', name: 'Full Ceramic Coating (+$300)' }
],
defaultValue: [],
orientation: 'vertical'
}, '1fr');
row.addCheckboxList('exteriorExtras', {
label: 'Exterior Extras',
options: [
{ id: 'headlights', name: 'Headlight Restoration (+$45)' },
{ id: 'trim', name: 'Trim Restoration (+$35)' },
{ id: 'wheels', name: 'Wheel Detail & Coating (+$50)' },
{ id: 'glass', name: 'Glass Treatment (+$25)' },
{ id: 'engine', name: 'Engine Bay Cleaning (+$60)' }
],
defaultValue: [],
orientation: 'vertical'
}, '1fr');
});
 
// Truck-specific add-ons
const truckSection = form.addSubform('truckAddons', {
title: '🛻 Truck Add-ons',
isVisible: isTruck
});
 
truckSection.addRow(row => {
row.addCheckboxList('truckExtras', {
label: 'Truck-Specific Services',
options: [
{ id: 'bedClean', name: 'Truck Bed Cleaning (+$40)' },
{ id: 'bedLiner', name: 'Bed Liner Treatment (+$50)' },
{ id: 'bedCover', name: 'Tonneau Cover Clean (+$25)' },
{ id: 'undercarriage', name: 'Undercarriage Wash (+$35)' }
],
defaultValue: [],
orientation: 'vertical'
});
});
 
// Interior Add-ons Section
const interiorSection = form.addSubform('interiorAddons', {
title: '🪑 Interior Add-ons',
isVisible: () => getServiceType() !== 'exterior'
});
 
interiorSection.addRow(row => {
row.addCheckboxList('surfaceAddons', {
label: 'Surfaces',
options: [
{ id: 'leather', name: 'Leather Conditioning (+$35)' },
{ id: 'fabric', name: 'Fabric Protection (+$40)' },
{ id: 'carpet', name: 'Carpet Shampoo (+$55)' },
{ id: 'upholstery', name: 'Upholstery Shampoo (+$50)' },
{ id: 'steam', name: 'Steam Cleaning (+$60)' }
],
defaultValue: [],
orientation: 'vertical'
}, '1fr');
row.addCheckboxList('specialAddons', {
label: 'Special Treatments',
options: [
{ id: 'odor', name: 'Odor Removal (+$50)' },
{ id: 'ozone', name: 'Ozone Treatment (+$75)' },
{ id: 'petHair', name: 'Pet Hair Removal (+$40)' },
{ id: 'sanitize', name: 'Antibacterial Treatment (+$35)' },
{ id: 'kidMess', name: 'Heavy Kid Mess Clean (+$45)' }
],
defaultValue: [],
orientation: 'vertical'
}, '1fr');
});
 
// Location & Scheduling
const locationSection = form.addSubform('location', { title: '📍 Service Location' });
 
locationSection.addRow(row => {
row.addRadioButton('location', {
label: 'Where should we detail your vehicle?',
options: [
{ id: 'shop', name: 'At Our Shop' },
{ id: 'mobile', name: 'Mobile Service (we come to you) +$25' }
],
defaultValue: 'shop',
orientation: 'horizontal'
}, '1fr');
row.addDatepicker('preferredDate', {
label: 'Preferred Date',
minDate: new Date().toISOString().split('T')[0]
}, '1fr');
});
 
locationSection.addRow(row => {
row.addTextbox('address', {
label: 'Service Address',
placeholder: 'Enter your address for mobile service...',
isVisible: isMobile,
isRequired: isMobile
}, '1fr');
row.addRadioButton('timeSlot', {
label: 'Preferred Time',
options: [
{ id: 'morning', name: 'Morning (8am-12pm)' },
{ id: 'afternoon', name: 'Afternoon (12pm-5pm)' },
{ id: 'flexible', name: 'Flexible' }
],
defaultValue: 'flexible',
orientation: 'horizontal'
}, '1fr');
});
 
form.addSpacer({ height: 20, showLine: true, lineStyle: 'dashed' });
 
// Price Calculations
const calculateBasePrice = () => {
const size = getVehicleSize();
const pkg = packageSection.radioButton('package')?.value() || 'standard';
const condition = getCondition();
const serviceType = getServiceType();
 
const baseRate = sizeRates[size] || 100;
const pkgMult = packageMultipliers[pkg] || 1.5;
const condMult = conditionMultipliers[condition] || 1.0;
 
let price = baseRate * pkgMult * condMult;
 
// Adjust for service type
if (serviceType === 'exterior' || serviceType === 'interior') {
price *= 0.65; // 35% discount for single service
}
 
// Convertible surcharge
if (isConvertible()) {
price += 30;
}
 
return price;
};
 
const calculateExteriorAddons = () => {
if (getServiceType() === 'interior') return 0;
 
let total = 0;
const paintAddons = exteriorSection.checkboxList('paintAddons')?.value() || [];
const exteriorExtras = exteriorSection.checkboxList('exteriorExtras')?.value() || [];
 
if (paintAddons.includes('clayBar')) total += 50;
if (paintAddons.includes('polish')) total += 75;
if (paintAddons.includes('wax')) total += 40;
if (paintAddons.includes('sealant')) total += 60;
if (paintAddons.includes('ceramic')) total += 100;
if (paintAddons.includes('ceramicFull')) total += 300;
 
if (exteriorExtras.includes('headlights')) total += 45;
if (exteriorExtras.includes('trim')) total += 35;
if (exteriorExtras.includes('wheels')) total += 50;
if (exteriorExtras.includes('glass')) total += 25;
if (exteriorExtras.includes('engine')) total += 60;
 
return total;
};
 
const calculateTruckAddons = () => {
if (!isTruck()) return 0;
 
let total = 0;
const truckExtras = truckSection.checkboxList('truckExtras')?.value() || [];
 
if (truckExtras.includes('bedClean')) total += 40;
if (truckExtras.includes('bedLiner')) total += 50;
if (truckExtras.includes('bedCover')) total += 25;
if (truckExtras.includes('undercarriage')) total += 35;
 
return total;
};
 
const calculateInteriorAddons = () => {
if (getServiceType() === 'exterior') return 0;
 
let total = 0;
const surfaceAddons = interiorSection.checkboxList('surfaceAddons')?.value() || [];
const specialAddons = interiorSection.checkboxList('specialAddons')?.value() || [];
 
if (surfaceAddons.includes('leather')) total += 35;
if (surfaceAddons.includes('fabric')) total += 40;
if (surfaceAddons.includes('carpet')) total += 55;
if (surfaceAddons.includes('upholstery')) total += 50;
if (surfaceAddons.includes('steam')) total += 60;
 
if (specialAddons.includes('odor')) total += 50;
if (specialAddons.includes('ozone')) total += 75;
if (specialAddons.includes('petHair')) total += 40;
if (specialAddons.includes('sanitize')) total += 35;
if (specialAddons.includes('kidMess')) total += 45;
 
return total;
};
 
const getMobileFee = () => isMobile() ? 25 : 0;
 
// Summary Section
const summarySection = form.addSubform('summary', { title: '💰 Your Quote' });
 
summarySection.addRow(row => {
row.addPriceDisplay('basePrice', {
label: 'Package Price',
computedValue: () => Math.round(calculateBasePrice()),
variant: 'default'
}, '1fr');
row.addPriceDisplay('exteriorAddons', {
label: 'Exterior Add-ons',
computedValue: () => calculateExteriorAddons(),
variant: 'default',
prefix: '+',
isVisible: () => calculateExteriorAddons() > 0
}, '1fr');
});
 
summarySection.addRow(row => {
row.addPriceDisplay('interiorAddons', {
label: 'Interior Add-ons',
computedValue: () => calculateInteriorAddons(),
variant: 'default',
prefix: '+',
isVisible: () => calculateInteriorAddons() > 0
}, '1fr');
row.addPriceDisplay('truckAddons', {
label: 'Truck Add-ons',
computedValue: () => calculateTruckAddons(),
variant: 'default',
prefix: '+',
isVisible: () => calculateTruckAddons() > 0
}, '1fr');
});
 
summarySection.addRow(row => {
row.addPriceDisplay('mobileFee', {
label: 'Mobile Service Fee',
computedValue: () => getMobileFee(),
variant: 'default',
prefix: '+',
isVisible: isMobile
}, '1fr');
});
 
summarySection.addSpacer({ showLine: true, lineStyle: 'solid', lineColor: '#e2e8f0' });
 
summarySection.addRow(row => {
row.addPriceDisplay('totalPrice', {
label: 'Total Quote',
computedValue: () => {
const base = calculateBasePrice();
const exterior = calculateExteriorAddons();
const interior = calculateInteriorAddons();
const truck = calculateTruckAddons();
const mobile = getMobileFee();
 
return Math.round(base + exterior + interior + truck + mobile);
},
variant: 'large'
}, '1fr');
row.addTextPanel('timeEstimate', {
computedValue: () => {
const pkg = packageSection.radioButton('package')?.value() || 'standard';
const times: Record<string, string> = {
'express': '45 min - 1 hr',
'basic': '1-2 hours',
'standard': '2-3 hours',
'premium': '4-5 hours',
'ultimate': '6-8 hours'
};
return `⏱️ Est. ${times[pkg] || '2-3 hours'}`;
},
customStyles: { 'font-size': '1rem', 'color': '#059669', 'font-weight': '500' }
}, '1fr');
});
 
summarySection.addRow(row => {
row.addTextPanel('disclaimer', {
computedValue: () => 'Final price confirmed upon vehicle inspection. Ceramic coating requires paint assessment.',
customStyles: { 'font-size': '0.85rem', 'color': '#64748b', 'font-style': 'italic', 'text-align': 'center' }
});
});
 
form.configureSubmitButton({
label: 'Book Appointment'
});
}
 

Frequently Asked Questions

Can I create my own detailing packages?

Yes. Define exactly what's included in each package level and set the price multiplier. You can rename packages, add more tiers, or simplify to fewer options.

How do I handle mobile vs shop-based pricing?

You can add a service location option with different base rates for mobile service. Many detailers add a travel fee for mobile appointments.

Can I offer membership or subscription pricing?

Yes. Add monthly membership packages that show the per-visit savings compared to one-time pricing. This helps convert one-time customers into recurring revenue.

Does this work for fleet accounts?

You can customize the calculator for fleet pricing with volume discounts. Create a separate version for commercial accounts with different pricing tiers.

Can I show before/after photos with the packages?

While the calculator focuses on pricing, you can add image panels or link to your gallery. Many detailers embed the calculator alongside portfolio images.