Bike Repair Calculator

Give your bike shop a professional edge with an interactive pricing calculator. This template helps cyclists get instant estimates based on bike type (road, mountain, e-bike, carbon), service needed (tune-ups, brakes, drivetrain, wheels), and additional options like rush service or pickup/delivery. Include specialty pricing for different bike types and comprehensive service packages. Transparent pricing builds trust and converts website visitors into shop customers.

Freelance & Business

Try the Calculator

Bike Repair Cost Calculator
๐Ÿšฒ Your Bike
๐Ÿ”ง Tune-up Services
 
๐Ÿ›‘ Brake Services
โš™๏ธ Drivetrain Services
๐Ÿ”˜ Wheel Services
โœจ Other Services
๐Ÿ“‹ Additional Options

๐Ÿ’ฐ Repair Estimate
$ 0.00
+
$ 0.00
+
$ 0.00
+
$ 0.00
๐Ÿงพ Summary
$ 0.00
Labor only - parts priced separately. Free estimate on drop-off. 30-day warranty on all repairs.
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
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
export function bikeRepairCalculator(form: FormTs) {
// Service prices by category
const servicePrices: Record<string, number> = {
// Tune-ups
'basic-tune': 45,
'standard-tune': 85,
'full-overhaul': 175,
 
// Brakes
'brake-adjust': 15,
'brake-pads': 25,
'brake-cable': 20,
'hydraulic-bleed': 45,
'disc-brake-install': 75,
 
// Drivetrain
'derailleur-adjust': 20,
'cable-replace': 25,
'chain-replace': 25,
'cassette-replace': 35,
'chainring-replace': 30,
'bottom-bracket': 55,
 
// Wheels
'flat-repair': 15,
'tube-replace': 20,
'tire-replace': 25,
'wheel-true': 25,
'spoke-replace': 15,
'hub-service': 45,
 
// Other
'headset-adjust': 20,
'headset-replace': 55,
'fork-service': 85,
'suspension-service': 125
};
 
// Bike type multipliers
const bikeMultipliers: Record<string, number> = {
'standard': 1,
'road': 1.1,
'mountain': 1.2,
'ebike': 1.4,
'carbon': 1.3
};
 
form.addRow(row => {
row.addTextPanel('header', {
computedValue: () => 'Bike Repair Cost Calculator',
customStyles: { 'font-size': '1.5rem', 'font-weight': '600', 'color': '#1e293b' }
});
});
 
form.addSpacer({ height: 20 });
 
// Bike Information Section
const bikeSection = form.addSubform('bikeInfo', { title: '๐Ÿšฒ Your Bike' });
 
bikeSection.addRow(row => {
row.addDropdown('bikeType', {
label: 'Bike Type',
options: [
{ id: 'standard', name: 'Standard/Commuter' },
{ id: 'road', name: 'Road Bike (+10%)' },
{ id: 'mountain', name: 'Mountain Bike (+20%)' },
{ id: 'ebike', name: 'E-Bike (+40%)' },
{ id: 'carbon', name: 'Carbon Frame (+30%)' }
],
defaultValue: 'standard',
isRequired: true,
tooltip: 'Specialty bikes may require more time and expertise'
}, '1fr');
row.addDropdown('bikeCondition', {
label: 'Current Condition',
options: [
{ id: 'good', name: 'Good (regular maintenance)' },
{ id: 'fair', name: 'Fair (some issues)' },
{ id: 'poor', name: 'Poor (neglected)' },
{ id: 'unknown', name: 'Unknown/Needs inspection' }
],
defaultValue: 'fair'
}, '1fr');
});
 
// Tune-up Services
const tuneupSection = form.addSubform('tuneup', { title: '๐Ÿ”ง Tune-up Services' });
 
tuneupSection.addRow(row => {
row.addRadioButton('tuneupLevel', {
label: 'Tune-up Package',
options: [
{ id: 'none', name: 'No tune-up (individual services only)' },
{ id: 'basic-tune', name: 'Basic Tune ($45) - Safety check, lubrication, adjustments' },
{ id: 'standard-tune', name: 'Standard Tune ($85) - Basic + brake/derailleur service' },
{ id: 'full-overhaul', name: 'Full Overhaul ($175) - Complete disassembly and rebuild' }
],
defaultValue: 'none',
orientation: 'vertical'
});
});
 
// Brake Services
const brakeSection = form.addSubform('brakes', { title: '๐Ÿ›‘ Brake Services' });
 
brakeSection.addRow(row => {
row.addCheckbox('brakeAdjust', {
label: 'Brake Adjustment ($15)',
defaultValue: false
}, '1fr');
row.addCheckbox('brakePads', {
label: 'Brake Pad Replacement ($25)',
defaultValue: false,
tooltip: 'Parts not included'
}, '1fr');
});
 
brakeSection.addRow(row => {
row.addCheckbox('brakeCable', {
label: 'Brake Cable Replacement ($20)',
defaultValue: false
}, '1fr');
row.addCheckbox('hydraulicBleed', {
label: 'Hydraulic Brake Bleed ($45)',
defaultValue: false,
tooltip: 'For disc brake systems'
}, '1fr');
});
 
// Drivetrain Services
const drivetrainSection = form.addSubform('drivetrain', { title: 'โš™๏ธ Drivetrain Services' });
 
drivetrainSection.addRow(row => {
row.addCheckbox('derailleurAdjust', {
label: 'Derailleur Adjustment ($20)',
defaultValue: false
}, '1fr');
row.addCheckbox('cableReplace', {
label: 'Shift Cable Replacement ($25)',
defaultValue: false
}, '1fr');
});
 
drivetrainSection.addRow(row => {
row.addCheckbox('chainReplace', {
label: 'Chain Replacement ($25)',
defaultValue: false,
tooltip: 'Parts not included'
}, '1fr');
row.addCheckbox('cassetteReplace', {
label: 'Cassette Replacement ($35)',
defaultValue: false,
tooltip: 'Parts not included'
}, '1fr');
});
 
drivetrainSection.addRow(row => {
row.addCheckbox('chainringReplace', {
label: 'Chainring Replacement ($30)',
defaultValue: false
}, '1fr');
row.addCheckbox('bottomBracket', {
label: 'Bottom Bracket Service ($55)',
defaultValue: false
}, '1fr');
});
 
// Wheel Services
const wheelSection = form.addSubform('wheels', { title: '๐Ÿ”˜ Wheel Services' });
 
wheelSection.addRow(row => {
row.addCheckbox('flatRepair', {
label: 'Flat Repair ($15)',
defaultValue: false
}, '1fr');
row.addCheckbox('tubeReplace', {
label: 'Tube Replacement ($20)',
defaultValue: false,
tooltip: 'Parts not included'
}, '1fr');
});
 
wheelSection.addRow(row => {
row.addCheckbox('tireReplace', {
label: 'Tire Installation ($25)',
defaultValue: false,
tooltip: 'Parts not included'
}, '1fr');
row.addCheckbox('wheelTrue', {
label: 'Wheel Truing ($25)',
defaultValue: false
}, '1fr');
});
 
wheelSection.addRow(row => {
row.addCheckbox('spokeReplace', {
label: 'Spoke Replacement ($15/spoke)',
defaultValue: false
}, '1fr');
row.addCheckbox('hubService', {
label: 'Hub Service ($45)',
defaultValue: false,
tooltip: 'Clean, repack bearings, adjust'
}, '1fr');
});
 
wheelSection.addRow(row => {
row.addInteger('spokeCount', {
label: 'Number of Spokes',
min: 1,
max: 10,
defaultValue: 1,
isVisible: () => wheelSection.checkbox('spokeReplace')?.value() === true
}, '1fr');
row.addInteger('wheelCount', {
label: 'Number of Wheels',
min: 1,
max: 2,
defaultValue: 1,
tooltip: 'Select 2 for both wheels',
isVisible: () =>
wheelSection.checkbox('flatRepair')?.value() ||
wheelSection.checkbox('tubeReplace')?.value() ||
wheelSection.checkbox('tireReplace')?.value() ||
wheelSection.checkbox('wheelTrue')?.value() ||
wheelSection.checkbox('hubService')?.value()
}, '1fr');
});
 
// Other Services
const otherSection = form.addSubform('other', { title: 'โœจ Other Services' });
 
otherSection.addRow(row => {
row.addCheckbox('headsetAdjust', {
label: 'Headset Adjustment ($20)',
defaultValue: false
}, '1fr');
row.addCheckbox('headsetReplace', {
label: 'Headset Replacement ($55)',
defaultValue: false
}, '1fr');
});
 
otherSection.addRow(row => {
row.addCheckbox('forkService', {
label: 'Fork Service ($85)',
defaultValue: false,
tooltip: 'For suspension forks',
isVisible: () => bikeSection.dropdown('bikeType')?.value() === 'mountain'
}, '1fr');
row.addCheckbox('suspensionService', {
label: 'Full Suspension Service ($125)',
defaultValue: false,
tooltip: 'Fork and rear shock',
isVisible: () => bikeSection.dropdown('bikeType')?.value() === 'mountain'
}, '1fr');
});
 
otherSection.addRow(row => {
row.addCheckbox('cleanLube', {
label: 'Deep Clean & Lube ($35)',
defaultValue: false
}, '1fr');
row.addCheckbox('safetyInspection', {
label: 'Safety Inspection ($15)',
defaultValue: false,
tooltip: 'Comprehensive safety check'
}, '1fr');
});
 
// Additional Options
const optionsSection = form.addSubform('options', { title: '๐Ÿ“‹ Additional Options' });
 
optionsSection.addRow(row => {
row.addCheckbox('rushService', {
label: 'Rush Service (+50%)',
defaultValue: false,
tooltip: 'Same-day or next-day completion'
}, '1fr');
row.addCheckbox('pickup', {
label: 'Bike Pickup/Delivery (+$25)',
defaultValue: false,
tooltip: 'We pick up and deliver your bike'
}, '1fr');
});
 
form.addSpacer({ height: 20, showLine: true, lineStyle: 'dashed' });
 
// Price Summary Section
const summarySection = form.addSubform('summary', { title: '๐Ÿ’ฐ Repair Estimate', isCollapsible: false });
 
summarySection.addRow(row => {
row.addPriceDisplay('tuneupPrice', {
label: 'Tune-up Package',
computedValue: () => {
const tuneup = tuneupSection.radioButton('tuneupLevel')?.value() || 'none';
if (tuneup === 'none') return 0;
return servicePrices[tuneup] || 0;
},
variant: 'default'
}, '1fr');
row.addPriceDisplay('servicesPrice', {
label: 'Individual Services',
computedValue: () => {
let total = 0;
const wheelCount = wheelSection.integer('wheelCount')?.value() || 1;
const spokeCount = wheelSection.integer('spokeCount')?.value() || 1;
 
// Brakes
if (brakeSection.checkbox('brakeAdjust')?.value()) total += (servicePrices['brake-adjust'] || 0);
if (brakeSection.checkbox('brakePads')?.value()) total += (servicePrices['brake-pads'] || 0);
if (brakeSection.checkbox('brakeCable')?.value()) total += (servicePrices['brake-cable'] || 0);
if (brakeSection.checkbox('hydraulicBleed')?.value()) total += (servicePrices['hydraulic-bleed'] || 0);
 
// Drivetrain
if (drivetrainSection.checkbox('derailleurAdjust')?.value()) total += (servicePrices['derailleur-adjust'] || 0);
if (drivetrainSection.checkbox('cableReplace')?.value()) total += (servicePrices['cable-replace'] || 0);
if (drivetrainSection.checkbox('chainReplace')?.value()) total += (servicePrices['chain-replace'] || 0);
if (drivetrainSection.checkbox('cassetteReplace')?.value()) total += (servicePrices['cassette-replace'] || 0);
if (drivetrainSection.checkbox('chainringReplace')?.value()) total += (servicePrices['chainring-replace'] || 0);
if (drivetrainSection.checkbox('bottomBracket')?.value()) total += (servicePrices['bottom-bracket'] || 0);
 
// Wheels (multiplied by wheel count where applicable)
if (wheelSection.checkbox('flatRepair')?.value()) total += (servicePrices['flat-repair'] || 0) * wheelCount;
if (wheelSection.checkbox('tubeReplace')?.value()) total += (servicePrices['tube-replace'] || 0) * wheelCount;
if (wheelSection.checkbox('tireReplace')?.value()) total += (servicePrices['tire-replace'] || 0) * wheelCount;
if (wheelSection.checkbox('wheelTrue')?.value()) total += (servicePrices['wheel-true'] || 0) * wheelCount;
if (wheelSection.checkbox('hubService')?.value()) total += (servicePrices['hub-service'] || 0) * wheelCount;
if (wheelSection.checkbox('spokeReplace')?.value()) total += (servicePrices['spoke-replace'] || 0) * spokeCount;
 
// Other
if (otherSection.checkbox('headsetAdjust')?.value()) total += (servicePrices['headset-adjust'] || 0);
if (otherSection.checkbox('headsetReplace')?.value()) total += (servicePrices['headset-replace'] || 0);
if (otherSection.checkbox('forkService')?.value()) total += (servicePrices['fork-service'] || 0);
if (otherSection.checkbox('suspensionService')?.value()) total += (servicePrices['suspension-service'] || 0);
if (otherSection.checkbox('cleanLube')?.value()) total += 35;
if (otherSection.checkbox('safetyInspection')?.value()) total += 15;
 
return total;
},
variant: 'default',
prefix: '+'
}, '1fr');
});
 
summarySection.addRow(row => {
row.addPriceDisplay('bikeTypeAdjustment', {
label: 'Bike Type Adjustment',
computedValue: () => {
const bikeType = bikeSection.dropdown('bikeType')?.value() || 'standard';
const multiplier = bikeMultipliers[bikeType] || 1;
if (multiplier === 1) return 0;
 
// Calculate base services total
const tuneup = tuneupSection.radioButton('tuneupLevel')?.value() || 'none';
let baseTotal = tuneup !== 'none' ? servicePrices[tuneup] || 0 : 0;
 
const wheelCount = wheelSection.integer('wheelCount')?.value() || 1;
const spokeCount = wheelSection.integer('spokeCount')?.value() || 1;
 
if (brakeSection.checkbox('brakeAdjust')?.value()) baseTotal += (servicePrices['brake-adjust'] || 0);
if (brakeSection.checkbox('brakePads')?.value()) baseTotal += (servicePrices['brake-pads'] || 0);
if (brakeSection.checkbox('brakeCable')?.value()) baseTotal += (servicePrices['brake-cable'] || 0);
if (brakeSection.checkbox('hydraulicBleed')?.value()) baseTotal += (servicePrices['hydraulic-bleed'] || 0);
if (drivetrainSection.checkbox('derailleurAdjust')?.value()) baseTotal += (servicePrices['derailleur-adjust'] || 0);
if (drivetrainSection.checkbox('cableReplace')?.value()) baseTotal += (servicePrices['cable-replace'] || 0);
if (drivetrainSection.checkbox('chainReplace')?.value()) baseTotal += (servicePrices['chain-replace'] || 0);
if (drivetrainSection.checkbox('cassetteReplace')?.value()) baseTotal += (servicePrices['cassette-replace'] || 0);
if (drivetrainSection.checkbox('chainringReplace')?.value()) baseTotal += (servicePrices['chainring-replace'] || 0);
if (drivetrainSection.checkbox('bottomBracket')?.value()) baseTotal += (servicePrices['bottom-bracket'] || 0);
if (wheelSection.checkbox('flatRepair')?.value()) baseTotal += (servicePrices['flat-repair'] || 0) * wheelCount;
if (wheelSection.checkbox('tubeReplace')?.value()) baseTotal += (servicePrices['tube-replace'] || 0) * wheelCount;
if (wheelSection.checkbox('tireReplace')?.value()) baseTotal += (servicePrices['tire-replace'] || 0) * wheelCount;
if (wheelSection.checkbox('wheelTrue')?.value()) baseTotal += (servicePrices['wheel-true'] || 0) * wheelCount;
if (wheelSection.checkbox('hubService')?.value()) baseTotal += (servicePrices['hub-service'] || 0) * wheelCount;
if (wheelSection.checkbox('spokeReplace')?.value()) baseTotal += (servicePrices['spoke-replace'] || 0) * spokeCount;
if (otherSection.checkbox('headsetAdjust')?.value()) baseTotal += (servicePrices['headset-adjust'] || 0);
if (otherSection.checkbox('headsetReplace')?.value()) baseTotal += (servicePrices['headset-replace'] || 0);
if (otherSection.checkbox('forkService')?.value()) baseTotal += (servicePrices['fork-service'] || 0);
if (otherSection.checkbox('suspensionService')?.value()) baseTotal += (servicePrices['suspension-service'] || 0);
if (otherSection.checkbox('cleanLube')?.value()) baseTotal += 35;
if (otherSection.checkbox('safetyInspection')?.value()) baseTotal += 15;
 
return Math.round(baseTotal * (multiplier - 1));
},
variant: 'default',
prefix: '+'
}, '1fr');
row.addPriceDisplay('extras', {
label: 'Additional Options',
computedValue: () => {
let total = 0;
if (optionsSection.checkbox('pickup')?.value()) total += 25;
return total;
},
variant: 'default',
prefix: '+'
}, '1fr');
});
 
const finalSection = form.addSubform('final', {
title: '๐Ÿงพ Summary',
isCollapsible: false,
sticky: 'bottom'
});
 
finalSection.addRow(row => {
row.addPriceDisplay('totalPrice', {
label: 'Total Estimate',
computedValue: () => {
const bikeType = bikeSection.dropdown('bikeType')?.value() || 'standard';
const multiplier = bikeMultipliers[bikeType] || 1;
const wheelCount = wheelSection.integer('wheelCount')?.value() || 1;
const spokeCount = wheelSection.integer('spokeCount')?.value() || 1;
 
// Tune-up
const tuneup = tuneupSection.radioButton('tuneupLevel')?.value() || 'none';
let total = tuneup !== 'none' ? servicePrices[tuneup] || 0 : 0;
 
// Individual services
if (brakeSection.checkbox('brakeAdjust')?.value()) total += (servicePrices['brake-adjust'] || 0);
if (brakeSection.checkbox('brakePads')?.value()) total += (servicePrices['brake-pads'] || 0);
if (brakeSection.checkbox('brakeCable')?.value()) total += (servicePrices['brake-cable'] || 0);
if (brakeSection.checkbox('hydraulicBleed')?.value()) total += (servicePrices['hydraulic-bleed'] || 0);
if (drivetrainSection.checkbox('derailleurAdjust')?.value()) total += (servicePrices['derailleur-adjust'] || 0);
if (drivetrainSection.checkbox('cableReplace')?.value()) total += (servicePrices['cable-replace'] || 0);
if (drivetrainSection.checkbox('chainReplace')?.value()) total += (servicePrices['chain-replace'] || 0);
if (drivetrainSection.checkbox('cassetteReplace')?.value()) total += (servicePrices['cassette-replace'] || 0);
if (drivetrainSection.checkbox('chainringReplace')?.value()) total += (servicePrices['chainring-replace'] || 0);
if (drivetrainSection.checkbox('bottomBracket')?.value()) total += (servicePrices['bottom-bracket'] || 0);
if (wheelSection.checkbox('flatRepair')?.value()) total += (servicePrices['flat-repair'] || 0) * wheelCount;
if (wheelSection.checkbox('tubeReplace')?.value()) total += (servicePrices['tube-replace'] || 0) * wheelCount;
if (wheelSection.checkbox('tireReplace')?.value()) total += (servicePrices['tire-replace'] || 0) * wheelCount;
if (wheelSection.checkbox('wheelTrue')?.value()) total += (servicePrices['wheel-true'] || 0) * wheelCount;
if (wheelSection.checkbox('hubService')?.value()) total += (servicePrices['hub-service'] || 0) * wheelCount;
if (wheelSection.checkbox('spokeReplace')?.value()) total += (servicePrices['spoke-replace'] || 0) * spokeCount;
if (otherSection.checkbox('headsetAdjust')?.value()) total += (servicePrices['headset-adjust'] || 0);
if (otherSection.checkbox('headsetReplace')?.value()) total += (servicePrices['headset-replace'] || 0);
if (otherSection.checkbox('forkService')?.value()) total += (servicePrices['fork-service'] || 0);
if (otherSection.checkbox('suspensionService')?.value()) total += (servicePrices['suspension-service'] || 0);
if (otherSection.checkbox('cleanLube')?.value()) total += 35;
if (otherSection.checkbox('safetyInspection')?.value()) total += 15;
 
// Bike type multiplier
total *= multiplier;
 
// Rush service
if (optionsSection.checkbox('rushService')?.value()) total *= 1.5;
 
// Pickup/delivery
if (optionsSection.checkbox('pickup')?.value()) total += 25;
 
return Math.round(total);
},
variant: 'large'
}, '1fr');
});
 
finalSection.addRow(row => {
row.addTextPanel('disclaimer', {
computedValue: () => 'Labor only - parts priced separately. Free estimate on drop-off. 30-day warranty on all repairs.',
customStyles: { 'font-size': '0.85rem', 'color': '#64748b', 'font-style': 'italic' }
});
});
 
form.configureSubmitButton({
label: 'Book Service'
});
}
 

Frequently Asked Questions

Can I set different prices for different bike types?

Yes, each bike category (road, mountain, e-bike, carbon) has a multiplier applied to labor costs. Adjust these to reflect the additional expertise and time required.

How do tune-up packages work?

The calculator offers basic, standard, and full overhaul packages at fixed prices. Customers can also skip packages and select individual services a la carte.

Can I add e-bike specific services?

Absolutely. Add services like battery diagnostics, motor service, or controller programming. E-bikes already have a price multiplier applied to standard services.

How do wheel services calculate for both wheels?

Customers can select the number of wheels for services like truing, hub service, or tire installation. The price multiplies accordingly.

Can I offer rush service for quick turnaround?

Yes. Rush service adds a percentage (default 50%) for same-day or next-day completion. You can adjust this fee based on your shop's capacity.