Calculadora de descuento 2x1
Con cinco unidades en una oferta 2x1 paga tres, se lleva dos sin coste y el descuento real es del 40 %. Indique el precio unitario, cuántas unidades lleva y los números de la oferta para ver su descuento y el total a pagar. Gratis en su navegador.
- Gratis
- Funciona en su navegador
- Sin registro
- Sus datos no salen de su equipo
Ejecutar — gratis
Ejemplo resuelto
- Precio unitario
- 10
- Cantidad
- 5
- Cant. a pagar
- 1
- Cant. gratis
- 1
- Tamaño de grupo
- 2
- Ciclos de oferta
- 2
- Resto
- 1
- Ítems de pago
- 3
Las promociones minoristas como 2x1, 3x2 y otras pegatinas de compre-X-lleve-Y-gratis parecen simples en el estante y se vuelven confusas en caja cuando la cantidad del carrito no es múltiplo limpio del ciclo de la oferta. Los compradores quieren un solo número honesto: qué porcentaje de descuento efectivo estoy obteniendo realmente, y cuál es el total a pagar tras aplicar los ítems gratis. Esta calculadora toma un precio de lista unitario, una cantidad de cobro y la X e Y de una oferta compre-X-lleve-Y-gratis, cuenta cuántos ítems son gratis frente a de pago bajo el modelo clásico de ciclos, y devuelve total de lista, total a pagar, ahorro y el porcentaje de descuento efectivo. Las cantidades no positivas se rechazan con un error de validación claro para que carritos absurdos no se conviertan en descuentos falsos.
Cómo se calcula el porcentaje de descuento compre-X-lleve-Y-gratis
Parta de un solo precio de lista unitario expresado en una unidad monetaria. Luego elija quantity, el número de esos ítems idénticos que lleva a caja, que debe ser un entero positivo porque el cobro cuenta unidades enteras. El 2x1 clásico es X igual a uno e Y igual a uno; el 3x2 es X igual a dos e Y igual a uno.
El tamaño de grupo de la oferta es X más Y. Los ciclos completos de oferta equivalen al entero floor de quantity dividido por el tamaño de grupo, y el resto es quantity módulo tamaño de grupo. Los ítems gratis equivalen a ciclos completos por Y más el resto gratis max de cero y resto menos X: sigue pagando los primeros X ítems de un grupo incompleto, y solo los ítems más allá de X en ese resto se vuelven gratis, hasta Y por ciclo completo.
Los ítems de pago equivalen a quantity menos ítems gratis. El porcentaje de descuento efectivo es cien por ahorro dividido por total de lista cuando el total de lista es positivo, y cero cuando el total de lista es cero para que bienes de lista gratis no inventen Infinity. La capacidad no apila cupones, no aplica impuestos sobre ventas, no modela carritos multi-SKU mixtos donde importa la regla del más barato gratis, ni convierte monedas; esas son intenciones de producto separadas con sus propias páginas cuando crezca la cobertura.
Dónde aparecen las calculadoras BOGO en el trabajo real
Compradores de supermercado y ropa comparan sin cesar pegatinas 2x1 con ventas de porcentaje y necesitan un porcentaje de descuento efectivo que tenga en cuenta que el tamaño del carrito no cae en un múltiplo limpio del ciclo de oferta. Comerciantes y operadores de comercio electrónico que construyen páginas de promoción quieren un total a pagar transparente para que el ahorro anunciado coincida con la caja y no disparen las devoluciones por reglas de ítems gratis malentendidas.
Periodismo y sitios de comparación que califican ofertas semanales de supermercado convierten promociones de estante en una sola cifra de porcentaje de descuento para que los lectores clasifiquen ofertas con justicia. Si más adelante necesita carritos multi-SKU del más barato gratis, motores de cupones apilados, totales con impuestos o conversión multi-moneda, trátelos como intenciones de búsqueda y páginas separadas en lugar de sobrecargar esta página de calculadora de descuento 2x1.
Qué puede hacer con ella
2x1 de estante frente a rebajas por porcentaje
Convierta pegatinas compre-X-lleve-Y-gratis en un porcentaje de descuento efectivo para una cantidad real de carrito y compare con promociones de porcentaje fijo.
Comprobaciones de honestidad en páginas de promoción
Calcule totales a pagar y recuentos de ítems gratis para ofertas BOGO anunciadas a fin de que las landing del comerciante coincidan con la aritmética de caja.
Preguntas frecuentes
¿Cómo cuenta los ítems gratis compre-X-lleve-Y-gratis?
Cada grupo completo de X+Y ítems concede Y gratis. Para el resto r sobrante, los extras gratis equivalen a max(0, r − X). Los ítems de pago equivalen a quantity menos ítems gratis.
¿Qué es el porcentaje de descuento efectivo?
Es el verdadero porcentaje sobre lista tras los ítems gratis, no una afirmación nominal de estante.
¿Maneja precios mixtos o carritos multi-SKU?
Las reglas multi-SKU de «el más barato gratis» y los cupones apilados quedan fuera del alcance de esta calculadora.
¿Cuánto cuesta?
La herramienta del navegador es gratis y se ejecuta en local.
¿Por qué con cinco unidades en un 2x1 no ahorro la mitad?
Porque la quinta unidad abre un grupo nuevo que no se completa, y en un grupo incompleto se pagan primero las unidades de compra. Así, de cinco unidades paga tres y recibe dos sin coste: un descuento real del 40 %.
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/bogo-discount \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"unit_price":10,"quantity":5,"buy_qty":1,"free_qty":1}'const res = await fetch("https://api.kit.forhosting.com/life/bogo-discount", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"unit_price": 10,
"quantity": 5,
"buy_qty": 1,
"free_qty": 1
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/life/bogo-discount",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"unit_price": 10,
"quantity": 5,
"buy_qty": 1,
"free_qty": 1
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/life/bogo-discount", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"unit_price":10,"quantity":5,"buy_qty":1,"free_qty":1}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"unit_price":10,"quantity":5,"buy_qty":1,"free_qty":1}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/life/bogo-discount", 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
{
"unit_price": 10,
"quantity": 5,
"buy_qty": 1,
"free_qty": 1
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "life.bogo_discount",
"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
Cómo se calcula el porcentaje de descuento compre-X-lleve-Y-gratis
Esa cifra es unit_price: el precio de estante de un ítem idéntico antes de la promoción, mantenido en una unidad para todo el cálculo a fin de que no se cuele conversión de moneda silenciosa. Después fije buy_qty a X y free_qty a Y para el texto de oferta compre X lleve Y gratis. El total de lista es unit_price por quantity; el total a pagar es unit_price por ítems de pago; el ahorro es total de lista menos total a pagar. La tubería es aritmética de coma flotante determinista: sin semillas aleatorias, sin marcas de reloj, sin llamadas de red y sin deriva de modelo, de modo que entradas idénticas producen siempre el mismo JSON. quantity, buy_qty y free_qty deben ser enteros positivos finitos; cantidades cero o negativas fallan con invalid_input en lugar de inventar un descuento. unit_price negativo falla; unit_price cero se permite y produce totales cero y porcentaje de descuento cero.
Qué envía y qué recibe de vuelta
Comprobaciones clásicas incluyen precio unitario diez con cantidad cinco bajo 2x1: ítems gratis dos, de pago tres, lista cincuenta, a pagar treinta, ahorro veinte, descuento cuarenta por ciento. Otra es precio unitario doce con cantidad siete bajo 3x2: ítems gratis dos, de pago cinco, lista ochenta y cuatro, a pagar sesenta, ahorro veinticuatro, descuento cerca de veintiocho punto cinco siete. Envíe cuatro campos obligatorios. unit_price es un número finito mayor o igual que cero para el precio de lista de un ítem. quantity es un entero positivo de cuántos ítems lleva. buy_qty es un entero positivo X del lado de pago del ciclo de oferta. free_qty es un entero positivo Y de ítems gratis concedidos tras cada bloque de pago completo de X. Campos ausentes, cadenas no numéricas, NaN, Infinity, campos de cantidad fraccionarios, cantidades cero o negativas y unit_price negativo fallan con invalid_input y no se cobran. Si tiene éxito, la respuesta repite unit_price, quantity, buy_qty y free_qty limpios, informa group_size como X más Y, deal_cycles como grupos completos, remainder como ítems sobrantes, paid_items y free_items como el reparto del cobro, list_total y payable_total y savings como cifras monetarias en la misma unidad, y discount_percent como el porcentaje efectivo sobre el total de lista. deal_label es una cadena humana breve como compre 1 lleve 1 gratis, method es bogo_discount, y formula documenta free_items igual a floor de quantity sobre X más Y por Y más max de cero y remainder menos X para que blogs y cartas de oferta citen la misma expresión. Una petición de cantidad cero o negativa falla con invalid_input duro que menciona cantidades no positivas. El precio de las llamadas API correctas es la base publicada de $0.002 por ítem; los fallos de validación no consumen saldo prepago.
Dónde aparecen las calculadoras BOGO en el trabajo real
Educadores de finanzas personales que enseñan matemáticas del consumidor asignan hojas BOGO y necesitan JSON determinista para autoevaluadores en lugar de totales a mano que derivan con el redondeo. Equipos de producto que envían widgets de carrito reutilizan la misma aritmética de ciclo en navegador y API para que maquetas sin conexión y producción nunca discrepen. Como esta capacidad es un motor parse puro, el precio de la API es la base publicada de $0.002 por ítem correcto y la validación fallida no consume saldo.
Casos de integración
Fixtures de matemáticas del consumidor y autoevaluadores
Produzca en masa totales de lista frente a a pagar para problemas BOGO de aula y rechace cantidades no positivas con invalid_input duro.
Preguntas técnicas
¿Qué entradas se rechazan?
quantity, buy_qty o free_qty no positivos o no enteros; unit_price negativo; campos ausentes; NaN o Infinity. Fallan con invalid_input y no se cobran.