Reparto de cuenta por partidas
En una cuenta de 35 en comida, con 2,8 de impuesto y 6,3 de propina, Alice, que pidió 20,5, debe 25,83 y Bob, 18,27. Asigne cada plato y bebida a una persona, y el impuesto y la propina siguen lo que cada uno consumió. Gratis en su navegador.
- Gratis
- Funciona en su navegador
- Sin registro
- Sus datos no salen de su equipo
Ejecutar — gratis
Ejemplo resuelto
- Tax
- 2,8
- Servicio
- 6,3
- Cantidad de elementos
- 4
- Número de personas
- 2
- Total de comida
- 35
- Total general
- 44,1
Las cuentas de restaurante y los pedidos en grupo rara vez son justos cuando todos pagan la misma parte de un total compartido. Esta calculadora de reparto de cuenta por partidas le permite asignar cada plato, bebida o línea a una persona con nombre, sumar el subtotal de comida de esa persona y repartir el impuesto absoluto y el cargo de servicio del ticket en proporción a esos subtotales, de modo que los pedidos mayores asuman una porción mayor del impuesto y de la propina.
Cómo funcionan la asignación de partidas y el impuesto y servicio proporcionales
Parta del ticket impreso o de la aplicación como lista de líneas, no como un único total. Cada línea lleva un importe en una moneda y una cadena person que identifica quién pidió o acordó pagar ese plato. Las líneas con la misma cadena person se agrupan en un subtotal de comida para ese comensal.
La calculadora toma el importe absoluto de impuesto y el cargo de servicio o propina del ticket y asigna ambos con la regla proporcional clásica: la parte de impuesto de cada persona es el impuesto multiplicado por su subtotal dividido por el total de comida de la mesa, y la misma ratio multiplica el importe de servicio. Sumar las tres piezas da lo que debe esa persona: subtotal de comida más parte de impuesto más parte de servicio.
Es el reparto equitativo que la gente ya hace en servilletas cuando un invitado pidió un filete y otro solo una ensalada, pero sin errores de redondeo manual que dejen céntimos sin cuadrar. El reparto igual de toda la cuenta, incluido impuesto y propina entre N cabezas, es otra intención de producto cubierta en otra parte; aquí la intención SEO es la asignación por partidas con sobrecostes proporcionales.
Cuando el total de comida es cero e impuesto o servicio siguen siendo positivos, la ratio dividiría entre cero, así que el motor rechaza esa combinación en lugar de inventar cuotas arbitrarias. Cuando todas las líneas son gratuitas e impuesto y servicio son cero, cada total por persona es cero y la llamada sigue teniendo éxito por completitud.
Cuándo conviene repartir la cuenta por platos
Cenas de grupo, almuerzos de coworking y pedidos a domicilio compartidos necesitan un desglose neutral que todos puedan auditar línea a línea en lugar de discutir por mitades iguales. Las demos de hostelería y las herramientas de formación de punto de venta pueden mostrar cómo el impuesto y el servicio se vinculan a quien realmente pidió, en lugar de repartir cuotas fijas entre asientos que no consumieron nada.
Mantenga las listas en tamaños de mesa ordinarios, fije en tests los totales redondeados por persona y obtendrá liquidaciones reproducibles para chats de grupo, ejemplos LMS y workers en el borde sin montar una hoja de cálculo ni un motor de propinas a medida en cada idioma que publique.
Qué puede hacer con ella
Mesas de restaurante con pedidos distintos
Asigne cada plato y bebida a un comensal, pegue las líneas de impuesto y propina del ticket y vea exactamente lo que debe cada persona sin reparto igual.
Entrega a domicilio y comida para llevar en grupo
Asigne las líneas del carrito a compañeros de piso o de trabajo y reparta el impuesto y las tasas de servicio de la entrega en proporción al subtotal de comida de cada uno.
Preguntas frecuentes
¿Impuesto y servicio son porcentajes o importes de dinero?
Importes de dinero absolutos en la misma moneda que las partidas. Copie el impuesto y la propina o cargo de servicio del recibo; se reparten por ratio de subtotal de comida, no por cabezas iguales.
¿Qué ocurre si dos personas comparten un plato?
Divida el plato en dos líneas (mitad de importe cada una) asignadas a cada persona, o asigne la línea completa a una y liquide la mitad en privado.
¿Cómo se reparten el impuesto y la propina entre las personas?
En proporción a lo que cada uno pidió de comida: su parte del impuesto es el impuesto por su subtotal dividido entre el total de comida, y lo mismo con la propina. Con 20,5 de 35, a Alice le tocan 1,64 de impuesto y 3,69 de propina.
¿Por qué no dividir la cuenta a partes iguales?
Porque quien pidió solo una ensalada pagaría lo mismo que quien comió un filete, impuesto y propina incluidos. Aquí cada persona paga sus platos más la parte de los recargos que le corresponde; para un reparto igual, use una calculadora de división a partes iguales.
¿Cómo anoto varios platos de la misma persona?
Escriba exactamente el mismo nombre en cada línea de esa persona. Las líneas con el mismo nombre se suman en un solo subtotal, así que la hamburguesa y las patatas de Alice quedan en 20,5 antes de repartir impuesto y propina.
Herramientas relacionadas
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/life/itemized-bill-split \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"items":[{"description":"Burger","amount":14.5,"person":"Alice"},{"description":"Salad","amount":11,"person":"Bob"},{"description":"Fries","amount":6,"person":"Alice"},{"description":"Soda","amount":3.5,"person":"Bob"}]}'const res = await fetch("https://api.kit.forhosting.com/life/itemized-bill-split", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"items": [
{
"description": "Burger",
"amount": 14.5,
"person": "Alice"
},
{
"description": "Salad",
"amount": 11,
"person": "Bob"
},
{
"description": "Fries",
"amount": 6,
"person": "Alice"
},
{
"description": "Soda",
"amount": 3.5,
"person": "Bob"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/itemized-bill-split",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"items": [
{
"description": "Burger",
"amount": 14.5,
"person": "Alice"
},
{
"description": "Salad",
"amount": 11,
"person": "Bob"
},
{
"description": "Fries",
"amount": 6,
"person": "Alice"
},
{
"description": "Soda",
"amount": 3.5,
"person": "Bob"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/itemized-bill-split", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"items":[{"description":"Burger","amount":14.5,"person":"Alice"},{"description":"Salad","amount":11,"person":"Bob"},{"description":"Fries","amount":6,"person":"Alice"},{"description":"Soda","amount":3.5,"person":"Bob"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"items":[{"description":"Burger","amount":14.5,"person":"Alice"},{"description":"Salad","amount":11,"person":"Bob"},{"description":"Fries","amount":6,"person":"Alice"},{"description":"Soda","amount":3.5,"person":"Bob"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/itemized-bill-split", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"items": [
{
"description": "Burger",
"amount": 14.5,
"person": "Alice"
},
{
"description": "Salad",
"amount": 11,
"person": "Bob"
},
{
"description": "Fries",
"amount": 6,
"person": "Alice"
},
{
"description": "Soda",
"amount": 3.5,
"person": "Bob"
}
]
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.itemized_bill_split",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |
Notas técnicas
Listas de partidas vacías, importes negativos, nombres de persona en blanco e impuesto o servicio positivos sobre un subtotal de comida cero fallan con un error invalid_input claro y no se facturan.
Contrato de entrada, campos de respuesta y reglas de validación
Cada objeto necesita amount como número finito no negativo y person como nombre o id corto no vacío; description opcional etiqueta el plato en el desglose devuelto. Ambos sobrecostes son importes de dinero absolutos en la misma moneda que las líneas, no puntos porcentuales, de modo que usted copia las líneas de impuesto y propina del recibo directamente. Envíe por POST un cuerpo JSON con un array items obligatorio de uno a doscientos objetos. Se aceptan los alias lines, line_items, dishes y orders para el array cuando su cliente ya usa esas claves. El tax opcional vale cero por defecto y acepta alias tax_amount, sales_tax y vat; el service opcional vale cero por defecto y acepta service_amount, service_charge, tip y gratuity. Items ausentes, arrays vacíos, importes de línea negativos, cadenas person en blanco, tax o service negativos y números no finitos fallan con invalid_input indicando el problema; esos fallos nunca consumen saldo prepago. En éxito el cuerpo devuelve item_count, person_count, la lista items normalizada con index, description, amount y person, food_total, tax, service, grand_total y un array people ordenado por la primera aparición de cada cadena person. Cada fila de people incluye person, subtotal, share_ratio, tax_share, service_share, total e item_count. Los campos de dinero usan redondeo half-up a dos decimales con ajuste residual en la última persona de subtotal positivo para que las partes de impuesto redondeadas sumen tax, las de servicio sumen service y los totales por persona sumen grand_total. method es itemized_proportional_tax_service y formula reafirma la regla proporcional para mostrarla junto al resultado.
Dónde aporta valor una API de reparto de cuenta por partidas
Los bots de gastos y reembolso pueden aceptar el mismo payload estructurado que recoge un formulario móvil y devolver totales por persona listos para un mensaje de liquidación o un asiento contable. Como la implementación es aritmética analítica de nivel A sin tokens de modelo ni red saliente, cada llamada exitosa cuesta el precio base publicado $0.002, y los fallos de validación son gratuitos.
Casos de integración
Bots de gastos y aplicaciones de liquidación
Llame a un endpoint prepago estable que devuelve totales por persona listos para mensajes de reembolso, libros mayores o interfaces de solicitud de reparto.
Preguntas técnicas
¿Cómo funciona la calculadora de reparto de cuenta por partidas?
Envíe items como líneas {amount, person}, más tax y service absolutos opcionales. El total de cada persona es su subtotal de comida más una parte proporcional de impuesto y servicio según subtotal sobre food_total.
¿Qué errores devuelve la calculadora?
invalid_input ante items vacíos, importes negativos, nombres de persona en blanco, tax o service negativos, o tax/service positivos cuando food_total es cero. Esos fallos no se facturan.
¿Cuánto cuesta la calculadora de reparto de cuenta por partidas?
La herramienta del navegador es gratuita. Las peticiones API usan saldo prepago KIT a $0.002 por llamada exitosa; la entrada inválida no se cobra.