> ## Documentation Index
> Fetch the complete documentation index at: https://docs.compago.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Qué hacer si no hay conexión

> Qué significan los avisos de conexión de la terminal y cómo recuperar el internet para volver a cobrar.

export const SupportBox = () => <aside className="cm-support">
		<span className="cm-support-icon">
			<svg className="cm-icon" width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
				<path d="M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20zM12 8a4 4 0 1 0 0 8 4 4 0 0 0 0-8zM4.93 4.93l4.24 4.24M14.83 9.17l4.24-4.24M14.83 14.83l4.24 4.24M9.17 14.83l-4.24 4.24" />
			</svg>
		</span>
		<div className="cm-support-body">
			<p className="cm-support-title">Estamos para ayudarte en lo que necesites.</p>
			<p className="cm-support-text">Escríbenos por WhatsApp o por correo: del otro lado está el equipo de Compago.</p>
			<div className="cm-support-actions">
				<a className="cm-button cm-button-whatsapp" href="https://wa.me/525510033582?text=Hola%2C%20necesito%20ayuda%20con%20Compago." target="_blank" rel="noopener noreferrer">
					<svg className="cm-icon" width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true">
						<path d="M17.47 14.38c-.3-.15-1.76-.87-2.03-.97-.27-.1-.47-.15-.67.15-.2.3-.77.97-.94 1.16-.17.2-.35.22-.64.08-.3-.15-1.26-.47-2.39-1.48-.88-.79-1.48-1.76-1.65-2.06-.17-.3-.02-.46.13-.61.13-.13.3-.35.45-.52.15-.17.2-.3.3-.5.1-.2.05-.37-.03-.52-.07-.15-.67-1.61-.92-2.21-.24-.58-.49-.5-.67-.51h-.57c-.2 0-.52.07-.79.37-.27.3-1.04 1.02-1.04 2.48 0 1.46 1.07 2.88 1.21 3.07.15.2 2.1 3.2 5.08 4.49.71.31 1.26.49 1.7.63.71.23 1.36.2 1.87.12.57-.09 1.76-.72 2.01-1.41.25-.69.25-1.29.17-1.41-.07-.12-.27-.2-.57-.35zm-5.42 7.4h-.01a9.87 9.87 0 0 1-5.03-1.38l-.36-.21-3.74.98 1-3.65-.24-.37a9.86 9.86 0 0 1-1.51-5.26c0-5.45 4.44-9.88 9.89-9.88 2.64 0 5.12 1.03 6.99 2.9a9.83 9.83 0 0 1 2.89 7c0 5.45-4.44 9.88-9.88 9.880zm8.41-18.3A11.82 11.82 0 0 0 12.05 0C5.5 0 .16 5.34.16 11.89c0 2.1.55 4.14 1.59 5.95L.06 24l6.3-1.65a11.88 11.88 0 0 0 5.68 1.45h.01c6.55 0 11.89-5.34 11.89-11.89a11.82 11.82 0 0 0-3.48-8.41z" />
					</svg>
					WhatsApp +52 55 1003 3582
				</a>
				<a className="cm-button" href="mailto:ayuda@compago.com">
					<svg className="cm-icon" width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
						<path d="M4 4h16a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2zM22 7l-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7" />
					</svg>
					ayuda@compago.com
				</a>
			</div>
		</div>
	</aside>;

export const GuideImage = ({src, preview, alt, width, height, caption, variant = 'screen'}) => {
  const [open, setOpen] = useState(false);
  const [view, setView] = useState(null);
  const opener = useRef(null);
  const dialog = useRef(null);
  const viewport = useRef(null);
  const closeButton = useRef(null);
  const fitScale = useRef(1);
  const drag = useRef(null);
  const long = height / width > 1.6;
  const icon = (d, size = 18) => <svg className="cm-icon" width={size} height={size} viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
			<path d={d} />
		</svg>;
  const ZOOM_IN = 'M11 3a8 8 0 1 0 0 16 8 8 0 0 0 0-16zM21 21l-4.35-4.35M11 8v6M8 11h6';
  const ZOOM_OUT = 'M11 3a8 8 0 1 0 0 16 8 8 0 0 0 0-16zM21 21l-4.35-4.35M8 11h6';
  const FIT = 'M3 7V5a2 2 0 0 1 2-2h2M17 3h2a2 2 0 0 1 2 2v2M21 17v2a2 2 0 0 1-2 2h-2M7 21H5a2 2 0 0 1-2-2v-2';
  const DOWNLOAD = 'M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4M7 10l5 5 5-5M12 15V3';
  const CLOSE = 'M18 6 6 18M6 6l12 12';
  const clampView = next => {
    const el = viewport.current;
    if (!el) return next;
    const w = width * next.scale;
    const h = height * next.scale;
    const keep = 96;
    const x = w <= el.clientWidth ? (el.clientWidth - w) / 2 : Math.min(keep, Math.max(el.clientWidth - w - keep, next.x));
    const y = h <= el.clientHeight ? (el.clientHeight - h) / 2 : Math.min(keep, Math.max(el.clientHeight - h - keep, next.y));
    return {
      scale: next.scale,
      x,
      y
    };
  };
  const fit = () => {
    const el = viewport.current;
    if (!el) return;
    const scale = long ? Math.min(1, el.clientWidth * 0.94 / width) : Math.min(1, el.clientWidth * 0.94 / width, el.clientHeight * 0.88 / height);
    fitScale.current = scale;
    setView(clampView({
      scale,
      x: (el.clientWidth - width * scale) / 2,
      y: long ? 72 : (el.clientHeight - height * scale) / 2
    }));
  };
  const zoomAt = (factor, cx, cy) => {
    setView(current => {
      const el = viewport.current;
      if (!current || !el) return current;
      const px = cx ?? el.clientWidth / 2;
      const py = cy ?? el.clientHeight / 2;
      const scale = Math.min(Math.max(fitScale.current * 0.5, current.scale * factor), Math.max(1.5, fitScale.current * 6));
      const ratio = scale / current.scale;
      return clampView({
        scale,
        x: px - (px - current.x) * ratio,
        y: py - (py - current.y) * ratio
      });
    });
  };
  const panBy = (dx, dy) => setView(current => current && clampView({
    ...current,
    x: current.x + dx,
    y: current.y + dy
  }));
  const close = () => {
    setOpen(false);
    setView(null);
    opener.current?.focus();
  };
  const show = event => {
    opener.current = event.currentTarget;
    setOpen(true);
  };
  const actions = useRef({});
  actions.current = {
    fit,
    zoomAt,
    panBy,
    close
  };
  useEffect(() => {
    const modal = dialog.current;
    if (!open || !modal) return undefined;
    if (!modal.open) modal.showModal();
    const el = viewport.current;
    actions.current.fit();
    closeButton.current?.focus();
    const onResize = () => actions.current.fit();
    const onKey = event => {
      const {zoomAt: zoom, panBy: pan} = actions.current;
      if (event.key === '+' || event.key === '=') zoom(1.25); else if (event.key === '-' || event.key === '_') zoom(0.8); else if (event.key === '0') actions.current.fit(); else if (event.key === 'ArrowUp') pan(0, 120); else if (event.key === 'ArrowDown') pan(0, -120); else if (event.key === 'ArrowLeft') pan(120, 0); else if (event.key === 'ArrowRight') pan(-120, 0); else return;
      event.preventDefault();
    };
    const onWheel = event => {
      event.preventDefault();
      const rect = el.getBoundingClientRect();
      if (event.ctrlKey || event.metaKey) actions.current.zoomAt(Math.exp(-event.deltaY * 0.0022), event.clientX - rect.left, event.clientY - rect.top); else actions.current.panBy(-event.deltaX, -event.deltaY);
    };
    const root = document.documentElement;
    const overflow = root.style.overflow;
    root.style.overflow = 'hidden';
    window.addEventListener('resize', onResize);
    document.addEventListener('keydown', onKey);
    el?.addEventListener('wheel', onWheel, {
      passive: false
    });
    return () => {
      root.style.overflow = overflow;
      window.removeEventListener('resize', onResize);
      document.removeEventListener('keydown', onKey);
      el?.removeEventListener('wheel', onWheel);
      if (modal.open) modal.close();
    };
  }, [open]);
  const onPointerDown = event => {
    if (event.button !== 0) return;
    drag.current = {
      x: event.clientX,
      y: event.clientY,
      travel: 0
    };
    event.currentTarget.setPointerCapture(event.pointerId);
  };
  const onPointerMove = event => {
    const start = drag.current;
    if (!start) return;
    const dx = event.clientX - start.x;
    const dy = event.clientY - start.y;
    start.travel += Math.abs(dx) + Math.abs(dy);
    start.x = event.clientX;
    start.y = event.clientY;
    panBy(dx, dy);
  };
  const onPointerUp = event => {
    const start = drag.current;
    drag.current = null;
    if (!start || start.travel > 6 || !view) return;
    const rect = viewport.current.getBoundingClientRect();
    const x = event.clientX - rect.left;
    const y = event.clientY - rect.top;
    const inside = x >= view.x && x <= view.x + width * view.scale && y >= view.y && y <= view.y + height * view.scale;
    if (!inside) close();
  };
  const onDoubleClick = event => {
    const rect = viewport.current.getBoundingClientRect();
    if (view && view.scale > fitScale.current * 1.4) fit(); else zoomAt(2.2, event.clientX - rect.left, event.clientY - rect.top);
  };
  const percent = view ? Math.round(view.scale / fitScale.current * 100) : 100;
  const viewer = open && <dialog ref={dialog} className="cm-overlay cm-lightbox" aria-label={alt} onCancel={event => {
    event.preventDefault();
    actions.current.close();
  }} onClick={event => {
    if (!event.target.closest('button, a, .cm-lightbox-viewport')) close();
  }}>
			<div className="cm-overlay-bar">
				<span className="cm-overlay-title">{alt}</span>
				<span className="cm-overlay-tools">
					<button type="button" className="cm-tool" onClick={() => zoomAt(0.8)} aria-label="Alejar" title="Alejar (−)">
						{icon(ZOOM_OUT)}
					</button>
					<button type="button" className="cm-tool cm-tool-text" onClick={fit} aria-label="Ajustar a la pantalla" title="Ajustar a la pantalla (0)">
						{percent}%
					</button>
					<button type="button" className="cm-tool" onClick={() => zoomAt(1.25)} aria-label="Acercar" title="Acercar (+)">
						{icon(ZOOM_IN)}
					</button>
					<button type="button" className="cm-tool" onClick={fit} aria-label="Ajustar a la pantalla" title="Ajustar a la pantalla (0)">
						{icon(FIT)}
					</button>
					<a className="cm-tool" href={src} download aria-label="Descargar imagen" title="Descargar imagen">
						{icon(DOWNLOAD)}
					</a>
					<span className="cm-tool-gap" />
					<button type="button" ref={closeButton} className="cm-tool" onClick={close} aria-label="Cerrar" title="Cerrar (Esc)">
						{icon(CLOSE)}
					</button>
				</span>
			</div>
			<div className="cm-lightbox-viewport" ref={viewport} onPointerDown={onPointerDown} onPointerMove={onPointerMove} onPointerUp={onPointerUp} onPointerCancel={() => {
    drag.current = null;
  }} onDoubleClick={onDoubleClick}>
				{view && <img className="cm-lightbox-img" src={src} alt={alt} width={width} height={height} draggable={false} style={{
    transform: `translate(${view.x}px, ${view.y}px) scale(${view.scale})`
  }} />}
			</div>
			<p className="cm-lightbox-help">Arrastra para moverte · ⌘ o Ctrl + rueda para acercar · Doble clic para ampliar · Clic afuera o Esc para cerrar</p>
		</dialog>;
  if (variant === 'guide') {
    return <figure className="cm-guide">
				<button type="button" className="cm-guide-open" onClick={show} aria-label={`Ver la guía completa: ${alt}`}>
					<img src={preview ?? src} alt={alt} loading="lazy" decoding="async" />
					<span className="cm-guide-button">
						{icon(ZOOM_IN, 17)}
						Ver la guía completa
					</span>
				</button>
				{caption && <figcaption className="cm-figure-caption">{caption}</figcaption>}
				{viewer}
			</figure>;
  }
  return <figure className={variant === 'terminal' ? 'cm-figure cm-figure-terminal' : 'cm-figure'}>
			<button type="button" className="cm-figure-open" onClick={show} aria-label={`Ampliar la imagen: ${alt}`}>
				<img src={preview ?? src} alt={alt} width={width} height={height} loading="lazy" decoding="async" />
				<span className="cm-figure-hint">
					{icon(ZOOM_IN, 15)}
					Ampliar
				</span>
			</button>
			{caption && <figcaption className="cm-figure-caption">{caption}</figcaption>}
			{viewer}
		</figure>;
};

export const GuideVideo = ({src, poster, title, duration, caption}) => {
  const dialog = useRef(null);
  const player = useRef(null);
  const opener = useRef(null);
  const resumeAt = useRef(0);
  const pageOverflow = useRef('');
  const icon = (d, size = 18, fill = false) => <svg className="cm-icon" width={size} height={size} viewBox="0 0 24 24" fill={fill ? 'currentColor' : 'none'} stroke="currentColor" strokeWidth={fill ? 1.6 : 2} strokeLinecap="round" strokeLinejoin="round" aria-hidden="true">
			<path d={d} />
		</svg>;
  const PLAY = 'M9 6.5 18.5 12 9 17.5z';
  const MAXIMIZE = 'M8 3H5a2 2 0 0 0-2 2v3M21 8V5a2 2 0 0 0-2-2h-3M3 16v3a2 2 0 0 0 2 2h3M16 21h3a2 2 0 0 0 2-2v-3';
  const CLOSE = 'M18 6 6 18M6 6l12 12';
  const open = event => {
    const modal = dialog.current;
    const video = player.current;
    if (!modal || !video || modal.open) return;
    opener.current = event.currentTarget;
    pageOverflow.current = document.documentElement.style.overflow;
    document.documentElement.style.overflow = 'hidden';
    modal.showModal();
    video.currentTime = resumeAt.current;
    video.play().catch(() => {});
    video.focus();
  };
  const onClose = () => {
    const video = player.current;
    if (video) {
      resumeAt.current = video.ended ? 0 : video.currentTime;
      video.pause();
    }
    document.documentElement.style.overflow = pageOverflow.current;
    opener.current?.focus();
  };
  const close = () => {
    if (dialog.current?.open) dialog.current.close();
  };
  const fullscreen = () => {
    const video = player.current;
    if (!video) return;
    video.play().catch(() => {});
    if (video.requestFullscreen) video.requestFullscreen().catch(() => {}); else if (video.webkitEnterFullscreen) video.webkitEnterFullscreen();
  };
  return <figure className="cm-video">
			<button type="button" className="cm-video-frame" onClick={open} aria-label={`Ver el video: ${title}`}>
				<img className="cm-video-thumb" src={poster} alt="" decoding="async" />
				<span className="cm-video-play">{icon(PLAY, 34, true)}</span>
				<span className="cm-video-pill">
					{icon(PLAY, 12, true)}
					Video tutorial
				</span>
				{duration && <span className="cm-video-duration">{duration}</span>}
			</button>
			{caption && <figcaption className="cm-video-caption">{caption}</figcaption>}
			<dialog ref={dialog} className="cm-overlay" aria-label={title} onClose={onClose} onClick={event => {
    if (!event.target.closest('video, button, a')) close();
  }}>
				<div className="cm-theater">
					<div className="cm-overlay-bar">
						<span className="cm-overlay-title">{title}</span>
						<span className="cm-overlay-tools">
							<button type="button" className="cm-tool" onClick={fullscreen} aria-label="Pantalla completa" title="Pantalla completa">
								{icon(MAXIMIZE)}
							</button>
							<button type="button" className="cm-tool" onClick={close} aria-label="Cerrar" title="Cerrar (Esc)">
								{icon(CLOSE)}
							</button>
						</span>
					</div>
					<video ref={player} className="cm-theater-video" src={src} poster={poster} controls playsInline preload="none" tabIndex={-1}>
						Tu navegador no puede reproducir este video.
					</video>
				</div>
			</dialog>
		</figure>;
};

La terminal necesita internet para cobrar. Cuando lo pierde, cubre la pantalla con un aviso que no se puede cerrar hasta que la conexión vuelve. Esta guía explica los dos avisos de conexión y qué hacer con cada uno.

<GuideVideo src="https://docs-media.compago.com/manual/terminal/sin-conexion/video.mp4" poster="/media/manual/terminal/sin-conexion/poster.webp" title="Qué hacer si no hay conexión" duration="1:01" caption="Mira el paso a paso y síguelo en tu terminal." />

## Dónde está en la app

Los avisos no están en ningún menú: aparecen solos, al pie de la pantalla en la que estés.

* **Sin conexión**, con el texto **Revisa el Wi-Fi o los datos de la terminal.** Sale cuando la terminal no tiene red.
* **No pudimos validar tu sesión**, con el texto **No pudimos comunicarnos con el servidor. Verifica tu conexión a internet e intenta nuevamente.** Sale cuando la terminal tiene red, pero no logra comunicarse con Compago.

Los dos tienen un solo botón: **Comprobar conexión**.

## Antes de empezar

* La app de Compago avisa que no hay conexión, pero no cambia la red de la terminal. El Wi-Fi y los datos se revisan en la propia terminal.
* No hace falta cerrar sesión ni apagar la terminal: tu sesión sigue abierta mientras el aviso está en la pantalla.
* Cualquier vendedor puede tocar **Comprobar conexión**. No pide PIN.

## Paso a paso

<Steps titleSize="h3">
  <Step title="Reconoce el aviso" id="paso-1">
    <GuideImage variant="terminal" src="/media/manual/terminal/sin-conexion/paso-1.webp" preview="/media/manual/terminal/sin-conexion/paso-1-vista.webp" width={1341} height={2860} alt="Paso 1: el aviso «Sin conexión», marcado, al pie del inicio de la terminal, con el texto «Revisa el Wi-Fi o los datos de la terminal.» y el botón «Comprobar conexión»" />

    El aviso **Sin conexión** cubre cualquier pantalla cuando la terminal se queda sin internet, y no se puede cerrar. Tu sesión sigue abierta.

    <Tip>Mientras el aviso está en la pantalla, la terminal no puede cobrar.</Tip>
  </Step>

  <Step title="Comprueba la conexión" id="paso-2">
    <GuideImage variant="terminal" src="/media/manual/terminal/sin-conexion/paso-2.webp" preview="/media/manual/terminal/sin-conexion/paso-2-vista.webp" width={1341} height={2860} alt="Paso 2: el aviso «Sin conexión» con el botón «Comprobar conexión» marcado" />

    Revisa el Wi-Fi o los datos de la terminal. Cuando la conexión vuelve, el aviso se quita solo. Si sigue ahí, toca **Comprobar conexión**.

    <Tip>Mientras la terminal revisa, el botón dice **Comprobando…**. Si todavía no hay conexión, el aviso se queda.</Tip>
  </Step>

  <Step title="Atiende el otro aviso" id="paso-3">
    <GuideImage variant="terminal" src="/media/manual/terminal/sin-conexion/paso-3.webp" preview="/media/manual/terminal/sin-conexion/paso-3-vista.webp" width={1341} height={2860} alt="Paso 3: el aviso «No pudimos validar tu sesión», con el texto «No pudimos comunicarnos con el servidor. Verifica tu conexión a internet e intenta nuevamente.» y el botón «Comprobar conexión» marcado" />

    Si ves **No pudimos validar tu sesión**, la terminal no logró comunicarse con Compago. Tu sesión se conserva: revisa la conexión y toca **Comprobar conexión**.

    <Tip>Puede salir aunque la terminal esté conectada a una red, si esa red no tiene salida a internet.</Tip>
  </Step>

  <Step title="Vuelve a cobrar" id="paso-4">
    <GuideImage variant="terminal" src="/media/manual/terminal/sin-conexion/paso-4.webp" preview="/media/manual/terminal/sin-conexion/paso-4-vista.webp" width={1341} height={2860} alt="Paso 4: el inicio de la terminal ya sin el aviso, con el acceso «Cobrar» marcado" />

    El aviso se quita y la terminal sigue en la pantalla en la que estabas, con tu sesión abierta. Ya puedes cobrar otra vez.

    <Tip>Si en lugar de esto ves la pantalla para iniciar sesión, entra de nuevo con tu usuario.</Tip>
  </Step>
</Steps>

## Qué pasa después

* La terminal sigue donde la dejaste: no tienes que volver a entrar ni buscar la pantalla en la que estabas.
* Al volver el internet, la terminal comprueba tu sesión por su cuenta si antes no había podido.
* Si la conexión se fue a mitad de un cobro, revisa en [Transacciones](/manual/terminal/ver-tus-transacciones) si quedó registrado antes de cobrarlo otra vez.
* Si la terminal muestra la pantalla para iniciar sesión, tu sesión ya no era válida. No sale ningún aviso: solo entra de nuevo, como en [Iniciar sesión en la terminal](/manual/terminal/iniciar-sesion).

## Preguntas frecuentes

<AccordionGroup>
  <Accordion title="¿Puedo cobrar sin internet?">
    No. La terminal necesita conexión para aprobar cada pago, y mientras el aviso está en la pantalla no deja tocar nada más.
  </Accordion>

  <Accordion title="¿Se pierden mi sesión o mis ventas?">
    No. Tu sesión sigue abierta y los cobros que ya se aprobaron están en tu cuenta de Compago. Cuando la conexión vuelve, los ves de nuevo en la terminal.
  </Accordion>

  <Accordion title="¿Cuál es la diferencia entre los dos avisos?">
    **Sin conexión** quiere decir que la terminal no tiene red: ni Wi-Fi ni datos. **No pudimos validar tu sesión** quiere decir que sí tiene red, pero no logró comunicarse con Compago. En los dos casos se revisa la conexión y se toca **Comprobar conexión**.
  </Accordion>

  <Accordion title="¿Tengo que tocar el botón o el aviso se quita solo?">
    **Sin conexión** se quita solo en cuanto la terminal recupera la red. El botón sirve para no esperar: hace que la terminal revise en ese momento.
  </Accordion>

  <Accordion title="Toco «Comprobar conexión» y el aviso sigue, ¿qué hago?">
    El botón solo vuelve a revisar: no conecta la terminal. Si el aviso sigue, la terminal todavía no tiene internet. Revisa el Wi-Fi o los datos de la terminal y, si no logras conectarla, escríbenos.
  </Accordion>
</AccordionGroup>

## Errores comunes

### «No hay conexión a internet»

Sale en la pantalla de la tarjeta, con el texto **Por favor, verifica tu conexión a internet y vuelve a intentarlo.**, cuando la conexión falla a mitad de un cobro. Revisa la conexión y toca **Volver a intentar**, o **Cancelar pago** para dejar el cobro.

### «Sin conexión a internet»

Sale al iniciar sesión, con el texto **Por favor, verifica tu conexión a internet e inténtalo de nuevo.** Revisa el Wi-Fi o los datos de la terminal y toca **Iniciar sesión** otra vez.

### El aviso no se quita

Si **Sin conexión** o **No pudimos validar tu sesión** siguen en la pantalla después de tocar **Comprobar conexión**, la terminal todavía no llega a internet. Revisa otra vez el Wi-Fi o los datos de la terminal y vuelve a tocar el botón. Si sigue igual, escríbenos.

### La terminal pide iniciar sesión

Después de **Comprobar conexión** puedes ver la pantalla para entrar con tu usuario, sin ningún aviso. Tu sesión ya no era válida: entra de nuevo con tu usuario y tu contraseña.

## Guía en una imagen

Todos los pasos en una sola imagen, para tenerla a mano o compartirla con tu equipo.

<GuideImage variant="guide" src="/media/manual/terminal/sin-conexion/guia.webp" preview="/media/manual/terminal/sin-conexion/guia-vista.webp" width={4560} height={6179} alt="Qué hacer si no hay conexión: todos los pasos en una imagen" caption="Ábrela para acercarte a cada paso o descárgala." />

## Guías relacionadas

<CardGroup cols={2}>
  <Card title="Inicia sesión" icon="right-to-bracket" href="/manual/terminal/iniciar-sesion">
    Entra de nuevo con tu usuario si la terminal te lo pide.
  </Card>

  <Card title="Transacciones" icon="receipt" href="/manual/terminal/ver-tus-transacciones">
    Confirma si un cobro quedó registrado.
  </Card>

  <Card title="La tarjeta no se lee" icon="triangle-exclamation" href="/manual/terminal/la-tarjeta-no-se-lee">
    Los demás avisos de la pantalla de la tarjeta.
  </Card>

  <Card title="Cobra con tarjeta" icon="credit-card" href="/manual/terminal/cobrar-con-tarjeta">
    El cobro completo, ya con la terminal conectada.
  </Card>
</CardGroup>

## ¿Necesitas ayuda?

<SupportBox />


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.