{"componentChunkName":"component---src-templates-article-template-tsx","path":"/pe/card-present-payments/kushki-one/async-services-webhooks","result":{"data":{"article":{"title":"Servicios asíncronos y webhooks","subtitle":"Inicia cobros sin bloquear tu sistema de caja y recibe el ciclo de vida completo de la transacción por webhook, evento por evento","fullWidth":null,"hero":null,"heroTextColor":null,"heroImg":null,"content":[{"body":{"childMdx":{"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {};\nvar makeShortcode = function makeShortcode(name) {\n  return function MDXDefaultShortcode(props) {\n    console.warn(\"Component \" + name + \" was not imported, exported, or provided by MDXProvider as global scope\");\n    return mdx(\"div\", props);\n  };\n};\nvar Aside = makeShortcode(\"Aside\");\nvar CodeTabs = makeShortcode(\"CodeTabs\");\nvar NextStep = makeShortcode(\"NextStep\");\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(Aside, {\n    title: \"\\uD83D\\uDEA7 Early Release \\u2014 Beta\",\n    type: \"danger\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Este producto est\\xE1 en acceso temprano\"), \". Los par\\xE1metros, estructuras de respuesta y comportamientos pueden cambiar sin previo aviso. \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"No\"), \" uses esta versi\\xF3n en producci\\xF3n sin coordinarlo previamente con el equipo de integraciones de Kushki.\")), mdx(\"p\", null, \"Un cobro con tarjeta presente depende de una persona: alguien tiene que acercar la tarjeta, elegir cuotas, digitar su PIN. Ese tiempo supera con frecuencia los 15 segundos que tolera la mayor\\xEDa de las arquitecturas de caja.\"), mdx(\"p\", null, \"Los servicios as\\xEDncronos resuelven ese problema. Tu sistema env\\xEDa la intenci\\xF3n de cobro, recibe un acuse inmediato y se libera. Kushki ONE Connect te notifica cada cambio de estado por webhook, hasta la respuesta final del adquirente.\"), mdx(\"h2\", {\n    \"id\": \"requisitos\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#requisitos\",\n    \"aria-label\": \"requisitos permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Requisitos\"), mdx(Aside, {\n    title: \"Antes de empezar\",\n    type: \"info\",\n    mdxType: \"Aside\"\n  }, mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Un endpoint HTTPS p\\xFAblico que reciba \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"POST\"), \" y responda con cualquier \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"2xx\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"La ruta as\\xEDncrona configurada en tu integraci\\xF3n: prefijo \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"/async/\"), \" en lugar de \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"/sync/\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tu consumidor de webhooks preparado para recibir eventos repetidos. Explicamos por qu\\xE9 en \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"#construye-tu-consumidor\"\n  }, \"Construye tu consumidor\"), \".\"))), mdx(\"h2\", {\n    \"id\": \"cómo-funciona\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#c%C3%B3mo-funciona\",\n    \"aria-label\": \"cómo funciona permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"C\\xF3mo funciona\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"1. POST /async/charge          \\u2192  respondemos TERMINAL_ACKNOWLEDGED de inmediato\\n2. La terminal opera la tarjeta\\n3. POST a tu events_webhook_url  \\u2192  un evento por cada cambio de estado\\n4. \\xDAltimo evento                 \\u2192  APPROVAL o DECLINED\\n\")), mdx(Aside, {\n    title: \"El acuse no es el resultado\",\n    type: \"danger\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"La respuesta de una llamada as\\xEDncrona confirma \\xFAnicamente que la terminal recibi\\xF3 la intenci\\xF3n de cobro. \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"No indica si la transacci\\xF3n fue aprobada.\"), \" Para conocer el resultado debes consumir el webhook.\")), mdx(\"h2\", {\n    \"id\": \"activa-los-eventos\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#activa-los-eventos\",\n    \"aria-label\": \"activa los eventos permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Activa los eventos\"), mdx(\"p\", null, \"Env\\xEDa \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"events_webhook_url\"), \" en el cuerpo del request de cualquier operaci\\xF3n as\\xEDncrona.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"events_webhook_url\\\": \\\"https://api.tunegocio.com/webhook/terminal-events\\\",\\n  \\\"amount\\\": {\\n    \\\"iva\\\": 0,\\n    \\\"subtotal_iva\\\": 0,\\n    \\\"subtotal_iva0\\\": 12000,\\n    \\\"extra_taxes\\\": { \\\"airport_tax\\\": 0, \\\"iac\\\": 0, \\\"ice\\\": 0, \\\"travel_agency\\\": 0 }\\n  },\\n  \\\"client_transaction_id\\\": \\\"c5a3f3be-9d6f-4d39-8af5-58dbb589af79\\\"\\n}\\n\")), mdx(Aside, {\n    title: \"Solo en modo as\\xEDncrono\",\n    type: \"info\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"events_webhook_url\"), \" se acepta \\xFAnicamente en los endpoints \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"/async/\"), \". Las operaciones s\\xEDncronas devuelven el resultado directamente en la respuesta HTTP, as\\xED que no emiten eventos.\"), mdx(\"p\", null, \"Si omites el par\\xE1metro en una llamada as\\xEDncrona, la transacci\\xF3n se ejecuta igual, pero no recibes notificaciones ni el resultado final.\")), mdx(\"h2\", {\n    \"id\": \"un-sobre-dos-usos\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#un-sobre-dos-usos\",\n    \"aria-label\": \"un sobre dos usos permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Un sobre, dos usos\"), mdx(\"p\", null, \"Existe un solo esquema de evento y llega en dos momentos:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"La respuesta HTTP\"), \" a tu llamada as\\xEDncrona. Siempre con \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"status: TERMINAL_ACKNOWLEDGED\"), \" y \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"previous_status\"), \" vac\\xEDo.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cada entrega de webhook\"), \", con los cambios de estado posteriores hasta el resultado del adquirente.\")), mdx(\"p\", null, \"Esa simetr\\xEDa es intencional: escribe un solo deserializador y \\xFAsalo para ambos casos.\"), mdx(\"h2\", {\n    \"id\": \"estados-del-ciclo-de-vida\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#estados-del-ciclo-de-vida\",\n    \"aria-label\": \"estados del ciclo de vida permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Estados del ciclo de vida\"), mdx(\"p\", null, \"Kushki ONE modela el cobro como \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"siete estados\"), \". Cinco los genera la terminal; solo \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"APPROVAL\"), \" y \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"DECLINED\"), \" provienen del adquirente.\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"th\"\n  }, \"status\")), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Origen\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Qu\\xE9 significa\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"TERMINAL_ACKNOWLEDGED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Terminal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"La terminal recibi\\xF3 la intenci\\xF3n de cobro. Siempre es el primer estado\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"TERMINAL_CANCELED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Terminal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"El tarjetahabiente cancel\\xF3 en la terminal, o tu caja envi\\xF3 un \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"abort\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"CARD_PRESENTED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Terminal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"El tarjetahabiente oper\\xF3 la tarjeta. \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"reading_type\"), \" indica c\\xF3mo se ley\\xF3\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"TERMINAL_REJECTED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Terminal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Rechazo local antes de llegar al adquirente: \", mdx(\"em\", {\n    parentName: \"td\"\n  }, \"timeout\"), \", m\\xE1ximo de reintentos o validaci\\xF3n\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"APPROVAL_REQUESTED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Terminal\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"La transacci\\xF3n se envi\\xF3 al adquirente para su autorizaci\\xF3n\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"DECLINED\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Adquirente\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"El adquirente rechaz\\xF3 la transacci\\xF3n\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"APPROVAL\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Adquirente\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"El adquirente aprob\\xF3 la transacci\\xF3n\")))), mdx(\"h3\", {\n    \"id\": \"transiciones\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"#transiciones\",\n    \"aria-label\": \"transiciones permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Transiciones\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"TERMINAL_ACKNOWLEDGED \\u2500\\u252C\\u2500\\u2192 CARD_PRESENTED \\u2500\\u2500\\u252C\\u2500\\u2192 APPROVAL_REQUESTED \\u2500\\u252C\\u2500\\u2192 APPROVAL\\n                       \\u2502         \\u2502      \\u25B2   \\u2502                       \\u2514\\u2500\\u2192 DECLINED\\n                       \\u2502         \\u2502      \\u2514\\u2500\\u2500\\u2500\\u2518  tarjeta presentada de nuevo\\n                       \\u2502         \\u2514\\u2500\\u2192 TERMINAL_CANCELED\\n                       \\u251C\\u2500\\u2192 TERMINAL_CANCELED\\n                       \\u2514\\u2500\\u2192 TERMINAL_REJECTED\\n\")), mdx(Aside, {\n    title: \"APPROVAL_REQUESTED es el punto de no retorno\",\n    type: \"danger\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"Cuando la transacci\\xF3n llega al adquirente ya no puedes cancelarla con \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"abort\"), \": tienes que esperar \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"APPROVAL\"), \" o \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"DECLINED\"), \". Si resulta aprobada, revierte con una anulaci\\xF3n el mismo d\\xEDa o con una devoluci\\xF3n despu\\xE9s del corte.\")), mdx(\"p\", null, \"Una tarjeta rechazada en la terminal puede presentarse otra vez, lo que genera un nuevo \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"CARD_PRESENTED\"), \" con \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"interaction_attempt\"), \" incrementado. Por eso el ciclo es un grafo y no una l\\xEDnea recta: \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"no asumas una cantidad fija de eventos por transacci\\xF3n\"), \".\"), mdx(\"h2\", {\n    \"id\": \"estructura-del-evento\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#estructura-del-evento\",\n    \"aria-label\": \"estructura del evento permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Estructura del evento\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"{\\n  \\\"event_id\\\": \\\"c08211a1-344c-4f1c-850b-41e33fb08cca\\\",\\n  \\\"previous_status\\\": \\\"TERMINAL_ACKNOWLEDGED\\\",\\n  \\\"occurred_at\\\": \\\"2026-08-03T20:53:34.859Z\\\",\\n  \\\"status\\\": \\\"CARD_PRESENTED\\\",\\n  \\\"merchant_id\\\": \\\"20000000104598300000\\\",\\n  \\\"client_transaction_id\\\": \\\"c5a3f3be-9d6f-4d39-8af5-58dbb589af79\\\",\\n  \\\"interaction_attempt\\\": 1,\\n  \\\"reading_type\\\": \\\"CHIP\\\",\\n  \\\"terminal\\\": {\\n    \\\"serialNumber\\\": \\\"TJ54241P20911\\\",\\n    \\\"model\\\": \\\"P2SE-BPKT\\\",\\n    \\\"wifiMac\\\": \\\"\\\",\\n    \\\"room\\\": \\\"3.0.10\\\"\\n  },\\n  \\\"operation\\\": {\\n    \\\"type\\\": \\\"charge\\\",\\n    \\\"amount\\\": {\\n      \\\"iva\\\": 0.0,\\n      \\\"subtotalIva\\\": 0.0,\\n      \\\"subtotalIva0\\\": 12000.0,\\n      \\\"extraTaxes\\\": { \\\"airportTax\\\": 0.0, \\\"iac\\\": 0.0, \\\"ice\\\": 0.0, \\\"travelAgency\\\": 0.0 }\\n    },\\n    \\\"clientTransactionId\\\": \\\"c5a3f3be-9d6f-4d39-8af5-58dbb589af79\\\",\\n    \\\"eventsWebHook\\\": \\\"https://api.tunegocio.com/webhook/terminal-events\\\",\\n    \\\"metadata\\\": {\\n      \\\"customerEmail\\\": \\\"cliente@ejemplo.com\\\",\\n      \\\"device\\\": \\\"SUNMI-T2\\\",\\n      \\\"reference\\\": \\\"ABC12345\\\"\\n    }\\n  }\\n}\\n\")), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Campo\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Presencia\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Descripci\\xF3n\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"event_id\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Siempre\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Identificador \\xFAnico del evento. \", mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"\\xDAsalo para descartar duplicados\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"previous_status\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Siempre\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Estado anterior. Cadena vac\\xEDa en el primer evento\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"occurred_at\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Siempre\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Fecha y hora en UTC, formato ISO 8601 con milisegundos\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"status\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Siempre\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Estado actual, uno de los siete anteriores\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"merchant_id\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Siempre\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Identificador de comercio en Kushki\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"client_transaction_id\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Siempre\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"El que enviaste en el request. \", mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"\\xDAsalo para correlacionar\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"terminal\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Siempre\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"serialNumber\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"model\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"wifiMac\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"room\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"operation\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Siempre\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Copia de la operaci\\xF3n que origin\\xF3 el evento\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"interaction_attempt\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Condicional\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Desde \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"CARD_PRESENTED\"), \". Cuenta las veces que se oper\\xF3 la tarjeta\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"reading_type\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Condicional\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Desde \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"CARD_PRESENTED\"), \": \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"CHIP\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"CONTACTLESS\"), \" o \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"MAGNETIC_STRIPE\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"failure_reason\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Condicional\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Solo en \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"TERMINAL_REJECTED\"), \" y \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"DECLINED\"), \". Contiene \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"type\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"code\"), \" y \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"message\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"operation.transactionReference\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": \"center\"\n  }, \"Condicional\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"En captura, re-autorizaci\\xF3n, post propina y anulaci\\xF3n\")))), mdx(Aside, {\n    title: \"El uso de may\\xFAsculas es intencional\",\n    type: \"danger\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"Los campos del primer nivel usan \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"snake_case\"), \". Todo lo que est\\xE1 dentro de \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"terminal\"), \" y \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"operation\"), \" usa \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"camelCase\"), \": \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"serialNumber\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"subtotalIva0\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"eventsWebHook\"), \".\"), mdx(\"p\", null, \"Esto refleja la representaci\\xF3n interna de la terminal. Deserializa el evento tal como llega y no normalices los nombres.\")), mdx(Aside, {\n    title: \"El evento no incluye datos de tarjeta\",\n    type: \"info\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"El webhook de transacci\\xF3n no transporta PAN, nombre del tarjetahabiente ni marca de tarjeta. Si necesitas esos datos, obtenlos de la respuesta de una operaci\\xF3n s\\xEDncrona o del endpoint de consulta de transacciones.\")), mdx(Aside, {\n    title: \"Los montos del evento llegan como decimales\",\n    type: \"info\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"El objeto \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"operation.amount\"), \" devuelve los montos con decimales (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"12000.0\"), \"), mientras que los requests los llevan como enteros. No reutilices un monto del evento para armar un nuevo request. Revisa \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"/card-present-payments/kushki-one/formato-de-montos-kushki-one\"\n  }, \"Formato de montos en Kushki ONE\"), \".\")), mdx(\"h2\", {\n    \"id\": \"entrega-y-reintentos\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#entrega-y-reintentos\",\n    \"aria-label\": \"entrega y reintentos permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Entrega y reintentos\"), mdx(\"p\", null, \"Tu endpoint debe confirmar la recepci\\xF3n con cualquier c\\xF3digo \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"2xx\"), \". Cualquier otra respuesta se eval\\xFAa seg\\xFAn esta pol\\xEDtica:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Resultado\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Comportamiento\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"2xx\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Entrega exitosa. No hay reintentos\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"em\", {\n    parentName: \"td\"\n  }, \"Timeout\"), \", conexi\\xF3n cerrada o fallo de DNS\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"Reintenta\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"408\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"429\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"500\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"502\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"503\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"504\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"Reintenta\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"400\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"401\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"403\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"404\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"409\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"422\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"strong\", {\n    parentName: \"td\"\n  }, \"No reintenta\"), \": se considera un rechazo permanente\")))), mdx(\"p\", null, \"El reintento usa retroceso exponencial con variaci\\xF3n aleatoria, sobre una base de 2 segundos:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"espera = min(60s, base * 2^intento) + aleatorio(0..base)\\n\")), mdx(\"p\", null, \"La entrega se detiene tras \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"10 intentos o 15 minutos\"), \", seg\\xFAn lo que ocurra primero.\"), mdx(Aside, {\n    title: \"Resiliencia sin conexi\\xF3n\",\n    type: \"info\",\n    mdxType: \"Aside\"\n  }, mdx(\"p\", null, \"Si la terminal pierde conectividad, encola los eventos de forma persistente y los reenv\\xEDa cuando la red vuelve, preservando el orden por transacci\\xF3n. Una r\\xE1faga de eventos atrasados despu\\xE9s de una ca\\xEDda es comportamiento normal, no una falla.\")), mdx(\"h2\", {\n    \"id\": \"construye-tu-consumidor\",\n    \"style\": {\n      \"position\": \"relative\"\n    }\n  }, mdx(\"a\", {\n    parentName: \"h2\",\n    \"href\": \"#construye-tu-consumidor\",\n    \"aria-label\": \"construye tu consumidor permalink\",\n    \"className\": \"anchor before\"\n  }, mdx(\"svg\", {\n    parentName: \"a\",\n    \"aria-hidden\": \"true\",\n    \"focusable\": \"false\",\n    \"height\": \"16\",\n    \"version\": \"1.1\",\n    \"viewBox\": \"0 0 16 16\",\n    \"width\": \"16\"\n  }, mdx(\"path\", {\n    parentName: \"svg\",\n    \"fillRule\": \"evenodd\",\n    \"d\": \"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"\n  }))), \"Construye tu consumidor\"), mdx(\"p\", null, \"Como los eventos se reintentan y se reenv\\xEDan desde la cola, tu endpoint \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"debe ser idempotente\"), \".\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Descarta duplicados por \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"event_id\"), \".\"), \" Los reintentos y los reenv\\xEDos repiten el mismo identificador. Guarda los que ya procesaste.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Correlaciona por \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"client_transaction_id\"), \".\"), \" Todos los eventos de una transacci\\xF3n lo comparten. El \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"serialNumber\"), \" te dice qu\\xE9 dispositivo lo gener\\xF3, pero no sirve como clave de correlaci\\xF3n.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Detecta huecos con \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"previous_status\"), \".\"), \" Si no coincide con el \\xFAltimo estado que registraste para esa transacci\\xF3n, falta un evento o lleg\\xF3 fuera de orden.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Responde r\\xE1pido y procesa despu\\xE9s.\"), \" Devuelve \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"2xx\"), \" de inmediato y encola el payload en tu sistema interno. Un endpoint lento provoca reintentos, y los reintentos te cuestan duplicados.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Trata \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"APPROVAL\"), \" y \", mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"DECLINED\"), \" como finales.\"), \" No llegan m\\xE1s eventos despu\\xE9s.\")), mdx(CodeTabs, {\n    group: \"backend\",\n    mdxType: \"CodeTabs\"\n  }, mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-javascript\"\n  }, \"app.post(\\\"/webhook/terminal-events\\\", async (req, res) => {\\n  const e = req.body;\\n  res.sendStatus(200);                        // confirma primero\\n\\n  if (await yaProcesado(e.event_id)) return;  // idempotencia\\n  await marcarProcesado(e.event_id);\\n\\n  await cola.publicar({\\n    transaccion: e.client_transaction_id,\\n    estado: e.status,\\n    anterior: e.previous_status,\\n    terminal: e.terminal.serialNumber,\\n    motivo: e.failure_reason ?? null,\\n  });\\n});\\n\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-python\"\n  }, \"@app.post(\\\"/webhook/terminal-events\\\")\\nasync def eventos(evento: dict, respuesta: Response):\\n    respuesta.status_code = 200                    # confirma primero\\n\\n    if await ya_procesado(evento[\\\"event_id\\\"]):     # idempotencia\\n        return\\n    await marcar_procesado(evento[\\\"event_id\\\"])\\n\\n    await cola.publicar({\\n        \\\"transaccion\\\": evento[\\\"client_transaction_id\\\"],\\n        \\\"estado\\\": evento[\\\"status\\\"],\\n        \\\"anterior\\\": evento[\\\"previous_status\\\"],\\n        \\\"terminal\\\": evento[\\\"terminal\\\"][\\\"serialNumber\\\"],\\n        \\\"motivo\\\": evento.get(\\\"failure_reason\\\"),\\n    })\\n\"))), mdx(NextStep, {\n    type: \"recommended\",\n    side: \"left\",\n    link: \"/card-present-payments/kushki-one/payments\",\n    title: \"Acepta cobros con Kushki ONE\",\n    mdxType: \"NextStep\"\n  }, mdx(\"p\", null, \"Revisa todos los flujos de cobro disponibles y sus variantes s\\xEDncronas.\")), mdx(NextStep, {\n    type: \"recommended\",\n    side: \"right\",\n    link: \"/card-present-payments/kushki-one/error-catalog-kushkione\",\n    title: \"Cat\\xE1logo de errores\",\n    mdxType: \"NextStep\"\n  }, mdx(\"p\", null, \"Interpreta el objeto \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"failure_reason\"), \" de los estados \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"TERMINAL_REJECTED\"), \" y \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"DECLINED\"), \".\")));\n}\n;\nMDXContent.isMDXComponent = true;","excerpt":"Este producto está en acceso temprano . Los parámetros, estructuras de respuesta y comportamientos pueden cambiar sin previo aviso.  No…","timeToRead":3,"tableOfContents":{"items":[{"url":"#requisitos","title":"Requisitos"},{"url":"#cómo-funciona","title":"Cómo funciona"},{"url":"#activa-los-eventos","title":"Activa los eventos"},{"url":"#un-sobre-dos-usos","title":"Un sobre, dos usos"},{"url":"#estados-del-ciclo-de-vida","title":"Estados del ciclo de vida","items":[{"url":"#transiciones","title":"Transiciones"}]},{"url":"#estructura-del-evento","title":"Estructura del evento"},{"url":"#entrega-y-reintentos","title":"Entrega y reintentos"},{"url":"#construye-tu-consumidor","title":"Construye tu consumidor"}]}}},"updatedAt":"05 agosto 2026","tabTitle":null}]}},"pageContext":{"country":"pe","id":"474c2e31-d2ea-587d-930e-0c3e5e21d08e","locale":"es","localeDateFormat":"DD MMMM YYYY"}},"staticQueryHashes":["1632712422","2408418099","63159454"]}