Resort Package Cost Comparison Calculator
ANA›Life Services Authority›National Calculator Authority›Resort Package Cost Comparison Calculator
.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }
Resort Package Cost Comparison Calculator
Compare two resort packages side-by-side to determine the true total cost per person per night, including all fees, meals, and activities.
### Package A
Package Name
Number of Nights
Number of Guests
Room Rate per Night ($)
Meal Plan Cost per Person per Night ($)
Activities / Excursions Total ($)
Resort Fee per Night ($)
Tax Rate (%)
Package Discount (%)
### Package B
Package Name
Number of Nights
Number of Guests
Room Rate per Night ($)
Meal Plan Cost per Person per Night ($)
Activities / Excursions Total ($)
Resort Fee per Night ($)
Tax Rate (%)
Package Discount (%)
Compare Packages
###
Base Room Cost Meal Plan Cost Activities Cost Resort Fees Subtotal Discount Tax Total Cost Cost per Person Cost per Person/Night
###
Base Room Cost Meal Plan Cost Activities Cost Resort Fees Subtotal Discount Tax Total Cost Cost per Person Cost per Person/Night
function resCalc() { const errEl = document.getElementById('res-error'); const resultEl = document.getElementById('res-result'); errEl.style.display = 'none'; resultEl.style.display = 'none';
// --- Read inputs --- const aName = document.getElementById('res-a-name').value.trim() || 'Package A'; const aNights = parseFloat(document.getElementById('res-a-nights').value); const aGuests = parseFloat(document.getElementById('res-a-guests').value); const aRoom = parseFloat(document.getElementById('res-a-room').value); const aMeals = parseFloat(document.getElementById('res-a-meals').value) || 0; const aAct = parseFloat(document.getElementById('res-a-activities').value) || 0; const aFee = parseFloat(document.getElementById('res-a-resort-fee').value) || 0; const aTax = parseFloat(document.getElementById('res-a-tax').value) || 0; const aDisc = parseFloat(document.getElementById('res-a-discount').value) || 0;
const bName = document.getElementById('res-b-name').value.trim() || 'Package B'; const bNights = parseFloat(document.getElementById('res-b-nights').value); const bGuests = parseFloat(document.getElementById('res-b-guests').value); const bRoom = parseFloat(document.getElementById('res-b-room').value); const bMeals = parseFloat(document.getElementById('res-b-meals').value) || 0; const bAct = parseFloat(document.getElementById('res-b-activities').value) || 0; const bFee = parseFloat(document.getElementById('res-b-resort-fee').value) || 0; const bTax = parseFloat(document.getElementById('res-b-tax').value) || 0; const bDisc = parseFloat(document.getElementById('res-b-discount').value) || 0;
// --- Validation --- const errors = []; if (isNaN(aNights) || aNights 50) errors.push('Package A: Tax rate must be between 0 and 50%.'); if (aDisc 100) errors.push('Package A: Discount must be between 0 and 100%.');
if (isNaN(bNights) || bNights 50) errors.push('Package B: Tax rate must be between 0 and 50%.'); if (bDisc 100) errors.push('Package B: Discount must be between 0 and 100%.');
if (errors.length > 0) { errEl.innerHTML = errors.join(''); errEl.style.display = 'block'; return; }
// --- Formula --- // Base Room Cost = Room Rate × Nights // Meal Plan Cost = Meal Rate × Guests × Nights // Resort Fee Total = Resort Fee × Nights // Subtotal = Base Room + Meal Plan + Activities + Resort Fee Total // Discount Amount = Subtotal × (Discount% / 100) // After Discount = Subtotal − Discount Amount // Tax Amount = After Discount × (Tax% / 100) // Total Cost = After Discount + Tax Amount // Cost per Person = Total Cost / Guests // Cost per Person/Night = Total Cost / (Guests × Nights)
function calcPackage(nights, guests, room, meals, act, fee, tax, disc) { const baseRoom = room * nights; const mealTotal = meals * guests * nights; const feeTotal = fee * nights; const subtotal = baseRoom + mealTotal + act + feeTotal; const discAmt = subtotal * (disc / 100); const afterDisc = subtotal - discAmt; const taxAmt = afterDisc * (tax / 100); const total = afterDisc + taxAmt; const perPerson = total / guests; const ppn = total / (guests * nights); return { baseRoom, mealTotal, act, feeTotal, subtotal, discAmt, taxAmt, total, perPerson, ppn }; }
const A = calcPackage(aNights, aGuests, aRoom, aMeals, aAct, aFee, aTax, aDisc); const B = calcPackage(bNights, bGuests, bRoom, bMeals, bAct, bFee, bTax, bDisc);
const fmt = v => '$' + v.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ',');
// --- Populate Package A --- document.getElementById('res-title-a').textContent = aName; document.getElementById('res-a-base').textContent = fmt(A.baseRoom); document.getElementById('res-a-meal-total').textContent = fmt(A.mealTotal); document.getElementById('res-a-act-total').textContent = fmt(A.act); document.getElementById('res-a-fee-total').textContent = fmt(A.feeTotal); document.getElementById('res-a-subtotal').textContent = fmt(A.subtotal); document.getElementById('res-a-disc-amt').textContent = '−' + fmt(A.discAmt); document.getElementById('res-a-tax-amt').textContent = fmt(A.taxAmt); document.getElementById('res-a-total').textContent = fmt(A.total); document.getElementById('res-a-per-person').textContent = fmt(A.perPerson); document.getElementById('res-a-ppn').textContent = fmt(A.ppn);
// --- Populate Package B --- document.getElementById('res-title-b').textContent = bName; document.getElementById('res-b-base').textContent = fmt(B.baseRoom); document.getElementById('res-b-meal-total').textContent = fmt(B.mealTotal); document.getElementById('res-b-act-total').textContent = fmt(B.act); document.getElementById('res-b-fee-total').textContent = fmt(B.feeTotal); document.getElementById('res-b-subtotal').textContent = fmt(B.subtotal); document.getElementById('res-b-disc-amt').textContent = '−' + fmt(B.discAmt); document.getElementById('res-b-tax-amt').textContent = fmt(B.taxAmt); document.getElementById('res-b-total').textContent = fmt(B.total); document.getElementById('res-b-per-person').textContent = fmt(B.perPerson); document.getElementById('res-b-ppn').textContent = fmt(B.ppn);
// --- Verdict --- const verdictEl = document.getElementById('res-verdict'); const diff = Math.abs(A.ppn - B.ppn); const pctDiff = ((diff / Math.max(A.ppn, B.ppn)) * 100).toFixed(1);
if (A.ppn ✅ ${aName} is the better value by ${fmt(diff)} per person per night (${pctDiff}% cheaper on a per-person-per-night basis).;
} else if (B.ppn ✅ ${bName} is the better value by **${fmt(diff)}** per person per night (**${pctDiff}% cheaper** on a per-person-per-night basis).;
} else {
verdictEl.innerHTML = **Both packages have identical cost per person per night (${fmt(A.ppn)}).**;
}
resultEl.style.display = 'block'; }
#### Formulas Used
Base Room Cost = Room Rate per Night × Number of Nights Meal Plan Cost = Meal Rate per Person per Night × Guests × Nights Resort Fee Total = Resort Fee per Night × Number of Nights Subtotal = Base Room Cost + Meal Plan Cost + Activities + Resort Fee Total Discount Amount = Subtotal × (Discount% ÷ 100) After Discount = Subtotal − Discount Amount Tax Amount = After Discount × (Tax% ÷ 100) Total Cost = After Discount + Tax Amount Cost per Person = Total Cost ÷ Number of Guests Cost per Person per Night = Total Cost ÷ (Guests × Nights)
#### Assumptions & References
- Comparison metric is cost per person per night to normalise packages with different durations and guest counts.
- Reference: American Hotel & Lodging Association (AHLA) — Hotel Fee Transparency Guidelines, 2023.
- Reference: STR Global — Hotel Industry Benchmarking & Pricing Standards, 2023.
More Calculators
- Sleep Needs Calculator
- Window Energy Performance Calculator
- Appliance Energy Cost Calculator
- Appliance Repair vs. Replace Calculator
- Appliance Lifespan & Replacement Cost Calculator
- Auto Repair Cost Estimator
Read Next
Study Time Planner Authority Network America › Life Services Authority › National Calculator Authority .calc-container { max-width: 640px;...