For Massage & Wellness

Stop Answering
"How Much for a Massage?"
Let a Calculator Do It

Free pricing calculator for your massage or spa website. Clients build custom packages. You get more bookings. Setup in 5 minutes.

No credit card required
Free forever for calculators
Works on Wix, WordPress, any site
💆 Massage & Spa Calculator
💆 Massage Type
 
⏱️ Session
✨ Enhancements
 
📦 Package
 
💰 Your Quote
$ 80.00
💡 Suggested gratuity (20%): $16
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
export function massageWellnessForm(form: FormTs) {
form.setTitle(() => '💆 Massage & Spa Calculator');
 
form.configureCompletionScreen({
type: 'text',
title: () => '🧘 Booking Ready!',
message: () => 'Your treatment package is ready. Book your relaxation session today!'
});
 
const typeRates: Record<string, number> = {
'swedish': 80,
'deep-tissue': 95,
'hot-stone': 110,
'sports': 100,
'prenatal': 90,
'couples': 160
};
 
const typeSection = form.addSubform('type', {
title: () => '💆 Massage Type',
mobileBreakpoint: 0
});
 
typeSection.addRow(row => {
row.addRadioButton('massageType', {
label: 'Select Type',
options: [
{ id: 'swedish', name: '🌿 Swedish ($80/hr)' },
{ id: 'deep-tissue', name: '💪 Deep Tissue ($95/hr)' },
{ id: 'hot-stone', name: '🪨 Hot Stone ($110/hr)' },
{ id: 'sports', name: '🏃 Sports ($100/hr)' },
{ id: 'prenatal', name: '🤰 Prenatal ($90/hr)' },
{ id: 'couples', name: '💑 Couples ($160/hr)' }
],
defaultValue: 'swedish',
orientation: 'vertical',
isRequired: true
});
});
 
const sessionSection = form.addSubform('session', {
title: () => '⏱️ Session',
mobileBreakpoint: 0
});
 
sessionSection.addRow(row => {
row.addDropdown('duration', {
label: 'Duration',
options: [
{ id: '30', name: '30 min (60% rate)' },
{ id: '60', name: '60 min (full rate)' },
{ id: '90', name: '90 min (1.5x rate)' },
{ id: '120', name: '2 hours (2x rate)' }
],
defaultValue: '60'
}, '1fr');
});
 
sessionSection.addRow(row => {
row.addDropdown('therapist', {
label: 'Therapist Level',
options: [
{ id: 'standard', name: 'Licensed Therapist' },
{ id: 'senior', name: 'Senior (+20%)' },
{ id: 'master', name: 'Master (+40%)' }
],
defaultValue: 'standard'
}, '1fr');
 
row.addDropdown('location', {
label: 'Location',
options: [
{ id: 'spa', name: 'Spa/Clinic' },
{ id: 'mobile', name: 'Mobile (+30%)' }
],
defaultValue: 'spa'
}, '1fr');
});
 
const enhanceSection = form.addSubform('enhance', {
title: () => '✨ Enhancements',
mobileBreakpoint: 0
});
 
enhanceSection.addRow(row => {
row.addCheckboxList('enhancements', {
label: 'Select Enhancements',
options: [
{ id: 'aromatherapy', name: '🌸 Aromatherapy (+$15)' },
{ id: 'hotTowels', name: '🔥 Hot Towels (+$10)' },
{ id: 'scalp', name: '💆 Scalp Massage (+$15)' },
{ id: 'cupping', name: '🫙 Cupping (+$25)' }
],
orientation: 'vertical'
});
});
 
const packageSection = form.addSubform('package', {
title: () => '📦 Package',
mobileBreakpoint: 0
});
 
packageSection.addRow(row => {
row.addRadioButton('packageType', {
label: 'Sessions',
options: [
{ id: 'single', name: 'Single Visit' },
{ id: '3', name: '3 Sessions (-5%)' },
{ id: '6', name: '6 Sessions (-10%)' },
{ id: '12', name: '12 Sessions (-15%)' }
],
defaultValue: 'single',
orientation: 'horizontal'
});
});
 
const calculatePrice = () => {
const massageType = typeSection.radioButton('massageType')?.value() || 'swedish';
const duration = parseInt(sessionSection.dropdown('duration')?.value() || '60');
const therapist = sessionSection.dropdown('therapist')?.value() || 'standard';
const location = sessionSection.dropdown('location')?.value() || 'spa';
const packageType = packageSection.radioButton('packageType')?.value() || 'single';
 
let hourlyRate = typeRates[massageType] || 80;
 
const therapistMult: Record<string, number> = { standard: 1, senior: 1.2, master: 1.4 };
hourlyRate *= therapistMult[therapist] || 1;
 
if (location === 'mobile') hourlyRate *= 1.3;
 
let sessionPrice = hourlyRate * (duration / 60);
if (duration === 30) sessionPrice = hourlyRate * 0.6;
 
const selected = enhanceSection.checkboxList('enhancements')?.value() || [];
const enhancementPrices: Record<string, number> = {
aromatherapy: 15,
hotTowels: 10,
scalp: 15,
cupping: 25
};
const enhancements = selected.reduce((total, id) => total + (enhancementPrices[id] || 0), 0);
 
sessionPrice += enhancements;
 
const packageDiscount: Record<string, number> = { single: 0, '3': 5, '6': 10, '12': 15 };
sessionPrice *= (1 - (packageDiscount[packageType] || 0) / 100);
 
return Math.round(sessionPrice);
};
 
const getPackageSessions = () => {
const packageType = packageSection.radioButton('packageType')?.value() || 'single';
const sessions: Record<string, number> = { single: 1, '3': 3, '6': 6, '12': 12 };
return sessions[packageType] || 1;
};
 
const summary = form.addSubform('summary', {
title: () => '💰 Your Quote',
isCollapsible: false
});
 
summary.addRow(row => {
row.addPriceDisplay('sessionPrice', {
label: 'Per Session',
computedValue: () => calculatePrice(),
alignment: 'center',
variant: 'large'
});
});
 
summary.addRow(row => {
row.addTextPanel('package', {
computedValue: () => {
const sessions = getPackageSessions();
const price = calculatePrice();
if (sessions > 1) {
return `📦 ${sessions} sessions = $${sessions * price} total`;
}
const tip = Math.round(price * 0.2);
return `💡 Suggested gratuity (20%): $${tip}`;
},
customStyles: {
fontSize: '0.95rem',
color: '#059669',
textAlign: 'center',
fontWeight: '500'
}
});
});
 
form.configureSubmitButton({
label: () => 'Book Appointment'
});
}
 

Why Massage Therapists Love It

Stop playing phone tag. Let clients customize their perfect treatment and book while they're relaxed.

More Time for Clients

No more pricing calls between sessions. Clients get instant quotes 24/7.

Bigger Tickets

Clients add enhancements when they see the options. Aromatherapy, hot stones, upgrades galore.

Sell Packages

Show package discounts upfront. Clients commit to more sessions when they see the value.

No Coding Required

Describe your services. Our AI builds your calculator in minutes.

Add a Price Calculator in 3 Steps

1

Build Your Calculator

Use our AI assistant or pick a template. Set your treatment prices, durations, and enhancements.

2

Customize Your Look

Match your brand colors and add your logo. Mobile-friendly by default. Looks great everywhere.

3

Embed Anywhere

Copy 2 lines of code. Works on WordPress, Wix, Squarespace, Shopify, or any custom site.

Add to your website
<script src="https://formts.com/widget.js"></script>
<formts-widget link-id="your-calculator"></formts-widget>

Everything You Need to Automate Booking

Real-Time Calculations

Prices update instantly as clients add services. No page reloads, no waiting.

Email Notifications

Get notified the moment someone requests a quote. Never miss a potential client.

Enhancement Upsells

Show add-ons like aromatherapy, hot stones, and CBD upgrades. Clients add more.

Therapist Levels

Set different rates for standard, senior, and specialist therapists.

Works Everywhere

Embed on any website with 2 lines of code. WordPress, Wix, Squarespace, custom sites.

Mobile Optimized

Looks great on phones and tablets. Clients book while relaxing on the couch.

Frequently Asked Questions

Do I need to know how to code?

No. Our AI assistant builds the calculator from your description. Just tell it what treatments you offer and your prices. You can also start from a template and customize it - no coding required.

Will it work on my Wix/WordPress/Squarespace site?

Yes. FormTs works on any website that allows custom HTML. You just paste 2 lines of code where you want the calculator to appear. Works on WordPress, Wix, Squarespace, Shopify, and any custom site.

Is the calculator really free?

Yes. Calculators that don't collect submissions are completely free - no limits, no credit card. If you want to collect client details, the Free plan includes 100 submissions/month. Need more? Pro gives you 1,000/month.

Can I offer package discounts?

Absolutely. You can set discounts for 3-session, 6-session, 12-session packages, or memberships. The calculator shows clients exactly how much they save with commitments.

How do I get notified when someone requests a quote?

All submissions appear in your dashboard instantly. Pro plan includes email notifications and webhooks to connect with Zapier, n8n, Make, or send data directly to your booking software.

Can I charge more for mobile/in-home service?

Yes! You can set location-based pricing for spa visits, mobile/in-home service, corporate chair massage, and hotel visits. The calculator adjusts automatically.

Ready to Stop Wasting Time on Pricing Questions?

Join hundreds of massage therapists and wellness pros who automated their pricing. Start with a free template or let AI build your custom calculator.

No credit card required. Free plan available. Setup in under 10 minutes.