🔌 documentación

Integraciones — Gmail y Google Drive en tus apps

Una app puede enviar correos desde tu Gmail y guardar archivos en tu Google Drive sin que tú manejes contraseñas, SMTP ni claves de Google. Conectas la cuenta una vez y la app usa la API de CloudWapp.

Qué permisos pide

Solo dos, los mínimos:

Conectar Google a una app

  1. Entra a la app → pestaña Servicios → Integraciones · Google.
  2. Pulsa Conectar con Google y acepta los permisos.
  3. Haz Deploy. La app recibe dos variables de entorno: CLOUDWAPP_API_URL y CLOUDWAPP_APP_TOKEN (y GOOGLE_ACCOUNT_EMAIL con la cuenta conectada).

Con Enviar prueba te llega un correo a tu propia cuenta para confirmar que funciona. Desconectar revoca el acceso en el acto, aunque no vuelvas a deployar.

Si creas la app con IA, no tienes que programar nada: CloudWapp Code ya conoce esta API. Pídele en el Estudio, por ejemplo, «envía un correo de confirmación cuando alguien reserve».

Enviar un correo

Las llamadas se hacen desde el servidor de tu app, nunca desde el navegador: el token da acceso a tu cuenta.

await fetch(`${process.env.CLOUDWAPP_API_URL}/integrations/google/gmail/send`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.CLOUDWAPP_APP_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    to: '[email protected]',          // un email, varios con coma, o un array
    subject: 'Tu reserva está confirmada',
    html: '<p>¡Gracias por reservar!</p>',
    // opcionales: text, cc, bcc, replyTo, fromName,
    // attachments: [{ filename, contentType, contentBase64 }]
  }),
});

Gmail acepta correos de hasta 25 MB contando los adjuntos.

Guardar un archivo en Drive

const res = await fetch(`${process.env.CLOUDWAPP_API_URL}/integrations/google/drive/upload`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.CLOUDWAPP_APP_TOKEN}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    name: 'factura-123.pdf',
    mimeType: 'application/pdf',
    contentBase64: buffer.toString('base64'),
    makePublic: false,   // true → "cualquiera con el link" y devuelve publicUrl
  }),
});
const file = await res.json(); // { id, name, webViewLink, publicUrl? }

También acepta multipart/form-data con el archivo en el campo file (y name, folderId, makePublic como campos). Por multipart entran archivos de hasta 50 MB; en JSON con base64, hasta unos 35 MB.

publicUrl sirve para compartir un archivo. Para las imágenes que tu web muestra a cada visita, usa mejor un bucket MinIO de la app: Drive limita el tráfico de los links públicos.

Usar otra librería de Google

Si prefieres la librería oficial de Google, pide un access token de corta vida con los mismos permisos:

const { access_token, expires_in } = await fetch(
  `${process.env.CLOUDWAPP_API_URL}/integrations/google/token`,
  { method: 'POST', headers: { Authorization: `Bearer ${process.env.CLOUDWAPP_APP_TOKEN}` } },
).then((r) => r.json());

Si algo falla