Plain-English summary
A service fee is a percentage charge that automatically adds to qualifying orders — most commonly a 10% service charge on dine-in orders. Unlike discounts (which subtract), service fees add. Unlike taxes (which are government-mandated), service fees are restaurant policy. They appear as a separate line on the receipt between Subtotal and Tax.
When you'd use this
- Dine-in service charge (10% is standard in Maldives F&B)
- Delivery fee (flat or percentage, applied to delivery orders)
- Large-party surcharge (groups of 8+, auto-applied when Covers > N)
- Event catering markup
How to access
- URL:
/settings/organization/service-fees(admin backoffice — admin.foodops.io) - Sidebar: Settings → Accounting → Service Fees (moved from the Organization group to Accounting in the new stack)

The legacy
app.foodops.ioService Fees page is retired at the July-2026 launch. The service-fee list + add/edit dialog now live in the admin backoffice, backed byhubits-api-salesSettingsController(service-feesendpoints).
Configuration
The new-stack "New service fee" dialog collects four things:
| Field | Purpose |
|---|---|
| Name | Display label on receipt (e.g., "Service charge", "Delivery fee") |
| Value | The fee amount (a flat amount or a percentage, per Type) |
| Type | Toggle: Fixed or Percent (serviceFeeRateTypeId === 2 = percentage) |
| Apply to order types | Toggles: Dine-in / Delivery / Takeout (default all on) |
[code: foodops-admin-app/apps/admin/src/components/settings/organization/ServiceFeeFormDialog.tsx — payload = {name, value, serviceFeeRateTypeId, taxTypeId, chartOfAccountId, dineInEnabled, deliveryEnabled, takeoutEnabled} @ main]
Warning: Tax Type and Chart of Account fields are BACK (re-added) The legacy form had a per-fee Tax Type dropdown and a Chart of Account dropdown (the latter added by commit
11da4a6in the retired monolith). Both fields were removed in the initial new-stack dialog, then re-added byfoodops-admin-appcommit range2e6faec..4136a33("enhance ServiceFeeFormDialog with tax and account selection"). Tax Type is now a required dropdown (auto-preselects the org's default tax, else the first tax in the list, when creating). Chart of Account is an optional dropdown (defaults to none). The create/edit payload now carries name / value /serviceFeeRateTypeId/taxTypeId/chartOfAccountId/ the three order-type flags —isPercentageis gone, replaced by the numericserviceFeeRateTypeId. (An Active toggle is still not in the add/edit form per this diff; activation is managed from the list, not the dialog.)

Multiple fees can co-exist (e.g., 10% dine-in service + 5% delivery fee). They stack additively.
Auto-apply by order type
A service fee is mapped to the order types it applies to (ServiceFeeOrderType). When an order is created, the order auto-attaches every service-fee type mapped to its order type (filtered to the current org). So a dine-in-only service charge never lands on takeout. [code: hubits-api-sales/Hubits.Sales.Api/Services/Counter/Orders/OrderCreationService.cs:285-298 — query ServiceFeeOrderTypes Where RestaurantOrderTypeId == table.RestaurantOrderTypeId && ApplicationOrganisationId == CallContext.ApplicationOrganisationId, then add a SalesOrderServiceFeeType per match @ main]. A fee only applies if its ServiceFeeType is Active (the read joins ServiceFeeType / ServiceFeeHelper.GetForOrderType).
How it flows through an order
Subtotal (items) MVR 100.00
Service Charge (10%) MVR 10.00
Subtotal + Service MVR 110.00
GST 8% on above MVR 8.80
Total MVR 118.80
Info: Tax is calculated AFTER service fee The service fee increases the taxable base. This is the standard Maldives treatment — service charge is part of the supply, so GST applies on top. Confirm with your accountant if operating in a different jurisdiction.
Note (new stack): the per-fee Tax Type selector was removed from the initial new-stack admin dialog, then re-added as a required dropdown by
foodops-admin-appcommit range2e6faec..4136a33. Each service fee now again carries an explicittaxTypeIdlink, similar to the legacy form. Whether/how this feeds the order-level tax calc (i.e. whether the receipt-row example below still holds) is not yet first-party confirmed — treat as residual until checked.
Key concepts
- Service fee — a non-discretionary charge added by the restaurant. Customer can't opt out (unlike voluntary tips).
- Rate — always a percentage. For flat charges (e.g., MVR 15 delivery fee), use a line item instead of a service fee.
- Tax stacking — service fee is added to subtotal before tax calculation. Receipt shows: Subtotal → Service → Tax → Total.
- Order-type scope — dine-in-only service charges don't hit takeout orders. Configure per order type.
Common questions
Q: Is a service fee the same as a tip? A: No. A service fee is restaurant-set, non-discretionary, appears on every qualifying order, and is part of the restaurant's revenue. A tip is customer-discretionary and goes to staff. Foodops doesn't have a tip-tracking module — tips are handled outside the system.
Q: Can a customer remove the service charge? A: Not from the POS UI — it's auto-applied. A manager can apply a manual discount to offset it in exceptional cases.
Q: Does the service fee show on the kitchen ticket? A: No — kitchen tickets show items only. Service fee appears on the customer-facing receipt and in reports.
Q: Can I set different service-fee rates per outlet?
A: No — in the new stack service fees are org-wide and scoped by order type, not by outlet. The add/edit dialog only offers Dine-in / Delivery / Takeout toggles, and auto-apply at order time filters by organisation + order type, not outlet (OrderCreationService.cs:285-298). Per-outlet service-fee rates are not configurable.
Q: How does the Day Summary report handle service fees? A: Service Charge has its own line in the Sales Summary block — tracked separately from Subtotal, Tax, and Discounts.
Success: Verified 2026-04-16 · playwright Status:
stable· Review due: 2026-07-15 Settings page verified on app.foodops.io. Tax-stacking order (service fee before tax) confirmed from receipt structure in existing POS walkthrough.
Note: Code + Playwright verified 2026-05-04 · codebase + live E2E Verified_by:
playwright· Last verified: 2026-05-04 ·haafai.app.foodops:11da4a6Playwright pass (2026-05-04) confirmed: the add/edit form at/settings/servicefees/addeditshows Name / Rate Type (Fixed Amount | Percentage) / Amount / Tax Type / Chart of Account (dropdown, defaults to "-- Select Chart of Account --") / Apply to Order Types (Dine-In / Delivery / Takeout checkboxes) / Save / Cancel (screenshot 169). Chart of Account field confirmed as user-visible — documentation updated. Code-verified claims unchanged; source_repos curated to real Razor monolith path.
Note: Re-pointed after backend microservice split 2026-06-03 · codebase Verified_by:
codebase· Last verified: 2026-06-03 ·haafai.app.foodops:bf7c9d2+foodops-admin-app:f3ae3e9Addedhaafai/foodops-admin-app(backoffice settings UI, prodmain) with globapps/admin/src/{pages/settings/organization/ServiceFeesPage.tsx,components/settings/organization/ServiceFeeFormDialog.tsx,components/settings/organization/DeleteServiceFeeDialog.tsx}— the service-fees list + add/edit + delete in the React backoffice. Paths verified viagh api ...?ref=main. Monolith glob still resolves onmain; re-pinned from the 2026-04-05 commit11da4a6to prod HEADbf7c9d2. Did NOT addfoodops.apiorhubits.microservices.
Important: Re-verified 2026-06-29 · codebase — NEW-STACK re-point (legacy app.foodops retired) Verified_by:
codebase·foodops-admin-app:f6ffd0b+hubits-api-sales:19190b9+haafai.domain:e138944Legacyhaafai.app.foodopsremoved fromsource_repos. CHANGES vs the retired monolith: (1) URL/settings/servicefees→/settings/organization/service-fees, page moved to the Accounting settings group; (2) add/edit dialog reduced to Name / Value / Type(Fixed|Percent) / Apply-to-order-types — Tax Type and Chart of Account fields removed (ServiceFeeFormDialog.tsxpayload); (3) added the code-confirmed auto-apply-by-order-type mechanism (OrderCreationService.cs:285-298,ServiceFeeOrderType); (4) corrected the "per-outlet rates" Q&A — fees are org-wide + per-order-type, not per-outlet. RESIDUAL: tax-on-service-fee calc behaviour and the list-level Active toggle not first-party-confirmed.
Related
- Settings Overview — configuration location
- POS Takeaway Order — receipt where service fee appears
- Dine-In & Tables — most common service-fee use case