Dashboard

Resumen automatizado de ingresos

Desconectado
Obteniendo Tasas en tiempo real...
0,00
Recibidos Hoy
0,00
Esta Semana
0,00
Este Mes
0
Total Transacciones
Historial Completo
Conectar Aplicaciones
Exportar Excel

Tendencia de Ingresos

Recepciones Recientes (En Vivo)

Cargando...

Base de Datos de Pagos

Fecha y Hora Nro. Referencia / User Origen Monto Recibido Estado Acciones
0
Procesados Exitosamente
0
Requieren Revisión
0
Anulados / Erróneos

Crecimiento del Monto Acumulado

Vinculación Inteligente

Tu smartphone será el puente entre los pagos de tus clientes y tu plataforma. Genera el código para sincronizarlo al instante.

Central de Integración Automática

Conecta PagoListo con tu banco o aplicaciones externas.

Archivos de Configuración MacroDroid

Descarga la macro autogenerada con tus credenciales. Importa el archivo en MacroDroid y configura el Disparador manualmente.

Configuración Definitiva de MacroDroid para PagoListo

Sigue estos pasos exactamente en este orden. Está diseñado para ser rápido, a prueba de errores y compatible con el sistema multimoneda.

  • 1
    Crear la Macro y las Variables Locales

    Es fundamental crear las variables antes de configurar las acciones para que aparezcan en los menús desplegables.

    1. Abre MacroDroid y toca en Añadir Macro.
    2. Arriba del todo, en "Introducir nombre", escribe: PagoListo BDV.
    3. Ve a la sección de Variables locales y toca el botón +:
       • Nombre: var_monto | Tipo: Cadena (String). Acepta.
       • Nombre: var_referencia | Tipo: Cadena (String). Acepta.

  • 2
    Configurar el Disparador (Panel Rojo)

    Esto le dirá a MacroDroid cuándo debe actuar.

    Para App Bancaria (Notificaciones):
    1. Toca el + en el panel rojo de Disparadores.
    2. Ve a Eventos de dispositivo -> Notificación -> Notificación recibida.
    3. Selecciona la app de tu banco (ej: BDV en línea). Acepta.
    4. En "Coincidencia de texto", déjalo en Cualquiera y acepta.

    Para Pagos por SMS (Provincial/Mercantil):
    1. Toca el + en el panel rojo.
    2. Ve a Eventos de llamadas/SMS -> SMS Recibido.
    3. Selecciona Seleccionar Número(s) y añade el número del banco (ej: 77107 o 5001). Acepta.
    4. En "Contenido del SMS", déjalo en Cualquiera y acepta.

  • 3
    Configurar las Acciones (Panel Azul)

    Acción 1 (Extraer Monto): Toca + -> Manipulación de texto -> Extraer texto.
    - Texto original: Toca [...] y selecciona [not_text] si elegiste Notificaciones, o [sms_message] si elegiste SMS.
    - Expresión regular: [0-9][0-9.]*,[0-9]{2}|(?<=Bs\. )[0-9]+\.[0-9]+|(?<=Bs )[0-9]+\.[0-9]+
    *Esta expresión extrae inteligentemente el monto exacto, ignorando puntos sueltos, y asegurando compatibilidad total con BNC, BDV, y los nuevos formatos de Banesco.
    - Guardar en: Selecciona var_monto.

    Acción 2 (Extraer Referencia): Toca + -> Manipulación de texto -> Extraer texto.
    - Texto original: Selecciona [not_text] o [sms_message] según tu caso.
    - Expresión regular: (?i)(?<=Ref )[0-9]+|(?<=Ref: )[0-9]+|(?<=Ref:)[0-9]+|(?<=Ref\. )[0-9]+|(?<=operaci[oó]n )[0-9]+|(?<=referencia )[0-9]+|(?<=Ref)[0-9]+|(?<=desde el )[0-9]+(?!.*(?:Ref|operaci[oó]n|referencia))
    *Esta expresión soporta cualquier variante (Ref, Ref:, Ref., operación, referencia y teléfonos de Bancamiga) incluso si los números están pegados.
    - Guardar en: Selecciona var_referencia.

    Acción 3 (Enviar a Supabase): Toca + -> Aplicaciones -> Petición HTTP.
    - Método: POST
    - URL: Configura Supabase en Ajustes
    - Pestaña Cabecera: Añade apikey y Authorization (Bearer + Tu Key).
    - Pestaña Cuerpo: Tipo Personalizado (JSON). Pega esto:

    {
      "referencia": "[system_time]_[lv=var_referencia]",
      "monto": "[lv=var_monto]",
      "moneda": "Bs"
    }
  • 4
    Guardar

    En la esquina inferior derecha, toca el botón circular con el ícono de Check (✔️) para guardar la macro completa. ¡Listo!

Automatización en la Nube con Google Apps Script

Como los navegadores web bloquean la lectura directa de correos por seguridad, la forma más profesional y 100% gratuita de registrar pagos de Binance es usando un Script en tu Gmail. Este código se ejecutará automáticamente en los servidores de Google cada vez que llegue un correo, extrayendo el monto y el usuario remitente.

  • 1
    Abre Google Apps Script

    Ve a script.google.com e inicia sesión con el Gmail donde recibes las notificaciones de Binance. Haz clic en "Nuevo Proyecto".

  • 2
    Pega el Código de Integración

    Borra el código que aparece por defecto, copia el siguiente script y pégalo.
    ¡Importante! Si ya conectaste tu base de datos en Configuración, tus credenciales ya están inyectadas automáticamente en este código.

    function checkBinanceEmails() {
      var supabaseUrl = "URL_DE_TU_SUPABASE/rest/v1/pagos";
      var supabaseKey = "TU_API_KEY";
    
      // Lista de remitentes autorizados de Binance
      var ALLOWED_SENDERS = [
        "do-not-reply@ses.binance.com",
        "donotreply@directmail.binance.com",
        "do-not-reply@directmail.binance.com",
        "donotreply@ses.binance.com",
        "do-not-reply@post.binance.com",
        "donotreply@post.binance.com",
        "do-not-reply@binance.com",
        "donotreply@binance.com"
      ];
    
      for (var loop = 0; loop < 6; loop++) {
        var threads = GmailApp.search(
          'subject:"[Binance] Payment Receive Successful" is:unread newer_than:1d'
        );
    
        for (var i = 0; i < threads.length; i++) {
          var messages = threads[i].getMessages();
          for (var j = 0; j < messages.length; j++) {
            var msg = messages[j];
            if (!msg.isUnread()) continue;
    
            // Anti-estafa: Verificar remitente oficial de Binance
            var senderRaw = msg.getFrom();
            var emailMatch = senderRaw.match(/<([^>]+)>/);
            var senderEmail = emailMatch
              ? emailMatch[1].toLowerCase()
              : senderRaw.toLowerCase().trim();
    
            // Valida que esté en la lista o sea un subdominio legítimo de binance.com
            var isBinanceOfficial = ALLOWED_SENDERS.indexOf(senderEmail) !== -1 ||
                                    /^do-?not-?reply@([a-z0-9-]+\.)*binance\.com$/i.test(senderEmail);
    
            if (!isBinanceOfficial) {
              msg.markRead();
              continue;
            }
    
            // Anti-estafa: Verificar estructura del cuerpo
            var body = msg.getPlainBody();
            if (
              body.indexOf("You received an incoming transfer") === -1 ||
              body.indexOf("This is an automated message") === -1
            ) {
              msg.markRead();
              continue;
            }
    
            // Extraer monto (soporta enteros, decimales y miles)
            var amountMatch = body.match(
              /Amount:\s*\n?\s*([0-9.,]+)\s*USDT/i
            );
            var monto = amountMatch
              ? parseFloat(amountMatch[1].replace(/,/g, ""))
              : 0;
    
            // Extraer remitente (nombre de usuario Binance)
            var fromMatch = body.match(/From:\s*\n?\s*(.+)/i);
            var remitente = fromMatch
              ? fromMatch[1].replace(/[\r\n*_]/g, "").trim()
              : "BIN-" + msg.getId().substring(0, 8).toUpperCase();
    
            // Extraer timestamp de Binance (fijo por transacción)
            var timeMatch = body.match(
              /Time:\s*\n?\s*(\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})/i
            );
            var binanceTime = timeMatch
              ? timeMatch[1].replace(/[\s:-]/g, "")
              : String(Math.floor(msg.getDate().getTime() / 1000));
    
            // Referencia determinista: mismo correo = misma referencia siempre
            var referencia = binanceTime + "_" + remitente;
    
            if (monto <= 0) { msg.markRead(); continue; }
    
            var payload = {
              referencia: referencia,
              monto: monto,
              moneda: "USDT",
              estado: "pending"
            };
    
            try {
              var response = UrlFetchApp.fetch(supabaseUrl, {
                method: "post",
                headers: {
                  apikey: supabaseKey,
                  Authorization: "Bearer " + supabaseKey,
                  "Content-Type": "application/json",
                  Prefer: "resolution=ignore-duplicates"
                },
                payload: JSON.stringify(payload),
                muteHttpExceptions: true
              });
              var code = response.getResponseCode();
              if (code >= 200 && code < 300) { msg.markRead(); }
              else if (code === 409) { msg.markRead(); }
              // Si error → NO marcar leído → reintento automático
            } catch (e) {
              // Error de red → NO marcar leído → reintento automático
            }
          }
        }
        if (loop < 5) Utilities.sleep(10000);
      }
    }
  • 3
    Crear el Disparador (Automatización)

    1. Guarda el proyecto (icono de disquete).
    2. En el menú izquierdo, haz clic en el ícono de reloj (Disparadores).
    3. Añadir disparador -> Selecciona la función checkBinanceEmails -> Fuente del evento: Basado en el tiempo -> Tipo: Minutos -> Cada minuto.
    4. Guarda y acepta los permisos de Google. ¡Listo! Tu sistema procesará USDT automáticamente.

Integración con Billetera Zinli

Al igual que con Binance, puedes capturar automáticamente los pagos recibidos en Zinli leyendo las notificaciones que llegan a tu correo ("¡Recibiste un Zinli!"). Este script de Google Apps extraerá el monto exacto y la referencia.

  • 1
    Abre Google Apps Script

    Ve a script.google.com e inicia sesión con el Gmail asociado a tu cuenta de Zinli. Haz clic en "Nuevo Proyecto".

  • 2
    Pega el Código de Integración (Zinli)

    Copia el siguiente script y reemplaza todo el contenido del editor.
    Tus credenciales ya están vinculadas automáticamente.

    function checkZinliEmails() {
      var supabaseUrl = "URL_DE_TU_SUPABASE/rest/v1/pagos";
      var supabaseKey = "TU_API_KEY";
      var ZINLI_SENDER = "zinli-no-responder@notificaciones.zinli.com";
    
      for (var loop = 0; loop < 6; loop++) {
        var threads = GmailApp.search(
          'subject:"Recibiste un Zinli" is:unread newer_than:1d'
        );
    
        for (var i = 0; i < threads.length; i++) {
          var messages = threads[i].getMessages();
          for (var j = 0; j < messages.length; j++) {
            var msg = messages[j];
            if (!msg.isUnread()) continue;
    
            // Anti-estafa: Verificar remitente oficial de Zinli
            var senderRaw = msg.getFrom();
            var emailMatch = senderRaw.match(/<([^>]+)>/);
            var senderEmail = emailMatch
              ? emailMatch[1].toLowerCase()
              : senderRaw.toLowerCase().trim();
            if (senderEmail !== ZINLI_SENDER) {
              msg.markRead();
              continue;
            }
    
            // Anti-estafa: Verificar estructura del cuerpo
            var body = msg.getPlainBody();
            if (
              body.indexOf("Recibiste un Zinli") === -1 ||
              body.indexOf("Referencia") === -1
            ) {
              msg.markRead();
              continue;
            }
    
            // Extraer monto ($4.00 → 4.00)
            var amountMatch = body.match(
              /Monto[\s\S]*?\$([0-9]+(?:[.,][0-9]+)?)/i
            );
            var monto = amountMatch
              ? parseFloat(amountMatch[1].replace(/,/g, ""))
              : 0;
    
            // Extraer referencia única de Zinli (ej: 764968364346)
            var refMatch = body.match(/Referencia[\s\S]*?([0-9]{6,})/i);
            var referencia = refMatch
              ? refMatch[1].trim()
              : "ZIN-" + msg.getId().substring(0, 12).toUpperCase();
    
            if (monto <= 0) { msg.markRead(); continue; }
    
            var payload = {
              referencia: referencia,
              monto: monto,
              moneda: "USD",
              estado: "pending"
            };
    
            try {
              var response = UrlFetchApp.fetch(supabaseUrl, {
                method: "post",
                headers: {
                  apikey: supabaseKey,
                  Authorization: "Bearer " + supabaseKey,
                  "Content-Type": "application/json",
                  Prefer: "resolution=ignore-duplicates"
                },
                payload: JSON.stringify(payload),
                muteHttpExceptions: true
              });
              var code = response.getResponseCode();
              if (code >= 200 && code < 300) { msg.markRead(); }
              else if (code === 409) { msg.markRead(); }
              // Si error → NO marcar leído → reintento automático
            } catch (e) {
              // Error de red → NO marcar leído → reintento automático
            }
          }
        }
        if (loop < 5) Utilities.sleep(10000);
      }
    }
  • 3
    Crear el Disparador para Zinli

    1. Guarda el proyecto.
    2. Ve a Disparadores (ícono de reloj).
    3. Añadir disparador -> Función checkZinliEmails -> Fuente: Basado en el tiempo -> Minutos -> Cada minuto.
    4. Guarda y acepta los permisos de Google.

Automatización de Correos de Banplus (Pago Móvil)

Captura automáticamente los pagos recibidos por Pago Móvil en Banplus leyendo las notificaciones que llegan a tu correo ("Transacción Pago Movil Interbancario"). Este script de Google Apps extraerá el monto exacto y el número de operación.

  • 1
    Abre Google Apps Script

    Ve a script.google.com e inicia sesión con el Gmail donde recibes las notificaciones de Banplus. Haz clic en "Nuevo Proyecto".

  • 2
    Pega el Código de Integración

    Borra el código que aparece por defecto, copia el siguiente script y pégalo.
    ¡Importante! Si ya conectaste tu base de datos en Configuración, tus credenciales ya están inyectadas automáticamente en este código.

    function checkBanplusEmails() {
      var supabaseUrl = "URL_DE_TU_SUPABASE/rest/v1/pagos";
      var supabaseKey = "TU_API_KEY";
    
      // Lista de remitentes autorizados de Banplus
      var ALLOWED_SENDERS = [
        "banplusonline@banplus.com",
        "banpluscomunicaciones@banplus.com"
      ];
    
      for (var loop = 0; loop < 6; loop++) {
        var threads = GmailApp.search(
          'subject:"Pago Movil Interbancario" is:unread newer_than:1d'
        );
    
        for (var i = 0; i < threads.length; i++) {
          var messages = threads[i].getMessages();
          for (var j = 0; j < messages.length; j++) {
            var msg = messages[j];
            if (!msg.isUnread()) continue;
    
            // Anti-estafa: Verificar remitente oficial de Banplus
            var senderRaw = msg.getFrom();
            var emailMatch = senderRaw.match(/<([^>]+)>/);
            var senderEmail = emailMatch
              ? emailMatch[1].toLowerCase()
              : senderRaw.toLowerCase().trim();
    
            var isBanplusOfficial = ALLOWED_SENDERS.indexOf(senderEmail) !== -1 ||
                                    /^[a-z0-9._-]+@([a-z0-9-]+\.)*banplus\.com$/i.test(senderEmail);
    
            if (!isBanplusOfficial) {
              msg.markRead();
              continue;
            }
    
            var body = msg.getPlainBody();
    
            // Anti-estafa: Verificar autenticidad del cuerpo oficial de Banplus
            var hasBanplusMark = body.indexOf("Banplus") !== -1 || body.indexOf("banplus.com") !== -1;
            var isAprobado = body.toUpperCase().indexOf("APROBADA") !== -1 ||
                             body.toUpperCase().indexOf("TRANSACCION APROBADA") !== -1;
    
            if (!hasBanplusMark || !isAprobado) {
              msg.markRead();
              continue;
            }
    
            // Extraer Referencia / Número de Operación (ej: 001063068383)
            var refMatch = body.match(/(?:N[úu\?]?mero\s+de\s+Operaci[óo\?]?n|Operaci[óo\?]?n)\s*[:\r\n\s]*([0-9]{6,})/i);
            var referencia = refMatch
              ? refMatch[1].trim()
              : "BP-" + msg.getId().substring(0, 10).toUpperCase();
    
            // Extraer Monto (ej: 100.00)
            var amountMatch = body.match(/Monto\s*[:\r\n\s]*(?:Bs\.?|VES)?\s*([0-9.,]+)/i);
            var monto = 0;
            if (amountMatch) {
              var montoStr = amountMatch[1].trim();
              var lastDot = montoStr.lastIndexOf('.');
              var lastComma = montoStr.lastIndexOf(',');
              if (lastComma > lastDot) {
                monto = parseFloat(montoStr.replace(/\./g, '').replace(',', '.'));
              } else if (lastDot > lastComma) {
                monto = parseFloat(montoStr.replace(/,/g, ''));
              } else if (lastComma !== -1) {
                monto = parseFloat(montoStr.replace(',', '.'));
              } else {
                monto = parseFloat(montoStr);
              }
            }
    
            if (monto <= 0) {
              msg.markRead();
              continue;
            }
    
            var payload = {
              referencia: referencia,
              monto: monto,
              moneda: "Bs",
              estado: "pending"
            };
    
            try {
              var response = UrlFetchApp.fetch(supabaseUrl, {
                method: "post",
                headers: {
                  apikey: supabaseKey,
                  Authorization: "Bearer " + supabaseKey,
                  "Content-Type": "application/json",
                  Prefer: "resolution=ignore-duplicates"
                },
                payload: JSON.stringify(payload),
                muteHttpExceptions: true
              });
              var code = response.getResponseCode();
              if (code >= 200 && code < 300) {
                msg.markRead();
              } else if (code === 409) {
                msg.markRead();
              }
            } catch (e) {}
          }
        }
        if (loop < 5) Utilities.sleep(10000);
      }
    }
  • 3
    Crear el Disparador para Banplus

    1. Guarda el proyecto (icono de disquete).
    2. En el menú izquierdo, haz clic en el ícono de reloj (Disparadores).
    3. Añadir disparador -> Selecciona la función checkBanplusEmails -> Fuente del evento: Basado en el tiempo -> Tipo: Minutos -> Cada minuto.
    4. Guarda y acepta los permisos de Google. ¡Listo! Tu sistema procesará pagos de Banplus automáticamente.

Conexión a Base de Datos (Supabase)

Configuración Crítica del Sistema

El acceso a las credenciales de la base de datos está protegido por seguridad.

La base de datos requiere una tabla llamada `pagos` (id, referencia, monto, moneda, estado, remitente, caja, created_at).

Ajustes Financieros y Visuales

Moneda de Visualización

Moneda en la que se calculan los totales

Margen P2P USDT (%)

Aumenta la tasa automática para igualar anuncios más altos (Ej: 1.04)

Tasa Manual (USDT / USD)

Ignorar APIs y usar tasa fija en Bs.

Alerta Sonora

Sonido al sincronizar nuevos ingresos

Modo Oscuro

Cambiar apariencia de la interfaz

Notificaciones de Escritorio

Recibir alertas nativas de Windows/Mac

Mantenimiento

Estas acciones son destructivas y no se pueden deshacer.

Configuración de la Cuenta

Activo

Cambia tu nombre de usuario de acceso y/o actualiza tu contraseña de seguridad.


Resumen y Seguridad

Usuario
Cuenta de Cliente PagoListo
Base de Datos Supabase

Servidor de autenticación en la nube

Conectado
Protección de Cuenta

Acceso encriptado mediante contraseña

Protegido