Inicio/Documentacion

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
Entorno de pruebas
PAYWL provee un ambiente de sandbox para que pruebes la integracion sin afectar a tus usuarios reales. Las credenciales de sandbox se entregan junto con las de produccion.

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.

Insertar en el <head> de tu sitio
html
<!-- 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:

Instalacion via npm
bash
npm install @paywl/sdk

# o con yarn
yarn add @paywl/sdk
Importacion en tu proyecto
javascript
import { 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.

paywl-config.json
json
{
  "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
  }
}
Configuracion dinamica
Las reglas de acceso se pueden modificar en tiempo real desde el panel de administracion de PAYWL. No es necesario redesplegar tu sitio para cambiar la configuracion de las reglas.

Tu primer muro en 15 minutos

Sigue estos pasos para tener un paywall funcional en tu sitio:

1

Inserta el SDK

Agrega el script tag de PAYWL en el <head> de tu sitio.

2

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
  });
}
3

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.

4

Verifica en sandbox

Usa las credenciales de sandbox para probar el flujo completo: lectura gratuita, aparicion del muro, suscripcion y acceso al contenido.

Soporte durante la integracion
Durante los primeros 30 dias, el equipo tecnico de Nivelics te acompana directamente por WhatsApp para resolver cualquier duda de la integracion.

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.

Middleware de validacion — src/middlewares/paywl-access.ts
typescript
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;
    }
  };
};
Registrar middleware — config/middlewares.ts
typescript
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.

Instalacion del plugin (wp-cli)
bash
# 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
Configuracion en wp-config.php
php
// Credenciales de PAYWL
define('PAYWL_TENANT_ID', 'tu-tenant-id');
define('PAYWL_API_KEY', 'tu-api-key');
define('PAYWL_ENVIRONMENT', 'production'); // o 'sandbox'
Plugin en desarrollo
El plugin de WordPress esta en fase beta. Para medios que usan WordPress, recomendamos la integracion via script tag directo en el theme hasta que el plugin sea estable.

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.

Contrato de integracion — Diagrama de flujo
text
┌──────────────┐     ┌──────────────────┐     ┌─────────────────┐
│  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.

POST/api/v1/access

Valida 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

ParametroTipoRequeridoDescripcion
userIdstringNoID del usuario. Si no se provee, se usa la cookie paywl_uid.
contentIdstringSiIdentificador unico del articulo o contenido.
contentTypestringNoTipo de contenido: "article", "page", "video". Default: "article".
sectionstringNoSeccion o categoria del contenido.
devicestringNoTipo 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"
      }
    ]
  }
}
GET/api/v1/subscriber/:id

Obtiene el estado completo de un suscriptor: plan activo, historial de pagos, fecha de renovacion y estado de la cuenta.

Path Parameters

ParametroTipoRequeridoDescripcion
idstringSiID 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"
}
POST/api/v1/subscribe

Crea una nueva suscripcion. Inicia el flujo de pago con la pasarela configurada y registra al suscriptor en PAYWL.

Request Body

ParametroTipoRequeridoDescripcion
emailstringSiEmail del nuevo suscriptor.
planIdstringSiID del plan de suscripcion seleccionado.
paymentGatewaystringNoPasarela de pago: "mercadopago", "stripe", "wompi". Default: la configurada en el tenant.
metadataobjectNoDatos 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"
}
POST/api/v1/webhook

Endpoint para recibir notificaciones de eventos desde las pasarelas de pago. Configura esta URL en el panel de tu pasarela (MercadoPago, Stripe, Wompi).

Eventos soportados

EventoDescripcionAccion en PAYWL
payment.approvedPago aprobadoActiva la suscripcion del usuario
payment.rejectedPago rechazadoMarca intento fallido, notifica al usuario
subscription.renewedRenovacion automatica exitosaExtiende el periodo activo
subscription.cancelledSuscripcion canceladaDesactiva acceso al final del periodo pagado
chargebackContracargoSuspende la cuenta y notifica al medio
Seguridad del webhook
Todos los webhooks incluyen una firma HMAC-SHA256 en el header 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 mostrar

paywl.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);
});
EventoDatosDescripcion
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:

Credenciales requeridas
text
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_ID

2. 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 MercadoPago
Modo sandbox
Usa credenciales de prueba de MercadoPago para testear el flujo completo sin cobros reales. PAYWL detecta automaticamente el ambiente basado en las credenciales proporcionadas.

StripeDISPONIBLE

PAYWL integra Stripe Billing para medios que operan en mercados internacionales o que ya tienen una cuenta de Stripe.

Configuracion

Credenciales requeridas
text
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
Configuracion de productos en Stripe
javascript
// 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"
}
Stripe + LATAM
Stripe esta disponible en Colombia, Mexico y Brasil. Para otros paises de LATAM donde Stripe no opera, usa MercadoPago o Wompi como alternativa.

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

Credenciales requeridas
text
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_ID

Metodos 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

Flujo de pago con Wompi
javascript
// 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 resultado

Necesitas ayuda con la integracion?

Nuestro equipo tecnico te acompana durante todo el proceso. Contactanos para resolver cualquier duda.