Links de pago
Un enlace permanente que pagan muchas personas: cursos, entradas, donaciones. Cada pago es un cobro normal.
Creas el link una vez (panel o API) y lo compartes: pay.kuti.pe/l/{slug}, por WhatsApp, redes o como QR impreso. Cada persona que paga deja sus datos y se crea SU cobro, con payment_link_id.
- 1
Crea el link
POST /payment-links con título, precio, métodos y preguntas (o desde el panel).
- 2
Compártelo
url (o su QR) por WhatsApp, redes o impreso. Quien paga ve tu marca y deja nombres, apellidos, correo y tus preguntas.
- 3
Paga
Se crea SU cobro (vence en 30 minutos si no paga) y paga con QR o banco.
- 4
Te avisamos
Llega payment.succeeded con payment_intent.payment_link_id. Listo.
Precio
| pricing | Cómo | Ejemplo |
|---|---|---|
| FIXED | amount fijo. | Taller S/ 120 |
| CUSTOMER_CHOOSES | Quien paga elige: min_amount (obligatorio), max_amount y hasta 4 suggested_amounts. | Donación desde S/ 5 |
Preguntas a quien paga
Siempre se piden nombres, apellidos y correo. Con customer_field_ids eliges qué campos personalizados (Campos de cliente) pregunta cada link. El link guarda una copia de las preguntas: si luego editas, archivas o creas campos, los links ya creados siguen igual hasta que los edites. Las respuestas quedan en el cobro (customer.custom_fields) y en el cliente, si el campo sigue existiendo.
Texto del botón y después del pago
button_label cambia el botón ("Inscribirme · S/ 120.00"). success_message y success_button_label + success_button_url se muestran cuando el pago se completa: ideal para mandar al grupo de WhatsApp, Zoom o Drive.
URL (slug)
El slug es único en todo KUTI. Si no lo envías se genera del título. Si lo cambias, la URL anterior sigue funcionando y redirige: un QR ya impreso nunca se rompe. Revisa uno libre con GET /payment-links/slug-availability.
Cobros y resultados
- Los cobros de un link: GET /payment-intents?payment_link_id=plink_…
- Todos los cobros que salieron de links: GET /payment-intents?source=link (single = cobros a una persona, subscription = periodos de una suscripción).
- Resultados en el link: views_count (visitas) → checkouts_count (llenaron sus datos) → payments_count (pagaron) y amount_collected.
Eventos
| Evento | Cuándo | data |
|---|---|---|
| payment_link.created | Creaste el link. | payment_link |
| payment_link.updated | Lo editaste. | payment_link |
| payment_link.activated | Lo activaste. | payment_link |
| payment_link.deactivated | Lo desactivaste. | payment_link |
| payment.succeeded | Alguien pagó el link (el cobro trae payment_link_id). | payment_intent |
Saber quién pagó (webhook)
Un pago de un link es un cobro normal: llega payment.succeeded, igual que cualquier cobro. No hay un evento aparte. Lo que te dice de qué link vino es payment_intent.payment_link_id; las respuestas a las preguntas del link vienen en payment_intent.customer.custom_fields.
{
"id": "evt_01J8Z3K4M5N6P7Q8R9S0T1U2V9",
"type": "payment.succeeded",
"merchant_id": "mer_01J8Z3K4M5N6P7Q8R9S0T1U2V3",
"created_at": "2026-09-25T15:20:41.000Z",
"data": {
"payment_intent": {
"id": "pi_01J8Z3K4M5N6P7Q8R9S0T1U2V5",
"status": "SUCCEEDED",
"amount": {
"amount": "120.00",
"currency": "PEN"
},
"description": "Taller de Excel — sábado 10am",
"payment_link_id": "plink_01J8Z3K4M5N6P7Q8R9S0T1U2V3",
"metadata": {
"payment_link_id": "plink_01J8Z3K4M5N6P7Q8R9S0T1U2V3",
"payment_link_slug": "taller-de-excel"
},
"customer": {
"id": "cus_01J8Z3K4M5N6P7Q8R9S0T1U2V7",
"first_name": "Ana",
"last_name": "Torres",
"name": "Ana Torres",
"email": "ana@correo.com",
"custom_fields": {
"codigo_alumno": "2026-00781"
}
},
"paid_with": {
"method_type": "INTEROPERABLE_QR",
"paid_at": "2026-09-25T15:20:40.000Z"
},
"send_via": [],
"created_at": "2026-09-25T15:18:02.000Z"
}
}
}if (event.type === "payment.succeeded") {
const pi = event.data.payment_intent;
if (pi.payment_link_id === "plink_01J8Z3K4M5N6P7Q8R9S0T1U2V3") {
// Inscribir a pi.customer.email en el taller
// pi.customer.custom_fields.codigo_alumno → respuesta del link
}
}Siguiente
- Crear link — POST /payment-links
- Campos de cliente — las preguntas
- Webhooks — payment.succeeded