Documentacion Tecnica
Todo lo que necesitas para integrar PAYWL en tu medio digital. Desde la instalacion del SDK hasta la configuracion avanzada de reglas y pasarelas de pago.
Getting Started
Requisitos previos
Antes de comenzar la integracion de PAYWL, asegurate de contar con lo siguiente:
- Node.js 18+ instalado en tu entorno de desarrollo (solo si usas el SDK server-side)
- CMS con API REST o GraphQL — PAYWL se integra con cualquier CMS que exponga endpoints de contenido
- Acceso al HTML de tu sitio para insertar el script tag de PAYWL (acceso al template o theme)
- Credenciales de PAYWL — API Key y Tenant ID proporcionados tras la activacion de tu cuenta
Instalacion del SDK JavaScript
El SDK de PAYWL se carga directamente como un script tag en tu sitio. Pesa menos de 15KB comprimido y se distribuye desde una CDN global (CloudFront) para latencia minima.
<!-- PAYWL Paywall SDK -->
<script
src="https://cdn.paywl.io/sdk/v1/paywl.min.js"
data-tenant="TU_TENANT_ID"
data-key="TU_API_KEY"
async
></script>Alternativamente, si usas un framework con gestores de paquetes:
npm install @paywl/sdk
# o con yarn
yarn add @paywl/sdkimport { Paywl } from '@paywl/sdk';
const paywl = new Paywl({
tenantId: 'TU_TENANT_ID',
apiKey: 'TU_API_KEY',
environment: 'production', // o 'sandbox' para pruebas
});Configuracion basica
PAYWL necesita un archivo de configuracion JSON que define las reglas de acceso y el comportamiento del muro. Este archivo puede estar embebido en el HTML o cargarse desde tu CMS.
{
"tenant": "TU_TENANT_ID",
"rules": {
"default": "metered",
"metered": {
"freeArticles": 3,
"resetPeriod": "monthly"
},
"hardPaywall": {
"sections": ["investigaciones", "opinion-premium"]
}
},
"wall": {
"theme": "default",
"position": "inline",
"blur": true,
"previewParagraphs": 3
},
"payment": {
"gateway": "mercadopago",
"currency": "COP",
"plans": ["mensual", "anual"]
},
"analytics": {
"ga4": true,
"metaPixel": false
}
}Tu primer muro en 15 minutos
Sigue estos pasos para tener un paywall funcional en tu sitio:
Inserta el SDK
Agrega el script tag de PAYWL en el <head> de tu sitio.
Inicializa PAYWL
En las paginas de contenido, inicializa el SDK y verifica el acceso del usuario:
// En cada pagina de articulo
paywl.init();
// Verificar si el usuario tiene acceso
const access = await paywl.check({
contentId: 'articulo-123',
contentType: 'article',
section: 'investigaciones'
});
if (!access.granted) {
// Mostrar el muro de suscripcion
paywl.wall({
target: '#article-content',
previewParagraphs: 3,
blur: true
});
}Configura la pasarela de pagos
Desde el panel de PAYWL, conecta tu cuenta de MercadoPago, Stripe o Wompi. Los flujos de pago se manejan automaticamente por el SDK.
Verifica en sandbox
Usa las credenciales de sandbox para probar el flujo completo: lectura gratuita, aparicion del muro, suscripcion y acceso al contenido.
Integracion con CMS
Strapi v5DISPONIBLE
Strapi v5 es el stack del piloto oficial de PAYWL. La integracion utiliza un middleware de validacion de acceso que se ejecuta antes de servir el contenido.
import { Paywl } from '@paywl/sdk-node';
const paywl = new Paywl({
tenantId: process.env.PAYWL_TENANT_ID,
apiKey: process.env.PAYWL_API_KEY,
});
export default () => {
return async (ctx, next) => {
const { slug } = ctx.params;
const userId = ctx.state?.user?.id || ctx.cookies.get('paywl_uid');
// Verificar acceso con PAYWL Engine
const access = await paywl.checkAccess({
userId,
contentId: slug,
contentType: ctx.request.url.includes('/articles')
? 'article'
: 'page',
});
// Inyectar resultado en el response
ctx.state.paywlAccess = access;
await next();
// Si no tiene acceso, truncar el contenido
if (!access.granted && ctx.response.body?.data?.content) {
const paragraphs = ctx.response.body.data.content
.split('</p>')
.slice(0, 3);
ctx.response.body.data.content = paragraphs.join('</p>') + '</p>';
ctx.response.body.data.isPaywalled = true;
ctx.response.body.data.wallConfig = access.wallConfig;
}
};
};export default [
'strapi::logger',
'strapi::errors',
'strapi::security',
'strapi::cors',
// ... otros middlewares
{
name: 'global::paywl-access',
config: {},
},
'strapi::body',
'strapi::query',
];WordPressDISPONIBLE
Para WordPress, PAYWL funciona con un plugin ligero que inyecta el SDK en el frontend y agrega filtros de contenido. El plugin esta actualmente en desarrollo activo.
# Proximamente disponible en el repositorio de WordPress
# Por ahora, instalacion manual:
cd wp-content/plugins/
git clone https://github.com/nivelics/paywl-wp.git
wp plugin activate paywl-wp// Credenciales de PAYWL
define('PAYWL_TENANT_ID', 'tu-tenant-id');
define('PAYWL_API_KEY', 'tu-api-key');
define('PAYWL_ENVIRONMENT', 'production'); // o 'sandbox'CMS Headless personalizadoDISPONIBLE
Cualquier CMS headless que exponga una API REST o GraphQL puede integrarse con PAYWL. El contrato de integracion estandar define los endpoints que tu CMS debe implementar y los que PAYWL expone.
┌──────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Tu CMS │────>│ PAYWL Engine │────>│ Pasarela Pago │
│ (Frontend) │<────│ (API REST) │<────│ (MercadoPago) │
└──────────────┘ └──────────────────┘ └─────────────────┘
│ │
│ 1. SDK verifica │ 2. Engine evalua
│ acceso │ reglas de negocio
│ │
│ 3. Si no tiene │ 4. Procesa pago
│ acceso: muestra │ y activa
│ el muro │ suscripcion
│ │
└──────────────────────┘Para iniciar la integracion con un CMS personalizado, contacta al equipo tecnico de Nivelics para recibir el documento de contrato de integracion API con todos los endpoints, payloads y flujos documentados.
API Reference
La API de PAYWL utiliza REST sobre HTTPS. Todas las requests deben incluir el header Authorization: Bearer TU_API_KEY. La URL base es https://api.paywl.io.
/api/v1/accessValida si un usuario tiene acceso a un contenido especifico segun las reglas de negocio configuradas. Esta es la llamada principal que el SDK realiza automaticamente.
Request Body
| Parametro | Tipo | Requerido | Descripcion |
|---|---|---|---|
| userId | string | No | ID del usuario. Si no se provee, se usa la cookie paywl_uid. |
| contentId | string | Si | Identificador unico del articulo o contenido. |
| contentType | string | No | Tipo de contenido: "article", "page", "video". Default: "article". |
| section | string | No | Seccion o categoria del contenido. |
| device | string | No | Tipo de dispositivo: "mobile", "desktop", "tablet". Se detecta automaticamente si no se envía. |
Response (200 OK)
{
"granted": false,
"reason": "metered_limit_reached",
"articlesRead": 3,
"articlesLimit": 3,
"resetDate": "2026-04-01T00:00:00Z",
"wallConfig": {
"type": "metered",
"previewParagraphs": 3,
"blur": true,
"plans": [
{
"id": "mensual",
"name": "Suscripcion Mensual",
"price": 15000,
"currency": "COP",
"period": "month"
}
]
}
}/api/v1/subscriber/:idObtiene el estado completo de un suscriptor: plan activo, historial de pagos, fecha de renovacion y estado de la cuenta.
Path Parameters
| Parametro | Tipo | Requerido | Descripcion |
|---|---|---|---|
| id | string | Si | ID del suscriptor en PAYWL. |
Response (200 OK)
{
"id": "sub_abc123",
"email": "lector@ejemplo.com",
"status": "active",
"plan": {
"id": "mensual",
"name": "Suscripcion Mensual",
"price": 15000,
"currency": "COP"
},
"currentPeriod": {
"start": "2026-03-01T00:00:00Z",
"end": "2026-04-01T00:00:00Z"
},
"paymentMethod": "mercadopago",
"createdAt": "2026-01-15T10:30:00Z",
"articlesRead": 47,
"lastLogin": "2026-03-12T08:15:00Z"
}/api/v1/subscribeCrea una nueva suscripcion. Inicia el flujo de pago con la pasarela configurada y registra al suscriptor en PAYWL.
Request Body
| Parametro | Tipo | Requerido | Descripcion |
|---|---|---|---|
| string | Si | Email del nuevo suscriptor. | |
| planId | string | Si | ID del plan de suscripcion seleccionado. |
| paymentGateway | string | No | Pasarela de pago: "mercadopago", "stripe", "wompi". Default: la configurada en el tenant. |
| metadata | object | No | Datos adicionales para adjuntar al suscriptor (utm_source, referrer, etc.). |
Response (201 Created)
{
"subscriberId": "sub_xyz789",
"status": "pending_payment",
"paymentUrl": "https://www.mercadopago.com.co/checkout/v1/redirect?pref_id=abc123",
"expiresAt": "2026-03-12T22:30:00Z"
}/api/v1/webhookEndpoint para recibir notificaciones de eventos desde las pasarelas de pago. Configura esta URL en el panel de tu pasarela (MercadoPago, Stripe, Wompi).
Eventos soportados
| Evento | Descripcion | Accion en PAYWL |
|---|---|---|
| payment.approved | Pago aprobado | Activa la suscripcion del usuario |
| payment.rejected | Pago rechazado | Marca intento fallido, notifica al usuario |
| subscription.renewed | Renovacion automatica exitosa | Extiende el periodo activo |
| subscription.cancelled | Suscripcion cancelada | Desactiva acceso al final del periodo pagado |
| chargeback | Contracargo | Suspende la cuenta y notifica al medio |
X-Paywl-Signature. Valida esta firma antes de procesar cualquier evento.SDK JavaScript
Metodos disponibles
paywl.init(config?)
Inicializa el SDK. Se llama automaticamente si usas el script tag. Solo necesitas llamarlo manualmente si usas el paquete npm.
paywl.init({
tenantId: 'TU_TENANT_ID',
apiKey: 'TU_API_KEY',
debug: false, // true para ver logs en consola
});paywl.check(options)
Verifica si el usuario actual tiene acceso a un contenido. Retorna una promesa con el resultado de la evaluacion de reglas.
const result = await paywl.check({
contentId: 'articulo-123',
contentType: 'article', // 'article' | 'page' | 'video'
section: 'investigaciones', // opcional
});
// result.granted: boolean
// result.reason: 'subscribed' | 'free_tier' | 'metered_limit_reached' | ...
// result.wallConfig: configuracion del muro a mostrarpaywl.wall(options)
Renderiza el muro de suscripcion en el DOM. Maneja automaticamente el blur del contenido, el formulario de registro/login y el flujo de pago.
paywl.wall({
target: '#article-content', // Selector CSS del contenedor
previewParagraphs: 3, // Parrafos visibles antes del muro
blur: true, // Efecto blur en contenido oculto
theme: 'default', // 'default' | 'minimal' | 'custom'
customCSS: '', // CSS personalizado (solo con theme: 'custom')
onShow: () => {}, // Callback cuando el muro se muestra
onConvert: (subscriber) => {}, // Callback cuando el usuario se suscribe
onDismiss: () => {}, // Callback cuando el usuario cierra el muro
});paywl.track(event, data?)
Envia eventos de analytics al dashboard de PAYWL. Los eventos de conversion se envian automaticamente, pero puedes enviar eventos personalizados.
// Evento personalizado
paywl.track('article_shared', {
contentId: 'articulo-123',
platform: 'twitter',
});
// Eventos enviados automaticamente por el SDK:
// - 'page_view'
// - 'wall_shown'
// - 'wall_converted'
// - 'wall_dismissed'
// - 'login_success'
// - 'payment_started'
// - 'payment_completed'Eventos
El SDK emite eventos que puedes escuchar para integrar con tu propio sistema de analytics o para ejecutar logica personalizada.
// Escuchar cuando el muro se muestra
paywl.on('wall.shown', (data) => {
console.log('Muro mostrado:', data.wallType, data.contentId);
// Enviar a GA4
gtag('event', 'paywall_shown', {
wall_type: data.wallType,
content_id: data.contentId,
});
});
// Escuchar cuando un usuario se suscribe
paywl.on('wall.converted', (data) => {
console.log('Nueva suscripcion:', data.subscriberId, data.planId);
// Enviar a tu CRM
fetch('/api/crm/new-subscriber', {
method: 'POST',
body: JSON.stringify(data),
});
});
// Escuchar cuando el usuario cierra el muro
paywl.on('wall.dismissed', (data) => {
console.log('Muro cerrado:', data.contentId);
});| Evento | Datos | Descripcion |
|---|---|---|
| wall.shown | { wallType, contentId } | El muro fue renderizado en pantalla |
| wall.converted | { subscriberId, planId, email } | El usuario completo la suscripcion |
| wall.dismissed | { contentId, timeVisible } | El usuario cerro el muro sin suscribirse |
Configuracion avanzada
Lazy Loading
Por defecto, el SDK se carga de forma asincrona y no bloquea el rendering de la pagina. Para mayor control:
<!-- Cargar el SDK solo cuando el usuario hace scroll -->
<script
src="https://cdn.paywl.io/sdk/v1/paywl.min.js"
data-tenant="TU_TENANT_ID"
data-key="TU_API_KEY"
data-lazy="true"
data-lazy-threshold="0.5"
async
></script>Custom Wall UI
Si necesitas un diseno completamente personalizado para el muro, puedes usar el modo headless:
// Modo headless: tu controlas la UI, PAYWL maneja la logica
const access = await paywl.check({ contentId: 'articulo-123' });
if (!access.granted) {
// Renderizar tu propio componente de muro
document.getElementById('custom-wall').innerHTML = `
<div class="mi-paywall">
<h2>Contenido exclusivo para suscriptores</h2>
<p>Has leido ${access.articlesRead} de ${access.articlesLimit} articulos gratuitos.</p>
<button onclick="paywl.startCheckout('${access.wallConfig.plans[0].id}')">
Suscribirme por ${access.wallConfig.plans[0].price} ${access.wallConfig.plans[0].currency}/mes
</button>
</div>
`;
}Analytics Callbacks
Integra PAYWL con cualquier plataforma de analytics:
paywl.init({
tenantId: 'TU_TENANT_ID',
apiKey: 'TU_API_KEY',
analytics: {
// Google Analytics 4
ga4: {
measurementId: 'G-XXXXXXXXXX',
sendPageView: true,
sendConversion: true,
},
// Meta Pixel
metaPixel: {
pixelId: '123456789',
trackPurchase: true,
},
// Callback personalizado para cualquier plataforma
custom: (event, data) => {
// Enviar a Mixpanel, Amplitude, etc.
mixpanel.track(event, data);
},
},
});Guias de Integracion por Pasarela
MercadoPagoDISPONIBLE
Paises soportados: Colombia, Mexico, Argentina, Chile, Peru, Uruguay
PAYWL utiliza la API de Suscripciones Preaprobadas de MercadoPago para manejar cobros recurrentes automaticos.
1. Configura tus credenciales
En el panel de PAYWL, ve a Configuracion > Pasarelas de Pago > MercadoPago e ingresa tus credenciales:
Access Token: APP_USR-xxxxxxxxxxxx-xxxxxx-xxxxxxxxx-xxxxxxxxx
Public Key: APP_USR-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Client ID: xxxxxxxxxxxx
Client Secret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Webhook URL: https://api.paywl.io/api/v1/webhook/mercadopago/TU_TENANT_ID2. Flujo de suscripcion
// El SDK maneja todo el flujo automaticamente:
// 1. Usuario hace clic en "Suscribirme"
// 2. PAYWL crea una preferencia de pago en MercadoPago
// 3. Usuario es redirigido al checkout de MercadoPago
// 4. MercadoPago procesa el pago y envía webhook
// 5. PAYWL activa la suscripcion automaticamente
// Si necesitas personalizar el flujo:
const checkout = await paywl.startCheckout({
planId: 'mensual',
gateway: 'mercadopago',
successUrl: 'https://tumedio.com/bienvenido',
failureUrl: 'https://tumedio.com/pago-fallido',
pendingUrl: 'https://tumedio.com/pago-pendiente',
});
// checkout.redirectUrl → URL del checkout de MercadoPagoStripeDISPONIBLE
PAYWL integra Stripe Billing para medios que operan en mercados internacionales o que ya tienen una cuenta de Stripe.
Configuracion
Secret Key: sk_live_xxxxxxxxxxxxxxxxxxxx
Publishable Key: pk_live_xxxxxxxxxxxxxxxxxxxx
Webhook Secret: whsec_xxxxxxxxxxxxxxxxxxxx
Webhook URL: https://api.paywl.io/api/v1/webhook/stripe/TU_TENANT_ID// PAYWL crea automaticamente los productos y precios
// en tu cuenta de Stripe basandose en los planes
// configurados en el panel de PAYWL.
// Tambien puedes vincular productos existentes:
// Panel PAYWL > Pasarelas > Stripe > Mapeo de Productos
// Ejemplo de mapeo:
{
"plan_mensual": "price_1234567890", // Stripe Price ID
"plan_anual": "price_0987654321"
}WompiDISPONIBLE
Wompi es la pasarela de pagos de Bancolombia, ideal para medios colombianos que quieren ofrecer pagos con PSE, tarjeta de credito y Nequi.
Configuracion
Public Key: pub_prod_xxxxxxxxxxxxxxxxxxxx
Private Key: prv_prod_xxxxxxxxxxxxxxxxxxxx
Events Secret: prod_events_xxxxxxxxxxxxxxxxxxxx
Integrity Secret: prod_integrity_xxxxxxxxxxxxxxxxxxxx
Webhook URL: https://api.paywl.io/api/v1/webhook/wompi/TU_TENANT_IDMetodos de pago soportados via Wompi
Tarjeta de credito/debito
Visa, Mastercard, American Express
PSE
Transferencia bancaria (Colombia)
Nequi
Billetera digital (Colombia)
Corresponsales bancarios
Efectivo via Efecty, Baloto
// PAYWL maneja el widget de Wompi automaticamente
const checkout = await paywl.startCheckout({
planId: 'mensual',
gateway: 'wompi',
// Wompi soporta pagos recurrentes via tokenizacion
// PAYWL gestiona la renovacion automatica
});
// Para pagos recurrentes, PAYWL:
// 1. Tokeniza la tarjeta del usuario via Wompi
// 2. Almacena el token de forma segura (PCI-DSS compliant)
// 3. Ejecuta el cobro automatico cada periodo
// 4. Notifica al medio y al suscriptor del resultadoNecesitas ayuda con la integracion?
Nuestro equipo tecnico te acompana durante todo el proceso. Contactanos para resolver cualquier duda.