🔌 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:
- Gmail: enviar correo. La app no puede leer tu bandeja.
- Drive: archivos que crea la app. La app no ve el resto de tu Drive.
Conectar Google a una app
- Entra a la app → pestaña Servicios → Integraciones · Google.
- Pulsa Conectar con Google y acepta los permisos.
- Haz Deploy. La app recibe dos variables de entorno:
CLOUDWAPP_API_URLyCLOUDWAPP_APP_TOKEN(yGOOGLE_ACCOUNT_EMAILcon 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.
publicUrlsirve 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
- «Esta app no tiene Google conectado»: conecta la cuenta y vuelve a deployar.
- «Google ya no acepta el acceso»: revocaste el permiso desde tu cuenta de Google, o venció. Vuelve a conectar desde el panel.
- El token no está definido corriendo en tu computador: es normal. Las variables solo existen dentro del servidor; haz que tu app siga funcionando sin ellas.