Group dinner cost share calculator
A pizza for two, a steak for one and a salad for three, with 18% tip and 8.5% tax, come to 110.06, and the steak eater pays 59.45 of it. Each dish is divided only among the guests who ate it. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Runs in your browser. Free, unlimited — your data never leaves this page.
Group dinners fall apart at the check when some people split a pizza, one guest orders a solo steak, and everyone still wants a fair tip. Equal head-count splitting forces salad eaters to subsidize seafood towers; assigning whole lines to a single name fails when two friends truly shared an appetizer. This group dinner cost share calculator takes each dish with its price and the exact list of guests who ate it, divides that dish only among those sharers, then sums every guest's food share and applies optional tip and tax percentages on that share.
How per-dish equal share among only the sharers works
Start from the menu as a list of plates rather than one lump total for the table. The calculator divides that dish's price equally among only those listed guests, never among people who sat at the table but did not touch that course. A guest who appears on three shared plates accumulates three fractional shares; a guest who ordered only a solo entrée pays that entrée in full and nothing for courses they skipped.
After every dish is allocated, each guest has a food share equal to the sum of their per-dish pieces. Equal split of the whole bill among N seats is a different product intent covered elsewhere; single-person line assignment with proportional absolute tax and service is also a different intent. Here the SEO focus is explicitly group dinner cost share when dishes have heterogeneous sharing groups.
Duplicate names on one dish are collapsed so one person is not charged twice for the same plate.
Where a group dinner share calculator earns its keep
Family reunions, coworking team dinners, and shared tasting menus need a neutral breakdown that everyone can audit dish by dish instead of arguing over equal halves that ignore who ordered the wine flight. Hospitality demos and point-of-sale training tools can show how a shared pizza and a solo steak produce different fair amounts without forcing staff to split lines by hand.
Keep dish lists within ordinary table sizes, pin the rounded guest totals in tests, and you get reproducible settlements for group chats, LMS examples, and edge workers without standing up a spreadsheet or inventing ad-hoc tip math for every language you ship. Pair this capability with a tip-only equal split tool when the table truly wants head-count fairness; use this one when sharing groups differ by course.
What you can do with it
Family or friend dinners with shared plates
List each course with who actually shared it, add tip and tax percents from the receipt, and see what every guest owes without equal splitting the whole check.
Team lunches and tasting menus
Map shared appetizers and solo mains to coworkers, then distribute tip and tax on each person's food share for a transparent reimbursement request.
FAQ
How does the group dinner cost share calculator work?
Each dish price is split equally among only the guests listed on that dish; tip and tax multiply each guest's food share.
What if only some guests shared a dish?
People who did not share that dish are not charged any part of its price.
Is the tip worked out on the whole bill or on each person's share?
On each guest's food share. Whoever ate more pays more tip and tax, so nobody is charged an equal head tax for dishes they never touched.
What if I list the same guest twice on one dish?
The duplicate is ignored and that person is charged for the dish once. Each plate is split among the distinct names listed for it.
When should I split the bill equally instead?
When the whole table really wants a head-count split. Use this tool when different groups shared different courses, such as a shared pizza next to a solo steak.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/life/dinner-split-by-share \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"dishes":[{"name":"Margherita pizza","price":24,"shared_by":["Alice","Bob"]},{"name":"Ribeye steak","price":36,"shared_by":["Carol"]},{"name":"Caesar salad","price":15,"shared_by":["Alice","Bob","Carol"]},{"name":"Tiramisu","price":12,"shared_by":["Alice","Carol"]}]}'const res = await fetch("https://api.kit.forhosting.com/life/dinner-split-by-share", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"dishes": [
{
"name": "Margherita pizza",
"price": 24,
"shared_by": [
"Alice",
"Bob"
]
},
{
"name": "Ribeye steak",
"price": 36,
"shared_by": [
"Carol"
]
},
{
"name": "Caesar salad",
"price": 15,
"shared_by": [
"Alice",
"Bob",
"Carol"
]
},
{
"name": "Tiramisu",
"price": 12,
"shared_by": [
"Alice",
"Carol"
]
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/dinner-split-by-share",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"dishes": [
{
"name": "Margherita pizza",
"price": 24,
"shared_by": [
"Alice",
"Bob"
]
},
{
"name": "Ribeye steak",
"price": 36,
"shared_by": [
"Carol"
]
},
{
"name": "Caesar salad",
"price": 15,
"shared_by": [
"Alice",
"Bob",
"Carol"
]
},
{
"name": "Tiramisu",
"price": 12,
"shared_by": [
"Alice",
"Carol"
]
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/dinner-split-by-share", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"dishes":[{"name":"Margherita pizza","price":24,"shared_by":["Alice","Bob"]},{"name":"Ribeye steak","price":36,"shared_by":["Carol"]},{"name":"Caesar salad","price":15,"shared_by":["Alice","Bob","Carol"]},{"name":"Tiramisu","price":12,"shared_by":["Alice","Carol"]}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"dishes":[{"name":"Margherita pizza","price":24,"shared_by":["Alice","Bob"]},{"name":"Ribeye steak","price":36,"shared_by":["Carol"]},{"name":"Caesar salad","price":15,"shared_by":["Alice","Bob","Carol"]},{"name":"Tiramisu","price":12,"shared_by":["Alice","Carol"]}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/dinner-split-by-share", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"dishes": [
{
"name": "Margherita pizza",
"price": 24,
"shared_by": [
"Alice",
"Bob"
]
},
{
"name": "Ribeye steak",
"price": 36,
"shared_by": [
"Carol"
]
},
{
"name": "Caesar salad",
"price": 15,
"shared_by": [
"Alice",
"Bob",
"Carol"
]
},
{
"name": "Tiramisu",
"price": 12,
"shared_by": [
"Alice",
"Carol"
]
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.dinner_split_by_share",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
Empty dish lists, negative prices, blank guest names, empty shared_by lists, and out-of-range percents fail with a clear invalid_input error and are not billed.
How per-dish equal share among only the sharers works
Each dish carries a price in a single currency and a shared_by list of guest names or short ids who actually ate or ordered that plate together. Optional tip_percent and tax_percent then multiply that food share so heavier eaters carry a larger tip and tax without inventing an equal head tax. This is the fair-share pattern people already sketch on napkins when half the table shared bread and the other half did not, but without hand-rounding errors that leave a few cents unaccounted for. When every price is free and both percents are zero, every guest total is zero and the call still succeeds for completeness.
Input contract, response fields, and validation rules
Both percent fields must lie between zero and one hundred inclusive. POST a JSON body with a required dishes array of one to two hundred objects. Each object needs price as a finite non-negative number and shared_by as a non-empty array of guest name strings; optional name labels the dish in the echoed breakdown. Aliases items, lines, courses, and plates are accepted for the array when your client already uses those keys. shared_by also accepts aliases sharers, guests, people, and who, and may arrive as a comma-separated string for simple forms. Optional tip_percent defaults to zero and accepts tip_pct, gratuity_percent, and tip; optional tax_percent defaults to zero and accepts tax_pct, vat_percent, and tax. Missing dishes, empty arrays, negative prices, blank guest names, empty shared_by lists, out-of-range percents, and non-finite numbers fail with invalid_input naming the problem; those failures never consume prepaid balance. On success the body returns dish_count, guest_count, the normalized dishes list with index, optional name, price, shared_by, and per_person_share, food_total, tip_percent, tip_total, tax_percent, tax_total, grand_total, and a guests array ordered by first appearance of each guest across dishes. Each guests row includes guest, food_share, tip_share, tax_share, total, and dish_count. Money fields use half-up rounding to two decimal places with a residual adjustment on the last positive food-share guest so rounded tip shares still sum to tip_total, tax shares sum to tax_total, and guest totals sum to grand_total. method is per_dish_equal_share and formula restates the allocation rule for display next to the result.
Where a group dinner share calculator earns its keep
Expense and reimbursement bots can accept the same structured payload a mobile form collects and return per-guest totals ready for a settlement message or a ledger entry. Because the implementation is tier A analytic arithmetic with no model tokens and no outbound network, every successful call costs the published $0.002 base price, and validation failures are free.
Integration use cases
Expense bots and settlement apps
Call a stable prepaid endpoint that returns per-guest totals ready for chat settlements, ledgers, or split-request UIs when dishes have mixed sharers.
Technical questions
Are tip and tax percentages or absolute money amounts?
Percentages of each guest's food share (0–100). The engine multiplies food_share by tip_percent/100 and tax_percent/100 after dishes are allocated.
What errors does the calculator return?
invalid_input for empty dishes, negative prices, blank guest names, empty shared_by lists, or tip/tax percents outside 0–100. Those failures are not billed.
What does the group dinner cost share calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not charged.