Guía formativa · Modo offline
Trabajar sin cobertura en el campo: cómo funciona el modo offline y la cola de envíos
Guía técnico-práctica sobre el funcionamiento offline de Campodato: outbox durable, deduplicación por clientOpId, tarjeta de envíos del dispositivo y sincronización automática.
ACTUALIZADO · 13 JUN 2026 · LECTURA: 6 MIN
- Por qué el campo no tiene cobertura (y qué cambia eso en una app)
- El patrón "encolar primero": cómo funciona el outbox
- La deduplicación por clientOpId: sin duplicados, aunque reenvíes
- Módulos 2 y 9: qué puedes encolar offline y qué no
- La tarjeta "Envíos de este dispositivo" y el SyncStatusPill
- Qué pasa con las fotos y el OCR sin cobertura
- Qué pasa con los plazos normativos en solo-lectura offline
- La sincronización al recuperar red: qué ocurre exactamente
- Preguntas frecuentes
- Conclusion
Si llevas el móvil a la parcela, sabes que la cobertura no es garantizada. Manchas de vid en ladera, invernaderos metálicos, naves de almacén, parcelas de montaña: hay decenas de situaciones en las que el pitido de "sin señal" aparece exactamente cuando quieres anotar una aplicación fitosanitaria o un riego. Campodato está diseñado para que eso no suponga ningún problema: puedes registrar tus operaciones con total normalidad aunque el móvil muestre "sin conexión", y los datos llegarán al servidor en cuanto recuperes red, sin que tengas que hacer nada.
Esta guía explica cómo funciona ese mecanismo en detalle, qué garantías ofrece y cuáles son sus límites reales.
Por qué el campo no tiene cobertura (y qué cambia eso en una app)
La cobertura móvil en entornos agrarios es irregular por razones físicas: la propagación de la señal depende de la orografía, la distancia a la antena y los obstáculos. Las zonas de regadío en el interior peninsular, los viñedos en ladera o los cortijos alejados de núcleos urbanos son ejemplos habituales de cobertura nula o intermitente.
Una app que exige conexión para guardar un registro te obliga a uno de estos dos problemas: o tecleas en un bloc de papel y lo pasas después a mano (perdiendo tiempo y arriesgando errores), o esperas a tener cobertura y en ese momento ya no recuerdas todos los detalles. Ninguna de las dos opciones es aceptable para un cuaderno de explotación que sirva como soporte legal ante una inspección fitosanitaria o una auditoría PAC.
La solución técnica adecuada se llama offline-first: la app guarda el dato en el propio dispositivo antes de intentar enviarlo al servidor. La red es conveniente, pero nunca obligatoria para registrar.
El patrón "encolar primero": cómo funciona el outbox
Campodato aplica el patrón outbox (bandeja de salida) en ambas plataformas: la app móvil y el panel web. Cuando pulsas "Guardar en cuaderno", la operación no se envía directamente al servidor, sino que se persiste primero en el propio dispositivo:
- En la app móvil (React Native / Expo), el dato se guarda en AsyncStorage bajo la clave
campodato:outbox:entries:v1. AsyncStorage es una capa de almacenamiento que sobrevive a cierres de aplicación y reinicios del teléfono; si el sistema operativo mata el proceso, el borrador no se pierde. - En el panel web (Next.js), el dato se guarda en IndexedDB (base de datos interna del navegador), que también persiste entre recargas de página y cierres del navegador.
El flujo exacto, paso a paso:
- Rellenas el formulario de operación (tipo, recinto SIGPAC, fecha del trabajo, datos del tratamiento o labor).
- Pulsas "Guardar en cuaderno".
- La app persiste la operación en el dispositivo antes de resolver la acción. Si el teléfono se apaga exactamente en ese instante, la operación ya está guardada.
- La pantalla vuelve al inicio. La tarjeta de estado muestra el contador de pendientes actualizado.
- Cuando hay red, la cola drena automáticamente: el dato llega al servidor sin que tengas que hacer nada manualmente.
La pantalla de captura lo indica de forma visible: "Se guarda en el dispositivo y se sincroniza cuando haya conexión. No necesitas red ahora."
La deduplicación por clientOpId: sin duplicados, aunque reenvíes
Cada operación que el dispositivo genera lleva un identificador único llamado clientOpId (identificador de operación del cliente). Este código, generado en el móvil en el momento de crear la operación, cumple dos funciones simultáneas:
- Deduplicación local: si por algún motivo la app intenta encolar dos veces la misma operación (por ejemplo, tras un reinicio abrupto), el motor detecta que ya existe una entrada con ese
clientOpIdy no crea un duplicado. - Deduplicación en el servidor: cuando la operación llega al servidor, este comprueba si ya procesó ese
clientOpId. Si ya lo hizo, devuelve el resultado original sin volver a aplicar el efecto. En la app, esa entrada queda marcada como "ya registrada" (badge informativo color teal). El dato legal del servidor no se altera.
Esto significa que reintentar siempre es seguro. Aunque la red se corte a mitad del envío y la app vuelva a intentarlo, el registro de cuaderno no se duplicará.
El estado de cada entrada sigue una transición monótona:
| Estado | Significado |
|---|---|
En cola (amber) | Guardada en el dispositivo, pendiente de enviar |
Sincronizando (teal) | En tránsito hacia el servidor |
Sincronizado (verde) | Confirmada por el servidor |
Conflicto (rojo) | El servidor devolvió un error; se reintentará con espera exponencial |
Si hay un error de servidor (respuesta 4xx o 5xx), el motor aplica un backoff exponencial: espera 2 segundos antes del primer reintento, 4 segundos antes del segundo, 8 antes del tercero, con un tope de 5 minutos. Esto evita saturar el servidor y permite que errores transitorios se resuelvan solos.
Módulos 2 y 9: qué puedes encolar offline y qué no
El modo offline de Campodato cubre los flujos de captura de campo implementados en las Olas 2 y 9 del producto. A continuación se detalla qué funciona sin red y qué requiere conexión.
Lo que puedes hacer sin cobertura
- Registrar cualquier operación del cuaderno: labores agrícolas, aplicaciones fitosanitarias, riegos, fertilizaciones. El formulario funciona completamente offline y la operación queda encolada.
- Registrar riegos y fertilizaciones desde sus pantallas dedicadas.
- Fichar la jornada (Ola 9): el fichaje de entrada y salida se encola en el outbox móvil y llega al servidor al recuperar cobertura.
- Rellenar el borrador de una operación: el formulario guarda automáticamente (autosave) cada cambio relevante. Si cierras la app antes de guardar, al reabrirla recuperas el borrador.
Lo que requiere conexión
- Consultar el histórico legal del cuaderno: el registro oficial de operaciones reside en el servidor (tabla de cuaderno SIEX). Sin red puedes ver las operaciones que tienes en cola local, pero no las ya sincronizadas en campañas anteriores.
- El asistente de voz o texto: la transcripción de dictados y la generación de borradores por lenguaje natural requieren llamadas al servidor de procesamiento.
- La lectura OCR de albaranes y etiquetas: la foto se captura en el dispositivo sin red (el módulo
FotoDocumentoreduce y procesa la imagen localmente), pero la extracción de datos del documento se realiza en el servidor (POST a/ocr/documentos). Sin conexión, la foto se guarda hasta que puedas subirla. - El módulo de plazos y vencimientos: este módulo es solo lectura y funciona con caché local, pero no puede editarse offline. La app guarda la última respuesta buena del servidor (en AsyncStorage) y la muestra con el aviso "Sin conexión: mostrando los datos guardados (fecha)". Si nunca has cargado los plazos con cobertura, verás el mensaje "Sin conexión y sin datos guardados todavía. Reintenta cuando tengas cobertura."
- El mapa de recintos SIGPAC: requiere tiles del servidor de mapas. Las coordenadas de un recinto seleccionado previamente se traspasan al formulario de captura aunque pierdas cobertura después.
La tarjeta "Envíos de este dispositivo" y el SyncStatusPill
En la app móvil
La pantalla principal muestra una tarjeta de estado con:
- Una píldora de sincronización (SyncBadge) que indica el estado global: "En cola" (amber) o "Sincronizado" (verde).
- Un contador numérico de operaciones pendientes.
- El botón "Sincronizar" para forzar un ciclo de envío manualmente.
- Un mensaje de resultado tras sincronizar: cuántas operaciones se enviaron, si alguna ya estaba registrada (deduplicada) o si no había cobertura.
Debajo de la tarjeta aparece la lista de todas las operaciones encoladas, cada una con su tipo (Labor, Riego, Aplicación fitosanitaria…), fecha de trabajo, recinto SIGPAC y su propia píldora de estado individual.
El motor de cola también funciona de forma automática: cuando el sistema operativo notifica la recuperación de la señal (mediante el módulo NetInfo de React Native), la app drena la cola sin que tengas que pulsar nada. El flanco de detección es preciso: solo dispara el envío cuando se pasa de "sin red" a "con red", nunca al contrario, y evita lanzar dos ciclos de envío simultáneos.
En el panel web
El panel web incluye el SyncStatusPill en la barra superior (topbar), visible en todas las páginas. Este indicador muestra el estado en tiempo real:
- Nube tachada gris: "Sin conexión" o "Sin conexión · N en cola".
- Nube con flecha ámbar: "N pendientes" (hay operaciones esperando envío).
- Spinner teal: "Sincronizando…" (el ciclo de envío está en marcha).
- Check verde: "Sincronizado" (todo enviado correctamente).
- Triángulo rojo: "N con error" (alguna operación no pudo enviarse; se reintentará).
Al pulsar sobre la píldora, se abre un pequeño panel con el detalle de la cola: cuántas están en cola, cuántas en tránsito y cuántas con error. Desde ahí puedes navegar a la página completa de la cola (/offline) o forzar un ciclo de envío pulsando "Sincronizar ahora".
La página /offline es el centro de sincronización del dispositivo: muestra todas las entradas del outbox local con su estado, los conflictos resueltos a favor del servidor y permite purgar las entradas ya enviadas para limpiar el almacenamiento local. También incluye una pestaña "Histórico" con las operaciones ya confirmadas por el servidor (cuando hay conexión).
El indicador web combina la conectividad del navegador (navigator.onLine) con el estado de salud del servidor Campodato: si el servidor no responde aunque el navegador tenga red, el indicador pasa a "Sin conexión" en lugar de mostrar un verde engañoso.
Qué pasa con las fotos y el OCR sin cobertura
El módulo de captura de documentos (albaranes, etiquetas, facturas de proveedor) tiene un comportamiento específico en ausencia de red:
- La foto se captura y reduce en el dispositivo: el componente
FotoDocumentorecorta el lado mayor a 1.600 píxeles y comprime en JPEG calidad 0,8 antes de intentar subirla. Esto ocurre completamente offline. - La subida y el OCR requieren conexión: la extracción de datos del documento (importes, productos, cantidades, fechas) se realiza en el servidor. Sin red, la pantalla conserva la foto en memoria para que puedas reintentar cuando tengas cobertura.
- La confirmación del borrador generado también es idempotente: el endpoint de confirmación de la cascada OCR acepta un
clientOpId, por lo que confirmarlo dos veces no crea un registro duplicado.
Nota: el OCR no forma parte del outbox durable; la foto no se persiste en AsyncStorage/IndexedDB entre cierres de la app. Si cierras la app antes de confirmar el borrador, necesitas volver a hacer la foto. Esta es una limitación conocida del flujo actual.
Qué pasa con los plazos normativos en solo-lectura offline
La pantalla de Plazos y vencimientos muestra el calendario de obligaciones de la explotación (notificaciones a la CCAA, controles fitosanitarios, compromisos PAC, etc.) con semáforos accesibles (icono + texto + color). El diseño es exclusivamente de consulta; no se puede crear ni modificar una obligación desde el móvil.
Su comportamiento offline:
- Si tienes cobertura, la app carga el calendario desde el servidor y guarda una copia local.
- Si pierdes cobertura, la app sirve automáticamente la copia guardada con el aviso de fecha: "Sin conexión: mostrando los datos guardados (AAAA-MM-DD)."
- Si nunca has cargado los plazos con cobertura en este dispositivo, la pantalla muestra: "Sin conexión y sin datos guardados todavía. Reintenta cuando tengas cobertura."
- Al recuperar conexión, al pulsar "Actualizar" se refresca la copia local con los datos del servidor.
Los plazos mostrados en la copia local pueden estar desactualizados si han pasado varios días sin conexión. Si un vencimiento es próximo o crítico, comprueba la fecha del caché antes de actuar.
La sincronización al recuperar red: qué ocurre exactamente
Cuando el dispositivo pasa de sin cobertura a con cobertura, el proceso de sincronización es el siguiente:
- El sistema operativo emite la señal de "conectado" (flanco offline→online).
- La app la detecta (NetInfo en móvil; evento
onlinedel navegador en web) e inicia automáticamente un ciclo de flush. - El motor de la cola lee todas las entradas pendientes, ordenadas por secuencia de encolado (orden FIFO).
- Para cada operación, la marca como "enviando" de forma durable (así, si la app se cierra a mitad, al reabrir se ve que estaba en tránsito y se reintenta).
- Llama al servidor enviando la operación con su
clientOpId. - Si el servidor confirma la operación, la entrada pasa a "Sincronizado". Si devuelve que ya la procesó (deduplicada), también se marca como "Sincronizado" con el badge "ya registrada".
- Si hay un error de servidor, la entrada pasa a "Conflicto" con el mensaje de error y se programa un reintento con espera exponencial.
- Si no hay red (la señal se perdió de nuevo antes de terminar), las entradas vuelven a "En cola" sin backoff y esperan el próximo flanco de reconexión.
El orden FIFO por entidad es importante para los registros legales: si encolaste dos operaciones sobre el mismo recinto, se envían en el mismo orden en que las registraste. Una operación posterior del mismo recinto no se adelanta a la anterior aunque la anterior esté en espera de reintento.
Preguntas frecuentes
¿Puedo registrar una aplicación fitosanitaria sin cobertura? Sí. El formulario completo de captura funciona offline. La operación queda guardada en el dispositivo con todos sus campos (producto, dosis, recinto, fecha del trabajo) y llega al servidor al recuperar red. La fecha de anotación se registra automáticamente en el momento en que pulsas "Guardar", no en el momento en que se sincroniza.
¿Cuántas operaciones puedo tener en cola sin enviar? No hay un límite fijo en el número de entradas. El límite práctico es la capacidad de almacenamiento de AsyncStorage (móvil) o IndexedDB (web), que en dispositivos modernos es de varios cientos de megabytes. Para uso normal de campo (docenas de operaciones por jornada), no alcanzarás ese límite.
¿Qué pasa si cambio de teléfono o reinstalo la app? La cola offline vive en el almacenamiento local del dispositivo. Si desinstalas la app, pierdes las operaciones que todavía no se habían enviado. Si cambias de dispositivo, las operaciones ya sincronizadas están en el servidor; las que estaban en cola en el dispositivo anterior deberás volver a introducirlas. Por eso, cuando tengas cobertura, conviene sincronizar antes de cambiar de dispositivo.
¿El número de pendientes en el topbar web incluye solo los de mi navegador? Sí. El SyncStatusPill muestra el estado de la cola del dispositivo actual (guardada en el IndexedDB de ese navegador). Si trabajas en dos ordenadores distintos, cada uno tiene su propia cola local. La pestaña "Histórico" de la página /offline sí muestra la actividad de todos los dispositivos según lo que el servidor ha confirmado.
Conclusion
El modo offline de Campodato no es una caracteristica de emergencia: es el flujo de trabajo predeterminado en campo. Registrar una operacion, una aplicacion fitosanitaria o un fichaje de jornada funciona igual con o sin cobertura, porque la app siempre guarda primero en el dispositivo y sincroniza despues. La deduplicacion por clientOpId garantiza que ningun reintento duplicara un registro legal. La tarjeta de pendientes en la pantalla principal y el SyncStatusPill en el topbar web te informan en todo momento de cuantas operaciones estan esperando llegar al servidor.
Lo que no puedes hacer sin cobertura es consultar el historico legal completo, procesar documentos por OCR o cargar los plazos normativos si nunca los has cargado antes. Estos modulos requieren conexion porque la autoridad del dato legal reside en el servidor, no en el dispositivo.
Conocer estos limites te permite planificar tu jornada: carga los plazos y el historial antes de salir al campo, registra libremente mientras trabajas y deja que la sincronizacion ocurra sola al volver a zona con cobertura.
Guia elaborada por Summum Marketing para Campodato. Ultima actualizacion: junio 2026.
Formación de Campodato. Te llevamos del primer apunte al cumplimiento completo.