Appearance
Meta Instagram — Conexión Manual
Esta página documenta el flujo manual para conectar una cuenta de Instagram Business a DaraMex. Es una alternativa a Facebook Login para Empresas para clientes que no pueden o no quieren usar el OAuth interactivo.
Resumen
El flujo manual permite que el cliente genere un token de larga duración (System User token, "Nunca expira") en su propio Meta Business Manager y lo pegue en el wizard del panel junto con el ID de su Facebook Page. La API valida el token, verifica la vinculación de la cuenta de Instagram Business, y registra la conexión.
Cuándo es útil:
- El cliente opera en un entorno corporativo donde los viajes OAuth interactivos requieren aprobaciones adicionales de TI.
- El Facebook Login para Empresas de DaraMex aún no está aprobado por Meta para el Business Manager del cliente.
- El cliente prefiere gestionar sus propios tokens en lugar de delegar el consentimiento OAuth.
Cuándo usar el flujo manual vs Facebook Login
| Criterio | Facebook Login (OAuth) | Conexión Manual |
|---|---|---|
| Configuración inicial | Baja — el cliente solo hace clic en "Conectar con Facebook" | Alta — requiere crear un System User en Business Manager y generar un token manualmente |
| Gestión del token | DaraMex renueva internamente | El cliente es responsable de regenerar el token si lo revoca |
| Duración del token | Token de Sistema de Usuario (SUAT), no expira | "Nunca expira" — siempre que el cliente no lo revoque manualmente |
| Riesgo de interrupción | Bajo | Alto si el cliente rota sus tokens sin actualizar la conexión |
| Recomendado para | La mayoría de los clientes | Clientes con restricciones corporativas o técnicas |
Prerequisitos
El cliente debe tener activos y configurados los siguientes recursos antes de iniciar el flujo manual:
Meta Business Manager activo — el cliente debe ser administrador de un Business Portfolio en business.facebook.com.
Facebook Page administrada por ese Business Manager — el cliente debe ser administrador de la Page con acceso completo a la misma.
Instagram Business Account vinculada a la Facebook Page (CRÍTICO — es el modo de falla más común). La cuenta de Instagram debe ser de tipo Business o Creator (no Personal). Para vincularla:
- Ir a Meta Business Suite → Configuración → Cuentas → Cuentas de Instagram → Agregar.
- Seguir el proceso para vincular la cuenta IG a la Page específica.
System User creado en el Business Manager — con la Facebook Page asignada como asset con control total ("Administrar la Página"). Para crearlo: Business Manager → Usuarios → Usuarios del sistema → Agregar.
La app de DaraMex asignada al System User — como asset de la app. El equipo de DaraMex debe haber proporcionado el App ID correspondiente.
Token generado con expiración "Nunca expira" — al generar el token del System User, se debe seleccionar explícitamente la opción "Nunca" en el campo de expiración y marcar los scopes requeridos (ver sección siguiente).
Scopes requeridos
El token del System User debe tener todos los siguientes permisos:
| Scope | Para qué se usa |
|---|---|
pages_show_list | Listar las Facebook Pages administradas por el token para verificar que pageId sea accesible. |
pages_messaging | Enviar y recibir mensajes de Messenger Platform en la Page. Requerido aunque se conecte Instagram — la Page es el carrier. |
pages_manage_metadata | Suscribir la Page al webhook de la app (/{pageId}/subscribed_apps) para recibir eventos de Instagram. |
pages_read_engagement | Leer metadatos de la Page (nombre, estado) durante el proceso de conexión. |
instagram_basic | Acceder a datos básicos de la cuenta de Instagram Business vinculada (ID, username). |
instagram_manage_messages | Enviar y recibir mensajes de Direct de Instagram desde DaraMex. |
Endpoint
POST /connections/meta/instagram/manualAutenticación: sesión de panel activa (@Auth()). El usuario debe tener permiso CASL connections.connection:create.
Body:
json
{
"accessToken": "EAABcde...",
"pageId": "123456789",
"displayName": "Mi Tienda IG"
}| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
accessToken | string | Sí | System User token generado en Business Manager con "Nunca expira". |
pageId | string | Sí | ID de la Facebook Page que tiene la cuenta de Instagram Business vinculada. |
displayName | string | No | Nombre visible de la conexión en DaraMex. Si se omite, se usa el username de la cuenta de Instagram. |
Respuesta exitosa (200 OK):
json
{
"connectionId": "01927bef-..."
}Flujo
sequenceDiagram
participant U as Usuario (Panel)
participant P as Panel (UI)
participant A as API
participant M as Meta Graph API
U->>P: Abre el wizard "Conexión manual" desde el catálogo de Instagram
U->>P: Rellena accessToken + pageId + displayName (opcional)
P->>A: POST /connections/meta/instagram/manual { accessToken, pageId, displayName? }
A->>M: debug_token(accessToken)
M-->>A: { expiresAt, dataAccessExpiresAt, scopes }
note over A: Verifica expiresAt === 0 && dataAccessExpiresAt === 0<br/>Verifica 6 scopes requeridos
A->>M: getMyAccountsWithIg(accessToken)
M-->>A: [{ id, name, accessToken, igBusinessAccount? }]
note over A: Busca page.id === pageId<br/>Verifica page.igBusinessAccount existe
note over A: MetaAssetUniquenessPolicy.enforce('instagram', igBusinessAccount.id, agencyId)<br/>— el mismo IG Business Account no puede conectarse en dos orgs<br/>de la misma agency. Distintos IG accounts del mismo<br/>Business Manager SÍ pueden ir a orgs distintas.
note over A: Persiste Connection con:<br/>accessToken = page.accessToken (Page Access Token, NO el SUSER)<br/>tokenType = system_user_manual<br/>channel = instagram
A->>M: subscribePageToApp(pageId, page.accessToken)
M-->>A: OK
note over A: Emite MetaConnectionEstablishedIntegrationEvent<br/>→ CommunicationsModule crea ChannelAccount<br/> externalAccountId = igBusinessAccount.id
A-->>P: { connectionId }
P-->>U: Conexión establecida
Errores y modos de falla
| Código de error | HTTP | Cuándo ocurre |
|---|---|---|
META_CONNECTION.TOKEN_WILL_EXPIRE | 400 | El token tiene fecha de expiración (expiresAt !== 0 o dataAccessExpiresAt !== 0). El cliente debe regenerar el token seleccionando "Nunca" como expiración. |
META_CONNECTION.TOKEN_LACKS_SCOPES | 400 | Al token le faltan uno o más de los 6 scopes requeridos. La respuesta incluye la lista de scopes faltantes en metadata.missing. |
META.PAGE_NOT_ACCESSIBLE | 400 | El pageId proporcionado no aparece en la lista de Pages administradas por el token. Verificar que el System User tenga la Page asignada como asset. |
META.INSTAGRAM_ACCOUNT_NOT_LINKED | 400 | La Facebook Page existe y es accesible, pero no tiene una cuenta de Instagram Business vinculada. Ver la sección de prerequisitos. |
META.ASSET_ALREADY_CONNECTED | 409 | Ya existe una conexión para ese igBusinessAccountId dentro de la misma agency (en cualquiera de sus orgs). Distintas cuentas de IG del mismo Business Manager SÍ pueden conectarse en orgs distintas. |
META_CONNECTION.INVALID_ACCESS_TOKEN | 400 | El token proporcionado es inválido o fue revocado antes de la validación. |
Decisión de diseño: por qué se almacena el Page Access Token y no el SUSER
El token que se persiste en la base de datos es el Page Access Token (page.accessToken del Graph API), no el System User token que el cliente pegó en el formulario.
Razón técnica: los endpoints de la Graph API que DaraMex usa para operar IG Business Messaging requieren un token scoped a la Page:
POST /{igBusinessAccountId}/messages— enviar mensajes de Direct. Requiere el Page token (no el SUSER).POST /{pageId}/subscribed_apps— suscribir la Page al webhook para recibir eventos de Instagram. Requiere el Page token.
El SUSER es un token a nivel de usuario de sistema, útil para llamadas de administración, pero los endpoints de mensajería y webhooks exigen el token de la Page específica. Este mismo razonamiento aplica al flujo OAuth — ver complete-meta-instagram-connect.command.ts para el comentario en el paso 7.
Páginas relacionadas
- Auth Discovery Flow — cómo el panel descubre si usar OAuth o formulario manual.
- Available Connections Catalog — el catálogo de integraciones disponibles.
- Meta Messenger — Conexión Manual — el flujo equivalente para Messenger (sin la cuenta de Instagram vinculada).