Skip to main content
Split Payments permite a las plataformas y marketplaces distribuir los fondos de un único pago entre varios destinatarios. Cuando un cliente paga a través de un Checkout Session, Fintoc divide el payout según las reglas que definas y transfiere cada parte a la cuenta bancaria del destinatario — sin transferencias manuales ni conciliaciones de tu lado. Cada destinatario es una Entity: el titular legal que recibe una parte del pago. Una Entity declara la cuenta donde recibe el pago como parte de su onboarding, así que no hay un recurso de cuenta separado que gestionar. Hay tres pasos para aceptar pagos con split:
  1. Crear una Entity para cada destinatario
  2. Hacer el onboarding de la Entity, incluyendo la cuenta donde recibirá el pago
  3. Crear un Checkout Session con un arreglo split y enviar al cliente a su redirect_url

Antes de comenzar


Paso 1: Crear una Entity

Una Entity representa al titular legal que recibe una parte del pago: un vendedor, un socio, un profesional, una unidad de negocio.
Una Entity nueva comienza en waiting_initialization. No puede recibir un split hasta que llegue a operational, lo que sucede cuando se aprueba su onboarding.
Si el destinatario ya existe como Entity en tu organización, reutiliza su id. Crear una segunda Entity con el mismo holder_id devuelve 409 entity_holder_id_already_exists_for_organization.
Lista y recupera entities con GET /v2/entities — que acepta filtros holder_id, status y is_root — y GET /v2/entities/{id}.

Paso 2: Hacer el onboarding de la Entity

El onboarding es donde la Entity declara quién es y, lo más importante para Split Payments, la cuenta bancaria donde recibirá el pago. Fintoc lo revisa, y cuando se aprueba, la Entity pasa a operational. El onboarding se completa a través de la API, tanto en Chile como en México.

Crear el onboarding

Tipo de onboarding

type es requerido al crear el onboarding. Declara qué hará la Entity con Fintoc, no se puede cambiar después y determina cuánta información pide el onboarding. settlement_recipient — la Entity solo recibe dinero. Su parte de cada split se transfiere a la cuenta bancaria que declara en settlement_account, y nada más: no mantiene balance en Fintoc, no puede recibir transferencias de terceros y no puede enviar dinero. Como solo recibe pagos, el onboarding pide lo mínimo necesario para identificar a quién se le paga. Este es el valor a usar para Split Payments. account_holder — la Entity opera una cuenta en Fintoc. Puede recibir transferencias entrantes, enviar salientes y mantener balance. Esa capacidad conlleva un perfil de riesgo más alto, por lo que el onboarding requiere el conjunto completo de información: perfil transaccional, estructura de propiedad y documentos de respaldo.

La cuenta de liquidación

data.company_information.settlement_account es la cuenta donde se transfiere la parte de esta Entity en cada split. Es el único campo que Split Payments agrega al onboarding. No lleva campos de titular: el titular de la cuenta es la empresa que se está onboardeando, así que el identificador fiscal ya se conoce.
Una Entity tiene exactamente una cuenta de liquidación. Para cambiarla, crea un nuevo onboarding — ver Cambiar la cuenta de liquidación.

Campos del onboarding

Enviar el onboarding

Una vez completa la información, envíala a revisión:
El onboarding pasa por estos estados: Dos webhooks te avisan del resultado:
  • entity.onboarding.approved — la Entity está lista para recibir splits
  • entity.onboarding.rejected — la revisión falló
La revisión de compliance típicamente toma uno a dos días hábiles. Diseña tu flujo para que el destinatario pueda crearse y mostrarse como pendiente mientras corre la revisión.

Cambiar la cuenta de liquidación

Crea un nuevo onboarding para la misma Entity con la nueva cuenta. Mientras está bajo revisión, la cuenta anterior sigue vigente y la Entity sigue recibiendo splits. Cuando el nuevo onboarding se aprueba, la nueva cuenta reemplaza a la anterior. Si se rechaza, no cambia nada.

Paso 3: Crear un Checkout Session con split

Agrega un arreglo split al Checkout Session. Cada entrada nombra a una Entity y su parte.
Las reglas del split deben sumar exactamente el monto del pago. No hay residuo: si te quedas con parte del pago, declara tu propia entity raíz como otra entrada, como en el ejemplo de arriba. Recupérala con GET /v2/entities?is_root=true.
Los porcentajes se expresan en puntos base. 10000 = 100%, 1000 = 10%, 1 = 0.01%. Para asignar el 90%, envía 9000.
La respuesta hace eco del arreglo split tal como lo enviaste, junto con el redirect_url de la página de pago. Envía al cliente allí para completar el pago.

Paso 4: Manejar los eventos posteriores al pago

Cuando el pago llega a un estado final, checkout_session.finished y payment_intent.succeeded incluyen un arreglo split_applied con el monto resuelto para cada destinatario.
checkout_session.finished puede llegar antes de que el pago haya alcanzado un estado final. Marca la orden como pagada solo cuando data.payment_resource.payment_intent.status sea succeeded.
Eventos a manejar:

Cómo y cuándo se paga a los destinatarios

Los payouts siguen el calendario de liquidación de tu organización. En cada ciclo, Fintoc agrupa cada parte que se le debe a la misma Entity en una única transferencia a su cuenta de liquidación: un destinatario que aparece en 200 pagos durante un ciclo recibe una única transferencia. Recupera un payout con GET /v1/payouts/{id}, lístalos con GET /v1/payouts y obtén los pagos que cubre con GET /v1/payouts/{id}/resources.
Los eventos payout.* solo se emiten en modo live. Los payouts se liquidan contra balances reales, por lo que el modo test no los emite.

Reglas y validaciones

La solicitud falla con 400 invalid_request_error si se viola alguna regla. Por entrada
  • entity_id debe referenciar una Entity en estado operational
  • El country_code de la Entity debe coincidir con la moneda del pago
  • Para flat: 0 < amount <= amount_total
  • Para percentage: 0 < amount <= 10000
Globales
  • Entre 1 y 10 entradas
  • Sin valores entity_id duplicados
  • Todas las entradas deben usar el mismo type
  • La suma de todos los montos, después de convertir los porcentajes, debe ser exactamente igual a amount_total
  • Para percentage, los valores deben sumar exactamente 10000 bps
Redondeo. Los montos en porcentaje se calculan como floor(amount_total * amount / 10000). La diferencia de redondeo acumulada se asigna a la entrada con charge_processing_fee: true.

Errores