1. Pax Breakdown & Bed Allocation Rules
Adults and CWB absorb hotel bed costs; CNB and Infants pay zero hotel charges.
2. Multi-Supplier Accommodation Items
Itemize Makkah, Madinah, or Transit hotels with supplier attribution.
3. Multi-Supplier Ground Transport
Select standard Umrah routes or add custom city tours & private vehicles.
4. Flights & Visa Module (Supplier Breakdown)
Per-passenger airline tickets & Umrah e-visas with supplier tagging.
1. Group Size & Dedicated Vehicle Allocation
Total vehicle cost is divided equally across all group passengers.
2. Multi-Hotel Accommodation (3-Tier Sharing Matrix)
Enter Double (DBL/2), Triple (TRPL/3), and Quad (QUAD/4) night rates simultaneously.
3. Flights, Visas & Fixed Inclusions (Per Person)
Fixed costs added equally to each passenger regardless of room sharing tier.
Hotel Quad + Fixed
0 PKRHotel Triple + Fixed
0 PKRHotel Double + Fixed
0 PKRLive Profitability & Markup
Real-time P&L Simulator
Saved Packages & Central Quotation Repository
Centralized team repository & historical quotes synced live with Google Sheets (Package_Logs). Can be restored into the active calculator with 1-click.
| Quote ID | Date | Client Reference | Pax Summary | Total Cost (PKR) | Selling Price (PKR) | Net Profit | Status | Actions |
|---|
Centralized Google Sheets Quotation Repository
All quotations and cost calculations are centrally stored and synchronized across all Admin and Sales Agent devices in real time.
https://script.google.com/macros/s/AKfycbyLLdgfkdVfdzXpmb7NB-IwPrYhXk3bgxO4jVTK2bfUDAa9nYAJ0tXKL2DFtWqVDKZP/exec
⚙️ Advanced: Custom Webhook Endpoint Override
function doPost(e) {
var lock = LockService.getScriptLock();
lock.tryLock(10000);
try {
var doc = SpreadsheetApp.getActiveSpreadsheet();
var sheet = doc.getSheetByName('Package_Logs');
if (!sheet) {
sheet = doc.insertSheet('Package_Logs');
sheet.appendRow([
"Timestamp", "Quote ID", "Client Name", "Pax Summary",
"Hotels Summary", "Transport Sectors", "Total Cost (PKR)",
"Markup %", "Net Profit (PKR)", "Total Selling (PKR)",
"Adult Price (PKR)", "CWB Price (PKR)", "CNB Price (PKR)", "Infant Price (PKR)"
]);
// Format headers
sheet.getRange(1, 1, 1, 14).setBackground("#064E3B").setFontColor("#FFFFFF").setFontWeight("bold");
}
var d = JSON.parse(e.postData.contents);
sheet.appendRow([
new Date(), d.quoteId, d.clientName, d.paxSummary,
d.hotelsSummary, d.transportSummary, d.totalCostPKR,
d.markupPercent, d.netProfitPKR, d.totalSellingPKR,
d.adultPricePKR, d.cwbPricePKR, d.cnbPricePKR, d.infantPricePKR
]);
return ContentService.createTextOutput(JSON.stringify({ result: "success" })).setMimeType(ContentService.MimeType.JSON);
} catch (err) {
return ContentService.createTextOutput(JSON.stringify({ result: "error", error: err.toString() })).setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}