# Pay By Link

¡Envía a tus clientes un enlace único por email, WhatsApp o SMS para que paguen en línea con un solo clic!

![Pay By Link](/img/pay-by-link-preview.png)

## Resumen[​](#resumen "Enlace directo al Resumen")

Esta página explica cómo crear enlaces de pago desde el [MONEI Dashboard](#create-from-dashboard) o de forma programática usando la [API de pagos de MONEI](#integration-steps).

Pay By Link genera una URL única para un importe de pago específico que dirige al cliente a una página de pago segura alojada por MONEI.

## Crear desde el panel[​](#crear-desde-el-panel "Enlace directo al Crear desde el panel")

Puedes crear enlaces de pago directamente desde el MONEI Dashboard sin escribir ningún código.

### 1. Ve a Pagos[​](#1-ve-a-pagos "Enlace directo al 1. Ve a Pagos")

Ve a [MONEI Dashboard → Pagos](https://dashboard.monei.com/payments) y haz clic en el botón **Pay By Link**.

![Dashboard Payments](/img/pay-by-link/dashboard-payments.png)

### 2. Rellena el formulario de pago[​](#2-rellena-el-formulario-de-pago "Enlace directo al 2. Rellena el formulario de pago")

Rellena los detalles del pago. Algunos campos son siempre obligatorios, mientras que otros dependen de los métodos de pago seleccionados.

Resumen rápido

* **Siempre obligatorios**: Importe, Métodos de pago permitidos.
* **Condicionalmente obligatorios**: Email del cliente y Dirección de facturación (para métodos específicos).
* **Opcionales**: Fecha de expiración, ID de pedido, datos del cliente, descripción, tienda, dirección de envío.

| Campo                          | Estado        | Notas                                                            |
| ------------------------------ | ------------- | ---------------------------------------------------------------- |
| **Importe**                    | `Obligatorio` | Importe del pago en la moneda de tu cuenta                       |
| **Métodos de pago permitidos** | `Obligatorio` | Se debe seleccionar al menos un método                           |
| **Fecha de expiración**        | `Opcional`    | Por defecto, 7 días desde la creación; debe ser una fecha futura |
| **ID de pedido**               | `Opcional`    | Identificador alfanumérico, máximo 40 caracteres                 |
| **Nombre del cliente**         | `Opcional`    |                                                                  |
| **Email del cliente**          | `Condicional` | Obligatorio cuando se selecciona Multibanco o MB WAY             |
| **Teléfono del cliente**       | `Opcional`    |                                                                  |
| **Descripción**                | `Opcional`    | Descripción personalizada asociada al pago                       |
| **Tienda**                     | `Opcional`    | Solo visible si tienes varias tiendas configuradas               |
| **Dirección de facturación**   | `Condicional` | Obligatoria cuando se selecciona Multibanco o MB WAY             |
| **Dirección de envío**         | `Opcional`    | Sección opcional y colapsable                                    |

![Create Payment Form](/img/pay-by-link/create-payment-form.png)

#### Comportamiento condicional según el método de pago[​](#comportamiento-condicional-según-el-método-de-pago "Enlace directo al Comportamiento condicional según el método de pago")

El formulario se adapta automáticamente en función de los métodos de pago seleccionados.

**La Dirección de facturación y el Email del cliente se vuelven obligatorios** cuando se selecciona alguno de estos métodos de pago:

* Multibanco
* MB WAY

![Billing Address](/img/pay-by-link/billing-address.png)

La casilla **Captura manual del pago** aparece únicamente cuando **todos** los métodos de pago seleccionados admiten la captura manual:

* Tarjeta
* PayPal
* Bizum

Si se incluye cualquier otro método (p. ej., Multibanco), la opción de captura manual queda oculta.

![Manual Capture](/img/pay-by-link/manual-capture.png)

### 3. Revisa y envía el enlace de pago[​](#3-revisa-y-envía-el-enlace-de-pago "Enlace directo al 3. Revisa y envía el enlace de pago")

Tras hacer clic en **Crear pago**, aparece un modal **Enviar solicitud de pago** donde puedes revisar los detalles del pago antes de enviar el enlace a tu cliente.

![Send Payment Request](/img/pay-by-link/send-payment-request.png)

Desde este modal puedes configurar:

* **Canal de entrega** — Elige cómo enviar el enlace: Email, WhatsApp, SMS o Solicitud de pago.
* **Enviar a** — La dirección de email o el número de teléfono del destinatario, según el canal seleccionado.
* **Idioma del cliente** — El idioma de la página de pago y la notificación (English, Español, Català, Português, Deutsch, Italiano, Français).

![Delivery Channel](/img/pay-by-link/delivery-channel.png)

![Customer Language](/img/pay-by-link/customer-language.png)

El modal también muestra:

* Una **vista previa** de la notificación de pago con el ID de pedido, el importe, la fecha y los datos de facturación.
* Un **Enlace permanente** y la opción **Obtener enlace corto** para copiar la URL del pago directamente sin enviar ninguna notificación.

Haz clic en **Enviar solicitud de pago** para entregar el enlace al cliente a través del canal seleccionado.

## Integración con la API[​](#integración-con-la-api "Enlace directo al Integración con la API")

La siguiente sección explica el **flujo de API** (implementación en el servidor).

### Antes de empezar (API)[​](#antes-de-empezar-api "Enlace directo al Antes de empezar (API)")

* Necesitarás una cuenta MONEI y tus claves de API (de prueba o de producción). Encuéntralas en tu [MONEI Dashboard](https://dashboard.monei.com/settings/api).
* Usa tus [claves en modo de prueba](https://docs.monei.com/es/es/testing/.md) para las pruebas de integración.
* Asegúrate de que los métodos de pago relevantes estén habilitados en los ajustes de tu cuenta para la página alojada.
* Puedes monitorizar los pagos de prueba en tu [MONEI Dashboard → Pagos](https://dashboard.monei.com/payments) (asegúrate de que el Modo de prueba esté activo).

### Pasos de integración[​](#pasos-de-integración "Enlace directo al Pasos de integración")

Crear y procesar un pago de Pay By Link mediante la API implica crear un pago en tu servidor, enviar el enlace generado al cliente y procesar el estado final del pago mediante webhooks.

### 1. Crear el pago (lado del servidor)[​](#1-crear-el-pago-lado-del-servidor "Enlace directo al 1. Crear el pago (lado del servidor)")

Crea un [Pago](https://docs.monei.com/es/es/apis/rest/schemas/payment/.md) en tu servidor con un importe, una moneda y, opcionalmente, datos del cliente.

<!-- -->

* cURL
* Node.js
* PHP
* Python

POST https\://api.monei.com/v1/payments

```
curl --request POST 'https://api.monei.com/v1/payments' \

--header 'Authorization: YOUR_API_KEY' \

--header 'Content-Type: application/json' \

--data-raw '{

  "amount": 110,

  "currency": "EUR",

  "orderId": "14379133960355",

  "description": "Test Shop - #14379133960355",

  "customer": {

    "email": "email@example.com",

    "phone": "+34666555444"

   },

  "callbackUrl": "https://example.com/checkout/callback",

  "completeUrl": "https://example.com/checkout/complete", // Optional: Redirect after payment attempt

  "cancelUrl": "https://example.com/checkout/cancel"     // Optional: Redirect if user cancels

}'
```

(Reemplaza `YOUR_API_KEY` con tu clave de API de MONEI real)

server.js

```
import {Monei} from '@monei-js/node-sdk';



// Replace YOUR_API_KEY with your actual MONEI API key

const monei = new Monei('YOUR_API_KEY');



const payment = await monei.payments.create({

  amount: 110,

  currency: 'EUR',

  orderId: '14379133960355',

  description: 'Test Shop - #14379133960355',

  customer: {

    email: 'email@example.com',

    phone: '+34666555444'

  },

  callbackUrl: 'https://example.com/checkout/callback',

  completeUrl: 'https://example.com/checkout/complete', // Optional

  cancelUrl: 'https://example.com/checkout/cancel' // Optional

});



// You will need the paymentId from the response in the next step

const paymentId = payment.id;
```

server.php

```
<?php

require_once 'vendor/autoload.php';



use Monei\Model\CreatePaymentRequest;

use Monei\Model\PaymentCustomer;

use Monei\MoneiClient;



// Replace YOUR_API_KEY with your actual MONEI API key

$monei = new MoneiClient('YOUR_API_KEY');



$payment = $monei->payments->create(

  new CreatePaymentRequest([

    'amount' => 110,

    'currency' => 'EUR',

    'order_id' => '14379133960355',

    'description' => 'Test Shop - #14379133960355',

    'customer' => new PaymentCustomer([

      'email' => 'email@example.com',

      'phone' => '+34666555444'

    ]),

    'callback_url' => 'https://example.com/checkout/callback',

    'complete_url' => 'https://example.com/checkout/complete', // Optional

    'cancel_url' => 'https://example.com/checkout/cancel'     // Optional

  ])

);



// You will need the paymentId from the response in the next step

$paymentId = $payment->getId();

?>
```

server.py

```
import Monei

from Monei import CreatePaymentRequest, PaymentCustomer



# Replace YOUR_API_KEY with your actual MONEI API key

monei = Monei.MoneiClient(api_key="YOUR_API_KEY")



payment = monei.payments.create(

    CreatePaymentRequest(

        amount=110,

        currency="EUR",

        order_id="14379133960355",

        description="Test Shop - #14379133960355",

        customer=PaymentCustomer(

          email="email@example.com",

          phone="+34666555444"

        ),

        callback_url="https://example.com/checkout/callback",

        complete_url="https://example.com/checkout/complete", // Optional

        cancel_url="https://example.com/checkout/cancel"     // Optional

    )

)



// You will need the paymentId from the response in the next step

payment_id = payment.id
```

**Parámetros principales:**

* **amount** `positive integer`: Importe en la unidad monetaria más pequeña.
* **currency** `string`: Código de moneda ISO de tres letras.
* **orderId** `string`: Tu identificador de pedido único.
* **customer.email** / **customer.phone** `string`: Al menos uno es obligatorio si quieres que MONEI envíe el enlace automáticamente (Paso 2).
* **callbackUrl** `string`: Tu endpoint de servidor para las notificaciones de webhook (imprescindible para el estado final).
* **completeUrl** / **cancelUrl** `string` (Opcional): URLs para redirigir al cliente tras la interacción.

Consulta todos los [parámetros de la solicitud](https://docs.monei.com/es/es/apis/rest/payments-create/.md) disponibles.

La respuesta contiene el `payment.id`, necesario para el siguiente paso.

### 2. Enviar el enlace y gestionar la interacción (servidor / cliente)[​](#2-enviar-el-enlace-y-gestionar-la-interacción-servidor--cliente "Enlace directo al 2. Enviar el enlace y gestionar la interacción (servidor / cliente)")

Tienes dos opciones principales para hacer llegar el enlace al cliente:

**Opción A: MONEI envía el enlace (recomendado por su sencillez)**

Realiza una solicitud POST al endpoint `/v1/payments/{payment_id}/link`. Si proporcionaste `customer.email` o `customer.phone` en el Paso 1, MONEI enviará automáticamente el enlace a través del canal correspondiente (email, WhatsApp o SMS).

* cURL
* Node.js
* PHP
* Python

POST https\://api.monei.com/v1/payments/{payment\_id}/link

```
curl --request POST 'https://api.monei.com/v1/payments/{payment_id}/link' \

--header 'Authorization: YOUR_API_KEY' \

--header 'Content-Type: application/json' \

--data-raw '{

  "language": "es", // Optional: Set language for email/SMS template

  "channel": "email" // Optional: Force channel (email, whatsapp, sms)

}'
```

(Reemplaza `{payment_id}` y `YOUR_API_KEY`)

server.js

```
// Assumes paymentId is obtained from the previous step

await monei.payments.sendLink(paymentId, {

  language: 'es', // Optional

  channel: 'email' // Optional

});
```

server.php

```
<?php

// Assumes $paymentId is obtained from the previous step

$monei->payments->sendLink($paymentId, [

  'language' => 'es', // Optional

  'channel' => 'email' // Optional

]);

?>
```

server.py

```
# Assumes payment_id is obtained from the previous step

monei.payments.sendLink(payment_id, language='es', channel='email') # Optional params
```

**Opción B: Tú envías el enlace**

El [objeto Payment](https://docs.monei.com/es/es/apis/rest/schemas/payment/.md) devuelto en el Paso 1 contiene `payment.nextAction.redirectUrl`. Este es el enlace de pago.

Example Partial Response from Step 1

```
{

  "id": "af6029f80f5fc73a8ad2753eea0b1be0",

  // ... other fields ...

  "nextAction": {

    "type": "CONFIRM",

    "mustRedirect": true,

    "redirectUrl": "https://secure.monei.com/payments/af6029f80f5fc73a8ad2753eea0b1be0" // <-- This is the Pay By Link URL

  }

}
```

Puedes tomar este `redirectUrl` y enviárselo a tu cliente a través de tus propios canales de comunicación (email, SMS, mensaje en la app, etc.).

**Interacción del cliente:**

1. El cliente hace clic en el enlace.
2. Es redirigido a la página de pago segura de MONEI.
3. Elige un método de pago, introduce los datos y completa cualquier autenticación requerida (como 3D Secure).
4. Tras intentar el pago o cancelarlo, puede ser redirigido a tu `completeUrl` o `cancelUrl` si las proporcionaste en el Paso 1.

### 3. Procesar la notificación de webhook (lado del servidor)[​](#3-procesar-la-notificación-de-webhook-lado-del-servidor "Enlace directo al 3. Procesar la notificación de webhook (lado del servidor)")

Independientemente de si el cliente es redirigido, MONEI envía el estado final y autoritativo del pago mediante una solicitud HTTP POST asíncrona a la `callbackUrl` que proporcionaste en el Paso 1. El cuerpo de la solicitud contiene el [objeto Payment](https://docs.monei.com/es/es/apis/rest/schemas/payment/.md) completo en formato JSON.

Este webhook es la **única forma fiable** de confirmar el resultado definitivo del pago.

**Es imprescindible que:**

1. **Verifiques la cabecera `MONEI-Signature`** incluida en la solicitud. Esto confirma que el webhook proviene realmente de MONEI. Consulta la [guía de verificación de firmas](https://docs.monei.com/es/es/guides/verify-signature/.md) para los detalles de implementación.
2. **Devuelvas un código de estado HTTP `200 OK`** inmediatamente al recibir el webhook para confirmar la recepción. Cualquier otro código de estado indica a MONEI que la notificación ha fallado.

Si MONEI no recibe un `200 OK`, reintentará el envío del webhook.

Una vez verificada la firma, inspecciona el campo `status` en el objeto Payment (`SUCCEEDED`, `FAILED`, `CANCELED`, etc.) para determinar si debes completar el pedido o gestionar el fallo.
