> ## 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.

# Cómo usar el modo donativos

> Activa un preset para que tu terminal reciba donativos o propinas con montos fijos, y sal del modo con su contraseña.

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>;
};

Con el modo donativos, tu terminal muestra un preset y nada más: quien paga ve el nombre, el mensaje y los montos, elige cuánto dar y paga con su tarjeta. La terminal da las gracias y queda lista para la siguiente persona, sin que nadie de tu equipo tenga que tocarla.

<GuideVideo src="https://docs-media.compago.com/manual/terminal/modo-donativos/video.mp4" poster="/media/manual/terminal/modo-donativos/poster.webp" title="Cómo usar el modo donativos" duration="2:12" caption="Mira el paso a paso y síguelo en tu terminal." />

## Dónde está en la app

* En la pantalla **Nuevo cobro**, toca la **X** de arriba a la izquierda para ir al inicio.
* En el inicio, toca el engrane, arriba a la derecha, para abrir **Configuración**.
* En **Configuración**, bajo **Modos**, toca **Modo donativos** y después **Activar** en el preset que vas a usar.

## Antes de empezar

* Necesitas al menos un preset. Si aún no tienes uno, sigue [Cómo crear un preset de donativos](/manual/terminal/crear-un-preset-de-donativos).
* Necesitas tener la sesión iniciada en la terminal. Cualquier vendedor puede activar el modo.
* Cada preset tiene su propia contraseña de salida, de al menos 4 caracteres. La primera vez que lo activas, la terminal te pide crearla. Decide antes quién la va a conocer: la terminal no la muestra ni tiene forma de recuperarla.
* Con el modo encendido, la terminal solo muestra la pantalla de donativos: no se escriben cobros ni se abren **Transacciones** o **Configuración** hasta que sales del modo.

## Paso a paso

<Steps titleSize="h3">
  <Step title="Activa un preset" id="paso-1">
    <GuideImage variant="terminal" src="/media/manual/terminal/modo-donativos/paso-1.webp" preview="/media/manual/terminal/modo-donativos/paso-1-vista.webp" width={1341} height={2860} alt="Paso 1: la pantalla «Modo donativos» con el preset «Becas El Tornillo», sus montos $50, $100, $200 y $500, y la opción «Activar» marcada" />

    En **Configuración**, entra a **Modo donativos**: ahí están tus presets. Toca **Activar** en el que quieres usar.

    <Tip>¿Aún no tienes un preset? Créalo con **Nuevo preset**.</Tip>
  </Step>

  <Step title="Crea la contraseña de salida" id="paso-2">
    <GuideImage variant="terminal" src="/media/manual/terminal/modo-donativos/paso-2.webp" preview="/media/manual/terminal/modo-donativos/paso-2-vista.webp" width={1341} height={2860} alt="Paso 2: la pantalla «Contraseña de salida» con los campos «Contraseña» y «Repite la contraseña» llenos, ocultos con puntos, y el botón «Guardar contraseña» marcado" />

    La primera vez que activas un preset, la terminal pide su **Contraseña de salida**. Escríbela dos veces, con al menos 4 caracteres, y toca **Guardar contraseña**.

    <Tip>Anótala en un lugar seguro: la terminal no la muestra ni tiene forma de recuperarla.</Tip>
  </Step>

  <Step title="Deja elegir el monto" id="paso-3">
    <GuideImage variant="terminal" src="/media/manual/terminal/modo-donativos/paso-3.webp" preview="/media/manual/terminal/modo-donativos/paso-3-vista.webp" width={1341} height={2860} alt="Paso 3: la pantalla que ve quien paga, con «Becas El Tornillo», «Elige tu donación», el mensaje, los cuatro montos con $100 elegido y el botón «Donar $100.00» marcado" />

    La terminal ya muestra tu preset: el nombre, **Elige tu donación**, el mensaje y los montos. Quien paga toca un monto y lo confirma con el botón de abajo, por ejemplo **Donar \$100.00**.

    <Tip>Si tu preset tiene encendido **Cobrar al elegir el monto**, no hay botón: tocar el monto lleva directo a la tarjeta.</Tip>
  </Step>

  <Step title="Acerca la tarjeta" id="paso-4">
    <GuideImage variant="terminal" src="/media/manual/terminal/modo-donativos/paso-4.webp" preview="/media/manual/terminal/modo-donativos/paso-4-vista.webp" width={1341} height={2860} alt="Paso 4: la pantalla de la tarjeta con «Total a pagar» $100.00, «Donación · Becas El Tornillo» y «Acerca o inserta tu tarjeta», con el símbolo de pago sin contacto de la terminal marcado" />

    La terminal muestra el total y para qué es, **Donación · Becas El Tornillo**, y espera la tarjeta: se acerca al símbolo de arriba de la terminal o se inserta por el chip.

    <Tip>También se puede pagar acercando el celular.</Tip>
  </Step>

  <Step title="Espera el agradecimiento" id="paso-5">
    <GuideImage variant="terminal" src="/media/manual/terminal/modo-donativos/paso-5.webp" preview="/media/manual/terminal/modo-donativos/paso-5-vista.webp" width={1341} height={2860} alt="Paso 5: la pantalla «Gracias por tu donación» con «Tu pago se aprobó», «Vuelve al inicio en 4 segundos» y el botón «Imprimir comprobante»" />

    Al aprobarse el pago, la terminal imprime el comprobante y muestra **Gracias por tu donación**. No hay que tocar nada: en 4 segundos vuelve sola a los montos.

    <Tip>Con **Imprimir comprobante** sale otra copia mientras la pantalla sigue ahí.</Tip>
  </Step>

  <Step title="Toca el nombre 5 veces" id="paso-6">
    <GuideImage variant="terminal" src="/media/manual/terminal/modo-donativos/paso-6.webp" preview="/media/manual/terminal/modo-donativos/paso-6-vista.webp" width={1341} height={2860} alt="Paso 6: la pantalla de donativos con el nombre del preset, «Becas El Tornillo», marcado arriba de «Elige tu donación»" />

    Para salir del modo, toca 5 veces seguidas el nombre de tu preset, arriba de la pantalla.

    <Tip>La nota de **Modo donativos** dice «logo de arriba»: lo que se toca es este nombre. Da los cinco toques en unos tres segundos.</Tip>
  </Step>

  <Step title="Escribe la contraseña" id="paso-7">
    <GuideImage variant="terminal" src="/media/manual/terminal/modo-donativos/paso-7.webp" preview="/media/manual/terminal/modo-donativos/paso-7-vista.webp" width={1341} height={2860} alt="Paso 7: la pantalla «Contraseña de salida» con «Escribe la contraseña para salir del modo donativos», el campo lleno con puntos y el botón «Salir del modo donativos» marcado" />

    Se abre **Contraseña de salida**. Escribe la contraseña de este preset y toca **Salir del modo donativos**.

    <Tip>Cada preset tiene su propia contraseña: aquí va la del que está activo.</Tip>
  </Step>

  <Step title="Vuelve al menú" id="paso-8">
    <GuideImage variant="terminal" src="/media/manual/terminal/modo-donativos/paso-8.webp" preview="/media/manual/terminal/modo-donativos/paso-8-vista.webp" width={1341} height={2860} alt="Paso 8: el inicio de la terminal después de salir del modo donativos, con las ventas del día y el acceso «Cobrar» marcado" />

    La terminal regresa al inicio y el modo donativos queda apagado. Tu preset sigue guardado, con su contraseña, para activarlo cuando quieras.

    <Tip>Los donativos del día están en **Transacciones**, como cualquier otro cobro de la terminal.</Tip>
  </Step>
</Steps>

## Qué pasa después

* Cada donativo es un solo pago por el monto elegido, sin meses. Al aprobarse, la terminal imprime el comprobante, da las gracias y vuelve sola a los montos a los 4 segundos.
* Con un preset de tipo **Propina**, la pantalla dice **Elige tu propina**, el botón **Dejar \$100.00 de propina** y el agradecimiento **Gracias por tu propina**. Todo lo demás funciona igual.
* Si el banco rechaza el pago, la terminal muestra **Pago rechazado** y **No se hizo ningún cargo**, y vuelve sola a los montos a los 5 segundos.
* La pantalla de la tarjeta no tiene botón para regresar. Si en 20 segundos nadie acerca una tarjeta, aparece **Tarjeta no detectada**: con **Cancelar pago** se vuelve a los montos.
* Si la terminal se reinicia con el modo encendido, al abrir la app regresa a la pantalla de donativos.
* Al salir, el modo se apaga, pero el preset y su contraseña se quedan. La próxima vez que toques **Activar** en ese preset, el modo se enciende sin pedir una contraseña nueva.

## Preguntas frecuentes

<AccordionGroup>
  <Accordion title="¿Puedo cobrar una venta normal con el modo encendido?">
    No. Mientras el modo está encendido, la terminal solo recibe donativos con el preset activo. Para cobrar una venta, sal del modo con los cinco toques y la contraseña.
  </Accordion>

  <Accordion title="¿Todos mis presets usan la misma contraseña?">
    No. Cada preset tiene la suya, y para salir se escribe la del preset que está activo. Si quieres usar la misma en todos, ponla en cada uno.
  </Accordion>

  <Accordion title="¿Cómo cambio la contraseña de un preset?">
    Con el modo apagado, entra a **Modo donativos**, toca los tres puntos del preset y después **Contraseña de salida**, que dice **Cambiar**. Escribe la nueva dos veces y toca **Guardar contraseña**.
  </Accordion>

  <Accordion title="¿Qué hago si olvidé la contraseña de salida?">
    La terminal no muestra la contraseña y no tiene una opción para recuperarla. Si el modo está encendido y nadie de tu equipo la recuerda, escríbenos: los datos de contacto están al final de esta página.
  </Accordion>

  <Accordion title="¿Dónde veo lo que recibí en donativos?">
    En **Transacciones**, como cualquier otro cobro de la terminal. Para verlos, primero sal del modo.
  </Accordion>
</AccordionGroup>

## Errores comunes

### «Pago rechazado»

El banco no aprobó el pago y **No se hizo ningún cargo**. La terminal vuelve sola a los montos a los 5 segundos: quien paga puede intentar de nuevo o con otra tarjeta. Los motivos más comunes están en [Qué hacer con un pago rechazado](/manual/terminal/pago-rechazado).

### «La contraseña debe tener al menos 4 caracteres»

La contraseña que elegiste es muy corta. Escribe una de 4 caracteres o más en los dos campos.

### «Las contraseñas no coinciden»

Lo que escribiste en **Repite la contraseña** no es igual a la primera. Revisa los dos campos y escríbela otra vez.

### «Contraseña incorrecta»

No es la contraseña del preset activo. Recuerda que cada preset tiene la suya, y escríbela de nuevo.

### «Demasiados intentos fallidos. Espera 60 segundos.»

Después de cinco contraseñas equivocadas, la terminal deja de aceptarla durante un minuto y el aviso cuenta los segundos que faltan. Cuando termine, escribe la correcta.

### Los cinco toques no abren «Contraseña de salida»

Toca el nombre del preset, arriba de la pantalla, y hazlo seguido: los cinco toques deben caber en unos tres segundos. Si tardas más, la cuenta empieza de nuevo.

## 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/modo-donativos/guia.webp" preview="/media/manual/terminal/modo-donativos/guia-vista.webp" width={4560} height={10961} alt="Cómo usar el modo donativos: todos los pasos en una imagen" caption="Ábrela para acercarte a cada paso o descárgala." />

## Guías relacionadas

<CardGroup cols={2}>
  <Card title="Presets de donativos" icon="list" href="/manual/terminal/crear-un-preset-de-donativos">
    Prepara el nombre, el mensaje y los montos que verá quien paga.
  </Card>

  <Card title="Modo kiosko" icon="tablet-screen-button" href="/manual/terminal/modo-kiosko">
    Deja la terminal esperando los cobros de un tótem.
  </Card>

  <Card title="Pago rechazado" icon="circle-xmark" href="/manual/terminal/pago-rechazado">
    Qué significa cada rechazo y qué hacer.
  </Card>

  <Card title="Transacciones" icon="receipt" href="/manual/terminal/ver-tus-transacciones">
    Los cobros de tu terminal, del más reciente al más antiguo.
  </Card>
</CardGroup>

## ¿Necesitas ayuda?

<SupportBox />


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