Guía: Lectura desde GET · ← Condiciones · Efectos →
rule_application — referencia completa
:::info Campo en la respuesta GET
En GET /points y GET /points/{id}, este bloque viene en rule_application (string JSON). Tras parsear, la raíz interna es application.and[] (no conditions).
:::
Índice
- Aplicación por
when - Aplicación en evento personalizado
- Qué hace (y qué no hace)
- Vacío vs definido
- Caso típico: sin condiciones de victoria, solo aplicación
- Dos familias de aplicación
- Subcondiciones anidadas en líneas: solo
quantity - Gramática compartida con condiciones de líneas
- Bundle / 2x1:
quantityen aplicación - Aplicación sobre
additional_costs - Aplicación sobre métodos de pago (solo carrito)
- JSON maestro de referencia — aplicación en líneas
- Condiciones de victoria + aplicación distinta (caso frecuente)
- Obligatoriedad (porcentaje / ratio)
- Errores frecuentes —
rule_application
Aplicación por when
when | rule_application en Owner App / GET |
|---|---|
Carrito (after_create_activity) | Líneas (array_field: lines: producto, categoría, atributos), additional_costs.*, y métodos de pago (array_field: payments) — ver Aplicación sobre pagos. Misma familia que descuentos en líneas, con pagos además en aplicación (en descuentos el pago suele ir solo en condiciones). |
| Evento personalizado | Un solo atributo numérico de la entidad custom sobre el que se calcula el efecto — ver Aplicación en evento personalizado. |
| Trigger / manual | Sin sección de aplicación: el efecto va a total sobre el contexto del evento o la asignación directa. |
Para efectos percentage y ratio en carrito, la aplicación suele ser obligatoria en Owner App.
Aplicación en evento personalizado
En campañas con when: "after_create_custom_entity", Owner App no usa catálogo de producto ni líneas de carrito. En rule_application eliges un único campo de la entidad custom sobre el que se aplica el efecto (percentage, ratio o direct_value con distribution: "total").
Regla del
field: en cláusulaskey: "custom_event", elfieldsiempre esdata.+ nombre del atributo en la definición del evento (p. ej. atributoamount→"field": "data.amount"). No uses el nombre del atributo sin el prefijodata..
| Regla | Detalle |
|---|---|
| Tipo de campo | Solo atributos numéricos (p. ej. amount, quantity). |
field | Siempre data.<nombre_atributo> (ej. data.amount). |
entity_attribute_key | Slug del atributo sin prefijo data. (ej. "amount"). |
| Operador habitual en aplicación | exists — indica qué campo numérico alimenta el cálculo (no filtra umbrales; eso va en rule_conditions). |
Ejemplo: la aplicación usa el campo amount del evento. El efecto es ratio con unit: 1 y value: 0.01 (importe monetario en BD; con score_exchange 0,01 → 1 unidad de amount = 10 puntos mostrados al customer). Ver valor monetario de value.
rule_application (string en GET):
{
"conditions": {
"and": [
{
"key": "custom_event",
"field": "data.amount",
"operator": "exists",
"entity_attribute_key": "amount"
}
]
}
}
rule_effects asociado:
{
"key": "ratio",
"type": "ratio",
"unit": 1,
"value": 0.01,
"limits": 0,
"formula": null,
"distribution": "total",
"strikethrough_data": null
}
En eventos personalizados, el JSON de
rule_applicationpuede venir con raízconditions.and[](noapplication.and[]como en carrito). Parsea el string y localiza la cláusulacustom_event.
Las condiciones de victoria sobre otros campos del evento (umbrales, texto, etc.) van en rule_conditions, no en aplicación.
Qué hace (y qué no hace)
| Bloque | Pregunta que responde |
|---|---|
**rule_conditions** | ¿Cuándo puede entrar en juego la campaña? (elegibilidad: cliente, carrito, líneas, umbrales, …) |
**rule_application** | ¿Dónde se aplica el otorgamiento si la campaña aplica? (líneas del ticket y/o un coste adicional concreto) |
rule_application no sustituye a las condiciones de victoria: acota el alcance del efecto. Reutiliza gramática similar a condiciones de líneas (conditions.and, array_field: lines, field, values, …) y admite además aplicación sobre un campo de **additional_costs** del ticket.
Vacío vs definido
Estado de rule_application | Comportamiento |
|---|---|
Vacío / ausente / null | El otorgamiento puede aplicar sobre todas las líneas del ticket (según rule_effects.distribution) |
| Con filtros | El otorgamiento solo aplica donde indique la regla (líneas, additional_costs y/o pagos) |
Caso típico: sin condiciones de victoria, solo aplicación
Para una campaña que debe descontar ciertos productos siempre (sin umbral de carrito, sin qty mínima en condiciones, etc.):
- Deja
**rule_conditionsvacío** (sin requisitos de elegibilidad). - Define en
**rule_application** únicamente los productos (o categorías) objetivo.
Ejemplo conceptual:
{
"rule_conditions": { "conditions": { "and": [] } },
"rule_application": {
"conditions": {
"and": [
{
"array_field": "lines",
"field": "product_id",
"key": "cart_item_product",
"operator": "in",
"values": [10045, 10046]
}
]
}
},
"rule_effects": "{ ... percentage, distribution: individual_items ... }"
}
Interpretación: «La campaña no exige nada especial para “ganar”; si está activa y el customer califica por audiencia/stackability, el % (o valor) solo baja en las líneas con product_id 10045 o 10046.»
En
GET /pointsyGET /points/{id},rule_conditionsyrule_applicationvienen como string JSON; parsear ambos por separado.
Dos familias de aplicación
| Familia | Cómo se identifica | Qué acota |
|---|---|---|
| Líneas del ticket | array_field: lines | Productos, categorías, atributos de línea |
| Coste adicional | field: additional_costs.nombre`` | Un cargo concreto del objeto additional_costs del ticket (ej. envío) |
No uses en aplicación condiciones de cliente (customer.*), país, total de carrito, pagos, etc. — eso va en rule_conditions.
Subcondiciones anidadas en líneas: solo quantity
Dentro de conditions[] en cláusulas de aplicación sobre líneas, solo existe quantity. No se puede elegir **total** de línea (a diferencia de rule_conditions, donde sí puede aparecer total).
field en subcondición | En rule_conditions | En rule_application |
|---|---|---|
quantity | ✓ | ✓ |
total | ✓ | No disponible |
Ejemplo válido en aplicación:
"conditions": [{ "field": "quantity", "value": 1, "operator": "gte" }]
Gramática compartida con condiciones de líneas
| Concepto | En rule_conditions | En rule_application |
|---|---|---|
| Producto por catálogo | Puede exigir qty y/o total línea | Define sobre qué productos se aplica; subcondición típica: solo quantity |
Producto manual (cart_product_id) | Igual | Igual |
Categoría (product_categories) | Puede exigir qty/total | Define categorías objetivo; subcondición: solo quantity |
| Atributos de línea | Condición de victoria | Acota aplicación (sin subcondición de qty si no hace falta) |
Reglas de lectura (igual que en condiciones):
**field**define el dato;**key**es informativo.cart_item_product= catálogo;cart_product_id= manual.- Categorías:
values= feature_pk (taxonomy_slug|external_id). bundle/grouped: flags internos — ignorar valor del flag.
Bundle / 2x1: quantity en aplicación
Si rule_effects.rule_group es **true**, la subcondición **quantity** en **rule_application** define cuántas unidades de cada grupo reciben el efecto (p. ej. gte 1 = una unidad con descuento por cada grupo armado en condiciones de victoria). Ver Mecánica bundle.
Aplicación sobre additional_costs
Puedes indicar que el efecto aplica sobre un coste adicional concreto del ticket (no sobre una línea de producto).
| Campo | Descripción |
|---|---|
field | Ruta al coste: additional_costs.clave`` (ej. additional_costs.delivery si en el ticket existe "delivery": 2.99 dentro de additional_costs) |
operator / value | Comparación sobre el importe de ese coste (ej. gt + 0 → que exista y sea > 0) |
key | Suele ser total_cart_without_additional_costs (informativo); manda **field** |
additional_cost_id | ID interno del tipo de coste adicional (auxiliar; ej. 34 = envío en la Company) |
Ejemplo — efecto sobre el coste de envío:
{
"conditions": {
"and": [
{
"key": "total_cart_without_additional_costs",
"field": "additional_costs.delivery",
"value": 0,
"operator": "gt",
"additional_cost_id": 34
}
]
}
}
Interpretación: el otorgamiento/efecto se aplica sobre el componente delivery del bloque additional_costs del ticket (cuando su valor es > 0), no sobre líneas de producto.
Aplicación sobre métodos de pago (solo carrito)
En campañas de puntos con evento carrito, puedes acotar el otorgamiento a líneas pagadas con un método de pago concreto usando array_field: payments en rule_application (además de filtrar el pago en rule_conditions si la victoria depende del método).
| Campo | Descripción |
|---|---|
array_field | payments |
field | type (nombre del método en el ticket) |
values | Lista de métodos (ej. "Tarjeta OH!", "Agora Pay Web") |
operator | in, not_in, etc. |
payment_method_ids | IDs internos (auxiliar; el criterio de negocio es field + values) |
Ejemplo — otorgar solo si el ticket se pagó con métodos concretos:
{
"application": {
"and": [
{
"key": "payment",
"field": "type",
"values": ["Tarjeta OH!", "Agora Pay Web"],
"operator": "in",
"array_field": "payments",
"payment_method_ids": [95, 92]
}
]
}
}
Interpretación: el efecto de puntos/wallet en líneas calificadas solo se calcula cuando el ticket incluye un pago cuyo type está en la lista (p. ej. campaña «extra puntos pagando con tarjeta co-brand»).
JSON maestro de referencia — aplicación en líneas
Ejemplo real con categorías, productos (catálogo y manual) y atributos de línea:
{
"conditions": {
"and": [
{
"key": "cart_item_product_category",
"field": "product_categories",
"bundle": 1,
"values": ["gaston_interno|106", "frutas|17852"],
"grouped": true,
"operator": "in",
"conditions": [{ "field": "quantity", "value": 1, "operator": "gte" }],
"array_field": "lines",
"feature_ids": [17885, 17852]
},
{
"key": "cart_item_product",
"field": "product_code",
"bundle": 1,
"values": ["12000041", "camisetaGlobo", "croata_01", "croata_02", "undefined"],
"grouped": true,
"operator": "in",
"conditions": [{ "field": "quantity", "value": 1, "operator": "gte" }],
"array_field": "lines",
"product_ids": ["1", "2", "4", "5", "6"]
},
{
"key": "cart_product_id",
"field": "product_code",
"bundle": 1,
"values": ["22333", "98999", "977788"],
"grouped": true,
"operator": "in",
"conditions": [{ "field": "quantity", "value": 1, "operator": "gte" }],
"array_field": "lines"
},
{
"key": "cart_item_attributes",
"field": "attributes.color",
"value": "azul",
"operator": "eq",
"array_field": "lines"
},
{
"key": "cart_item_attributes",
"field": "attributes.product_condition",
"value": "refurbished",
"operator": "neq",
"array_field": "lines"
}
]
}
}
Lectura rápida del JSON maestro (aplicación)
| # | field / contexto | Interpretación |
|---|---|---|
| 1 | lines → product_categories | Descuento en líneas de categorías `gaston_interno |
| 2 | lines → product_code, catálogo | Códigos del catálogo listados; qty≥1 |
| 3 | lines → product_code, manual | Códigos ingresados a mano (cart_product_id); qty≥1 |
| 4 | lines → attributes.color | Solo líneas con color = azul |
| 5 | lines → attributes.product_condition | Excluye líneas refurbished (neq) |
Condiciones de victoria + aplicación distinta (caso frecuente)
La campaña gana con una lógica y el otorgamiento cae en un subconjunto de líneas:
| Bloque | Ejemplo de negocio |
|---|---|
rule_conditions | Carrito ≥ 50 € y al menos 2 unidades de Coca-Cola |
rule_application | El % solo en líneas de categoría Snacks |
Integración: el ticket puede cumplir condiciones por Coca-Cola pero el otorgamiento en la respuesta solo aparece en líneas Snacks que cumplan rule_application.
Obligatoriedad (porcentaje / ratio)
Para efectos **percentage** y **ratio** en carrito, la aplicación suele ser obligatoria en Owner App (véase Detalles operativos §5). Si falta y el efecto es % por línea, revisar configuración incompleta.
Errores frecuentes — rule_application
| Confusión | Cómo resolverlo |
|---|---|
| Condición vs aplicación | rule_conditions = ¿aplica la campaña? · rule_application = ¿en qué líneas va el otorgamiento? |
| Copiar condiciones de cliente en aplicación | Cliente/carrito van en rule_conditions; aplicación = líneas y/o additional_costs |
Buscar total en subcondición de aplicación | En aplicación solo existe **quantity** en conditions[]; total de línea no aplica |
rule_conditions vacío mal interpretado | Vacío = sin filtros de victoria, no “campana desactivada” |
| Descuento no en producto esperado | Revisar field + values en aplicación, no solo condiciones de victoria |
Confundir líneas con additional_costs | array_field: lines = productos; field: additional_costs.X = cargo extra (envío, etc.) |
| Mismo producto en condiciones y aplicación | Válido: condiciones exigen comprarlo; aplicación limita dónde se otorga (puede ser la misma lista u otra) |
Siguiente: Efectos (rule_effects)