Nota de publicación: Esta guía fue documentada en abril de 2026 como resultado de la implementación y corrección de la integración Google Calendar en vtiger CRM 7.2.0. Si estás leyendo este artículo en una fecha posterior, te recomendamos verificar que la API de Google Calendar y la versión de vtiger que usas sean compatibles con los procedimientos aquí descritos, ya que las APIs de Google evolucionan con frecuencia.
Introducción
vtiger CRM 7.2.0 incluye de serie un módulo llamado Google que permite sincronizar el Calendario de vtiger con Google Calendar. En teoría funciona “out of the box”, pero en la práctica tiene varios problemas que impiden que funcione correctamente en instalaciones reales:
- La API de Google Contacts v2 fue descontinuada en junio de 2022 y su uso causa errores HTTP 500 fatales.
- El sync inicial arranca desde 10 años atrás, lo que genera cientos de eventos históricos innecesarios.
- El botón de sincronización recarga toda la página en lugar de mostrar solo una notificación.
- El
syncTokenpuede quedar fijado en el pasado reciente, dejando el sync sin eventos. - Bugs en
getSyncUsers()que leen la columna incorrecta de la base de datos.
En esta guía documentamos todos los pasos necesarios para tener la integración funcionando de forma bidireccional en vtiger CRM 7.2.0, con Google Calendar API v3 y OAuth2.
Requisitos previos
- vtiger CRM 7.2.0 instalado en servidor Linux con PHP 7.x
- Cuenta de Google con acceso a Google Cloud Console
- Acceso SSH y phpMyAdmin (o acceso directo a MySQL) en el servidor
- El módulo Google activo en vtiger
Paso 1 — Configurar Google Cloud Console
1.1 Activar la Google Calendar API
- Ve a Google Cloud Console → APIs y servicios → Biblioteca
- Busca Google Calendar API y actívala
- No actives Google People API ni Google Contacts API — la API de Contacts v2 está descontinuada y causará errores fatales en vtiger
1.2 Crear credenciales OAuth2
- Ve a APIs y servicios → Credenciales → Crear credenciales → ID de cliente OAuth 2.0
- Tipo de aplicación: Aplicación web
- En URIs de redireccionamiento autorizados agrega la URL de tu instalación vtiger:
https://tudominio.com/index.php?module=Google&view=Authenticate&service=Google - Descarga o copia el Client ID y Client Secret
1.3 Configurar la pantalla de consentimiento OAuth
Este paso es crítico y frecuentemente se omite:
- Ve a APIs y servicios → Pantalla de consentimiento OAuth
- Estado de publicación: déjalo en “En pruebas” (Testing) si no necesitas que otros usuarios autoricen la app
- En Usuarios de prueba, agrega el correo de la cuenta Google que usará vtiger para sincronizar
⚠️ Sin este paso, el flujo OAuth devolverá error 403 access_denied al intentar autorizar.
Paso 2 — Configurar las credenciales en vtiger
Edita el archivo modules/Google/connectors/Config.php:
<?php
Class Google_Config_Connector {
static $clientId = 'TU_CLIENT_ID.apps.googleusercontent.com';
static $clientSecret = 'TU_CLIENT_SECRET';
}
Paso 3 — Correcciones de código necesarias
El módulo Google de vtiger 7.2.0 tiene varios bugs que deben corregirse manualmente.
3.1 Deshabilitar Google Contacts (API descontinuada)
Archivo: modules/Google/views/Sync.php
Busca la línea donde se define el array de módulos a sincronizar y elimina 'Contacts':
// ANTES (causa HTTP 500 — API descontinuada en 2022)
$modules = array('Contacts', 'Calendar');
// DESPUÉS
$modules = array('Calendar');
En el mismo archivo, asegúrate de capturar cualquier excepción PHP 7 correctamente:
try {
$records = $this->invokeExposedMethod($sourceModule);
return $records;
} catch (Zend_Gdata_App_HttpException $e) {
error_log('[GCAL] Zend exception: ' . $e->getMessage());
return array();
} catch (Throwable $e) {
error_log('[GCAL] Error en sync: ' . get_class($e) . ' - ' . $e->getMessage());
return array();
}
3.2 Fix en getSyncUsers() — columna incorrecta
Archivo: modules/Google/helpers/Utils.php
La función getSyncUsers() intentaba leer la columna id cuando el campo correcto es userid:
// ANTES
$userId = $resultrow['id'];
// DESPUÉS
$userId = $resultrow['userid'];
3.3 Cambiar el punto de inicio del sync a -30 días
Archivo: modules/Google/connectors/Vtiger.php
Por defecto, el sync inicial de WSAPP comienza desde 10 años atrás. Con cientos de eventos históricos, el proceso nunca llega a los eventos recientes. El fix es sobrescribir intialSync():
public function intialSync() {
$registrationDetails = $this->registerWithTracker();
$syncStateModel = new WSAPP_SyncStateModel();
$syncStateModel->setSyncTrackerId($registrationDetails['key'])
->setSyncToken(strtotime('-30 days'))
->setType($this->getSynchronizeController()->getSourceType());
return $syncStateModel;
}
3.4 Filtro de fechas en el connector de Calendar
Archivo: modules/Google/connectors/Calendar.php — función transformToTargetRecord()
Agrega un filtro para ignorar eventos con más de 30 días de antigüedad:
$cutoffTimestamp = strtotime('-30 days');
foreach ($vtEvents as $vtEvent) {
if ($vtEvent->getMode() != WSAPP_SyncRecordModel::WSAPP_DELETE_MODE) {
$startDate = $vtEvent->get('date_start');
$dueDate = $vtEvent->get('due_date');
$eventDate = !empty($dueDate) ? $dueDate : $startDate;
if (!empty($eventDate) && strtotime($eventDate) < $cutoffTimestamp) {
continue; // Ignorar eventos históricos
}
}
// ... resto del procesamiento
}
Paso 4 — Autorizar OAuth2 en vtiger
- Inicia sesión en vtiger con el usuario que usará la sincronización
- Ve a Configuración → Extensiones → Google
- Haz clic en Autenticar con Google — se abrirá un popup OAuth
- Autoriza con la cuenta Google que agregaste como usuario de prueba en Cloud Console
- En la tabla de módulos, fila Calendario:
- Google Datos: selecciona el calendario de Google destino
- Habilitar sincronización: actívalo
- Dirección: “Sincroniza en ambas direcciones”
- Guarda la configuración
Paso 5 — Tablas de base de datos relevantes
Estas son las tablas que gestiona la integración, útiles para diagnóstico:
| Tabla | Contenido |
|---|---|
vtiger_google_oauth2 | Tokens OAuth2 por usuario (access_token, refresh_token) |
vtiger_google_sync_settings | Configuración por usuario: calendario destino, dirección, habilitado |
vtiger_google_sync | Último tiempo de sync por módulo y usuario |
vtiger_google_event_calendar_mapping | Mapa entre IDs de eventos Google y el calendario donde se insertaron |
vtiger_wsapp_sync_state | Estado del tracker WSAPP: almacena el syncToken (timestamp del último sync) |
Paso 6 — Reset del sync (cuando no sincroniza nada)
Si el botón de sincronización no envía eventos a Google, el problema más común es que el syncToken en vtiger_wsapp_sync_state tiene una fecha muy reciente. Al arrancar, WSAPP busca eventos modificados después de ese timestamp y no encuentra nada nuevo.
Para diagnosticarlo, ejecuta en phpMyAdmin:
SELECT
JSON_EXTRACT(stateencodedvalues, '$.synctoken') AS synctoken,
FROM_UNIXTIME(JSON_EXTRACT(stateencodedvalues, '$.synctoken')) AS fecha_sync
FROM vtiger_wsapp_sync_state
WHERE name = 'Vtiger_GoogleCalendar';
Si la fecha_sync corresponde a hoy o a un momento muy reciente y no hay eventos nuevos desde entonces, ejecuta el reset:
DELETE FROM vtiger_wsapp_sync_state WHERE name = 'Vtiger_GoogleCalendar';
DELETE FROM vtiger_google_event_calendar_mapping;
DELETE FROM vtiger_google_sync WHERE googlemodule = 'Calendar';
Después del reset, al presionar Sincronizar con Google, el sistema ejecutará intialSync() fijando el punto de partida en -30 días y procesará todos los eventos del último mes.
Diagnóstico por logs del servidor
En servidores con Plesk, los logs de PHP van al error log de Apache vía proxy_fcgi. Para filtrar solo los mensajes del módulo Google:
grep "DVA_GCAL\|DVA_WSAPP\|DVA_SYNC" /var/www/vhosts/tudominio.com/logs/tucrm/error_log | tail -50
Los mensajes de debug más útiles son:
[DVA_WSAPP_PULL] sourceRecords from vtiger: 0→ el sync token está fijado en un momento muy reciente, hacer reset[DVA_GCAL_PUSH] inserted OK, google_id: ...→ evento insertado correctamente en Google Calendar[DVA_GCAL_PUSH] EXCEPTION→ error al insertar, revisar permisos OAuth o calendarId
Conclusión
La integración de vtiger CRM 7.2.0 con Google Calendar es funcional una vez aplicadas las correcciones descritas. Los puntos clave a recordar son:
- ⛔ Deshabilitar Google Contacts — la API v2 está descontinuada desde 2022
- 🔄 Limitar el sync inicial a -30 días para evitar procesar historia innecesaria
- 🔑 La pantalla de consentimiento OAuth debe tener el correo del usuario como “usuario de prueba”
- 🗄️ Si el sync deja de funcionar, el primer diagnóstico es revisar el
syncTokenenvtiger_wsapp_sync_state
Esta configuración fue implementada y documentada en abril de 2026 sobre vtiger CRM 7.2.0. Si tienes dudas o encuentras cambios en versiones posteriores, puedes contactarnos en dvaweb.mx.