marbuildsRecursos / OpenReply, el ManyChat gratis / comprobado el 14-10-2026
comentaste open · aquí lo tienes

ManyChat, pero gratis.

OpenReply es un programa open source: alguien comenta una palabra en tu post y le llega tu enlace por DM, solo. Usa la API oficial de Instagram. Aquí tienes cuánto cuesta de verdad, los pasos y los errores que me encontré montándolo.

el programa es gratisabierto en GitHubAPI oficial de Instagram

Qué hace

Palabra en un comentario → DMEliges el post y la palabra. Quien la comenta recibe tu mensaje con el enlace.
Respuesta pública a la vezContesta el comentario ("te lo he mandado por DM"), además del DM.
Solo si te siguenPuede pedir que te sigan antes de dar el enlace. Si Instagram no le dice si te siguen, lo manda igual, para no dejar fuera a un seguidor de verdad.
DMs y respuestas a historiasLa misma palabra puede funcionar si te la escriben por DM o como respuesta a una historia.
ClicsCambia el enlace por uno con seguimiento y te dice cuánta gente ha hecho clic en cada campaña.
Registro de cada envíoCada DM enviado, saltado o fallido queda apuntado con su motivo.

Es self-hosted: no hay una web donde te registras y ya. Te montas tu propia copia, y esta guía es para eso. Lo uso yo desde el 12-09-2026: en la semana del 7 al 14 de octubre mandó 712 DMs.

Cómo está hecho, en una línea

Son cuatro piezas: una web (recibe el aviso de Instagram y es donde creas las campañas), una base de datos Postgres (tus campañas), una cola Redis y un worker, que es el que manda los DMs. Es como un restaurante: la web toma nota y el worker es el cocinero, que no se puede ir nunca a casa.

La web la puedes tener gratis en Vercel. El worker no: tiene que estar encendido las 24 horas, y Vercel no deja procesos encendidos. Todo el coste está en dónde pones el worker.

Elige dónde vive el worker

lo que hago yo0 $Ya tienes un servidor

Si ya pagas un servidor (por ejemplo, para n8n), metes ahí Postgres, Redis y el worker. No pagas nada más. Más abajo tienes el prompt para que una IA te lo monte, y el repo trae una guía para servidor propio con Dokploy.

la más fácil~5 $Railway

Es el camino de la guía oficial y por donde empecé yo. La prueba es de 30 días con 5 $ de crédito; luego el plan Hobby cuesta 5 $ al mes con 5 $ de uso incluidos. Mi uso fue de 3,65 $ en un mes.

gratis, más pasos0 $Capas gratuitas

Es el montaje que usa el autor: Postgres en Neon, Redis en Redis Cloud y el worker en una máquina "Always Free" de Oracle. Todo gratis, pero son tres cuentas más. Esta ruta no la he probado yo.

Lo que necesitas

Los pasos

Te pongo la ruta de Railway, que es la de la guía oficial. Si vas a tu servidor o a las capas gratuitas, cambian el paso 2 y las direcciones del paso 4; el resto es igual.

  1. Haz un fork del repo.

    Entra en github.com/diwenne/openreply y pulsa Fork. Trabajas sobre tu copia.

  2. Base de datos, cola y worker en Railway.

    Crea un proyecto y añade, con New: Database, PostgreSQL; Database, Redis; y GitHub Repo, tu fork. En el servicio de tu fork, en Settings, pon:

    Build Command:

    npm run db:generate

    Start Command:

    npm run worker

    En sus Variables pon las del paso 4. Aquí, para la base y la cola, usa las direcciones internas (postgres.railway.internal y redis.railway.internal).

  3. Crea las tablas.

    Una vez, desde tu ordenador y dentro de tu fork, con la dirección pública de Postgres (DATABASE_PUBLIC_URL en Railway):

    npm install
    DATABASE_URL="pega-aquí-la-DATABASE_PUBLIC_URL" npm run db:migrate
  4. La web en Vercel, con sus variables.

    En Vercel, Add New Project, importa tu fork. Antes de desplegar, en Settings, Environment Variables, añade estas. Las tres claves secretas se generan en la terminal:

    Para NEXTAUTH_SECRET y para CRON_SECRET (una vez cada una):

    openssl rand -base64 32

    Para ENCRYPTION_KEY:

    openssl rand -hex 32
    VariableQué poner
    NEXTAUTH_URLTu dirección de Vercel, por ejemplo https://tu-app.vercel.app
    NEXTAUTH_SECRET, CRON_SECRETLas dos primeras claves
    ENCRYPTION_KEYLa tercera. La misma en Vercel y en el worker, o ningún DM se podrá enviar
    DATABASE_URL, REDIS_URLLas direcciones públicas de Railway (DATABASE_PUBLIC_URL y REDIS_PUBLIC_URL). Copia el valor que se ve con el ojo, no el que lleva ${{...}}
    RESEND_API_KEY, EMAIL_FROMTu clave de Resend y un remitente de tu dominio verificado
    ALLOWED_EMAILSTu email. Si no lo pones, cualquiera que llegue a tu dirección puede crearse una cuenta
    META_GRAPH_API_VERSIONv25.0
    INSTAGRAM_APP_ID, INSTAGRAM_APP_SECRET, FACEBOOK_APP_SECRETSalen de tu app de Meta (paso 6). Puedes desplegar ya y añadirlas luego
    WEBHOOK_VERIFY_TOKENUna palabra cualquiera inventada. La pegarás también en Meta

    El worker necesita las mismas, salvo que su DATABASE_URL y su REDIS_URL son las internas (paso 2). Despliega y comprueba que https://tu-app.vercel.app/api/health dice "status":"ok".

  5. Crea la app de Meta.

    En developers.facebook.com/apps, crea una app de tipo Business. Cuando te pida el caso de uso, filtra por All y elige Manage messaging and content on Instagram. No elijas el de anuncios ni "Authenticate with Facebook Login": OpenReply entra con Instagram, y con el de Facebook la conexión falla más tarde.

  6. Copia los tres secretos.
    VariableDónde está en Meta
    INSTAGRAM_APP_IDInstagram, API setup with Instagram login. No es el App ID de la página de ajustes básicos
    INSTAGRAM_APP_SECRETLa misma página, Show
    FACEBOOK_APP_SECRETApp settings, Basic, App secret, Show

    Añádelos en Vercel y vuelve a desplegar.

  7. Hazte tester, por los dos lados.

    En la app de Meta: App roles, Roles, Instagram testers, añade tu usuario de Instagram exacto. Y luego en Instagram, con esa cuenta: abre Configuración, escribe "aplicaciones" en el buscador de arriba, entra en Aplicaciones y sitios web y acepta la invitación de tu app (en la app la llaman invitación de evaluador; en inglés, "Tester invites"). Sin esta segunda mitad, la conexión falla.

  8. Las dos direcciones de Meta.

    En el producto Instagram, en Business login settings, añade como OAuth redirect URI:

    https://tu-app.vercel.app/api/instagram/callback

    Y en Configure webhooks, como Callback URL, y con tu WEBHOOK_VERIFY_TOKEN como Verify token:

    https://tu-app.vercel.app/api/webhook

    Pulsa Verify and save y suscríbete a comments y a messages. Sin messages, lo de contestar DMs e historias no funciona.

  9. Publica la app.

    Mientras la app esté en desarrollo, Instagram no manda los comentarios de verdad. En Publish, rellena las tres páginas, que OpenReply ya trae hechas:

    https://tu-app.vercel.app/privacy
    https://tu-app.vercel.app/terms
    https://tu-app.vercel.app/data-deletion

    Y publica.

  10. Conecta Instagram y prueba.

    Entra en tu OpenReply con tu email, en Settings pulsa Connect Instagram, y crea una campaña en un post tuyo con la palabra TEST. Comenta TEST desde otra cuenta: tus propios comentarios los ignora a propósito. Si llega el DM, ya está.

Si prefieres que te lo monte una IA

Abre tu fork en Claude Code o Codex (o pégalo en ChatGPT y ve haciendo lo que te diga) y dale esto. Sirve para las tres rutas.

Quiero montar OpenReply (comment-to-DM de Instagram) para MI cuenta, con mi propia app de Meta, no con Zernio. Lee README.md y docs/setup.md antes de tocar nada.

Dónde va el worker (elige conmigo antes de empezar):
- A) Mi servidor, que ya tengo encendido. Ahí van Postgres, Redis y el worker.
- B) Railway, como la guía oficial.
- C) Capas gratuitas: Neon (Postgres), Redis Cloud (Redis con TCP, no uno solo HTTP) y una máquina siempre encendida para el worker.
La web va en Vercel.

Reglas:
- No me pidas que pegue claves aquí. Dime dónde ponerlas (Vercel, Railway o el .env del servidor) y que las pegue yo.
- ENCRYPTION_KEY idéntica en la web y en el worker.
- La web usa direcciones de base de datos y Redis que se alcancen desde fuera; el worker, las internas si existen.
- Si la web está en Vercel y la base de datos en Europa, pon "regions": ["fra1"] en vercel.json para que no vaya lenta.
- Si el worker está en Railway y luego lo mueves a otro sitio, borra el servicio de Railway: si no, se vuelve a desplegar con cada push y los DMs salen dobles.
- Para la app de Meta, sigue docs/setup.md paso a paso y avísame de las dos mitades del tester (Meta e Instagram) y de publicar la app.
- No inventes pantallas: si lo que veo no coincide, pregúntame.

Acaba cuando /api/health diga "status":"ok" con el worker sano y un comentario de prueba desde otra cuenta llegue como DM.

Si alguna clave acaba pegada en un chat, cámbiala después. Lo dice la propia guía de OpenReply, y vale para cualquier IA.

Los errores que me encontré

Insufficient developer role

Al conectar Instagram. Te falta aceptar la invitación de tester dentro de Instagram (paso 7). Añadirte en Meta no basta.

The callback URL or verify token couldn't be validated

Al guardar el webhook. Comprueba que la web está desplegada, que la dirección acaba en /api/webhook y que el token es exactamente el de WEBHOOK_VERIFY_TOKEN. Si el botón no se activa, vuelve a pegar el token.

Error: P1013: The provided database string is invalid

Al desplegar en Vercel. La DATABASE_URL no es una dirección completa: tiene que empezar por postgresql:// y ser la pública.

getaddrinfo ENOTFOUND $

La web se queda colgada y no entra nadie. En Vercel pegaste la plantilla de Railway (${{...}}) en vez del valor real. Vercel no la entiende: copia el valor con el ojo.

Todo bien, y no llega ningún DM

La app de Meta sigue en desarrollo. Publícala (paso 9). Y prueba siempre desde otra cuenta.

El mismo DM llega dos veces

Hay dos workers a la vez. A mí me pasó al mover el worker de Railway a mi servidor: Railway seguía conectado al repo y lo volvió a encender con un cambio. Deja uno solo, y borra el otro servicio, no solo su despliegue.

El panel tarda en cargar

La web de Vercel está lejos de la base de datos. Vercel la pone en Washington por defecto; con mi base en Alemania, ponerla en Frankfurt ("regions": ["fra1"] en vercel.json) la hizo unas tres veces más rápida.

Lo que conviene saber

Un DM por comentarioInstagram solo deja una respuesta privada por comentario. Si alguien ya la recibió, otro intento falla, y en el registro verás "the comment is invalid for a private reply". Es normal.
Para tus cuentasSin pasar la revisión de Meta, solo puedes conectar cuentas que tengan un rol en tu app. Para la tuya, o unas pocas que añadas como tester, no necesitas revisión.
Las normas siguenVa por la API oficial, sin scraping ni contraseñas. Aun así, los límites y normas de Instagram se aplican igual que con ManyChat.