> ## 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 guardar la tarjeta de un cliente

> Envía un link para que tu cliente registre su tarjeta y puedas cobrarle después sin pedírsela otra vez.

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="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 **Tarjetas en archivo** guardas la tarjeta de un cliente para cobrarle cuando lo necesites, sin pedirle otra vez sus datos: por ejemplo, a un contratista que te compra material cada semana. Tú creas un link, se lo mandas y tu cliente registra su tarjeta en él.

<GuideVideo src="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/video.mp4" poster="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/poster.webp" title="Cómo guardar la tarjeta de un cliente" duration="0:46" caption="Mira el paso a paso y síguelo en tu panel." />

## Dónde está en la app

* En el menú de la izquierda, abre **Avanzado** y entra a **Tarjetas en archivo**.
* Arriba a la derecha, haz clic en **Crear método de pago**. Se abre una ventana para elegir el tipo de link y escribir los datos de tu cliente.

## Antes de empezar

* Pueden crear el link el **Dueño** y el **Administrador** de un comercio. El **Miembro** puede ver las tarjetas guardadas, pero no crear links ni cobrarles.
* Ten a la mano el nombre, el apellido, el correo y el teléfono de tu cliente.
* Tu cliente puede guardar una tarjeta Visa o Mastercard.

## Paso a paso

<Steps titleSize="h3">
  <Step title="Entra a «Tarjetas en archivo»" id="paso-1">
    <GuideImage src="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-1.webp" preview="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-1-vista.webp" width={2880} height={1922} alt="Paso 1: «Tarjetas en archivo» marcado dentro de «Avanzado», en el menú de la izquierda" />

    En el menú de la izquierda, abre **Avanzado** y haz clic en **Tarjetas en archivo**.

    <Tip>¿Tu menú solo muestra íconos? **Avanzado** es el del rayo.</Tip>
  </Step>

  <Step title="Crea un método de pago" id="paso-2">
    <GuideImage src="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-2.webp" preview="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-2-vista.webp" width={2880} height={1922} alt="Paso 2: el botón «Crear método de pago», arriba a la derecha de la lista de tarjetas guardadas" />

    Aquí ves las tarjetas que tus clientes ya guardaron. Haz clic en **Crear método de pago**, arriba a la derecha.

    <Tip>Para encontrar una tarjeta, búscala por ID externo, últimos 4 dígitos, nombre o email del cliente.</Tip>
  </Step>

  <Step title="Escribe sus datos" id="paso-3">
    <GuideImage src="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-3.webp" preview="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-3-vista.webp" width={2880} height={1922} alt="Paso 3: la ventana «Crear método de pago» con «Solo guardar la tarjeta» elegido y los datos del cliente escritos" />

    Deja **Solo guardar la tarjeta**. Escribe el nombre, el apellido, el correo y el teléfono de tu cliente.

    <Tip>¿Quieres cobrarle o apartarle un monto en el mismo link? Elige **Cobrar y guardar la tarjeta** o **Retener y guardar la tarjeta** y escribe el monto.</Tip>
  </Step>

  <Step title="Crea el link" id="paso-4">
    <GuideImage src="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-4.webp" preview="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-4-vista.webp" width={2880} height={1925} alt="Paso 4: el botón «Crear método de pago», abajo a la derecha de la ventana" />

    Revisa los datos y haz clic en **Crear método de pago**.

    <Tip>En **Configuración del link** eliges cuánto tiempo sirve el link: 24 horas, 48 horas, 7 días o 30 días. Si no cambias nada, sirve 48 horas.</Tip>
  </Step>

  <Step title="Envía el link" id="paso-5">
    <GuideImage src="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-5.webp" preview="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-5-vista.webp" width={2880} height={1922} alt="Paso 5: la ventana «Método de pago creado» con el link y el botón «Ir al detalle» marcado" />

    Tu link está listo. Cópialo con el botón de copiar y envíaselo a tu cliente por WhatsApp o correo. Luego haz clic en **Ir al detalle**.

    <Tip>Cuando tu cliente guarde su tarjeta, el link deja de funcionar. Si no la guarda a tiempo, el link vence.</Tip>
  </Step>

  <Step title="Revisa su estado" id="paso-6">
    <GuideImage src="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-6.webp" preview="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/paso-6-vista.webp" width={2880} height={1922} alt="Paso 6: el método de pago «Pendiente», con el link para compartir en la tarjeta «Tarjeta»" />

    El método de pago queda **Pendiente** hasta que tu cliente guarde su tarjeta. Si necesitas el link otra vez, cópialo aquí, en **Tarjeta**.

    <Tip>También puedes copiarlo desde el menú de tres puntos, arriba a la derecha, con **Copiar link de checkout**.</Tip>
  </Step>
</Steps>

## Qué pasa después

* Tu cliente abre el link, escribe los datos de su tarjeta y la guarda. Te lo mostramos en [Cómo guarda tu cliente su tarjeta](/manual/tu-cliente/guardar-su-tarjeta).
* Con **Solo guardar la tarjeta** se hace un cargo de verificación, de \$1.00 si no lo cambiaste, que se reembolsa automáticamente.
* En cuanto tu cliente guarda su tarjeta, el método de pago pasa a **Activo** y ves la marca y los últimos 4 dígitos de la tarjeta.
* Desde ese momento puedes [cobrarle](/manual/avanzado/cobrar-a-una-tarjeta-guardada) o [retener fondos](/manual/avanzado/retener-capturar-o-liberar) en su tarjeta cuando lo necesites.

## Preguntas frecuentes

<AccordionGroup>
  <Accordion title="¿Compago le manda el link a mi cliente?">
    No. Tú copias el link y se lo envías por WhatsApp, correo o como prefieras. Si lo necesitas otra vez, está en el detalle del método de pago mientras siga **Pendiente**.
  </Accordion>

  <Accordion title="¿Cuánto tiempo sirve el link?">
    48 horas, si no cambias nada. En **Configuración del link** › **Vigencia del link** puedes elegir 24 horas, 48 horas, 7 días o 30 días. En el detalle del método de pago ves la fecha en **Expira**. Si vence antes de que tu cliente guarde su tarjeta, crea un link nuevo.
  </Accordion>

  <Accordion title="¿Qué es el cargo de verificación?">
    Es un cargo pequeño que confirma que la tarjeta es válida y se reembolsa automáticamente a tu cliente. Es de \$1.00 si no lo cambias; puedes ajustarlo en **Configuración del link** › **Monto de verificación**. En el **Historial de cobros** de la tarjeta aparece como **Reembolsado**.
  </Accordion>

  <Accordion title="¿Puedo cobrarle a mi cliente en el mismo link?">
    Sí. Elige **Cobrar y guardar la tarjeta** para que pague el monto al guardar su tarjeta, o **Retener y guardar la tarjeta** para bloquear el monto sin cobrarlo. Una retención la capturas o la liberas en un plazo de 7 días naturales. Te lo explicamos en [Retener fondos](/manual/avanzado/retener-capturar-o-liberar).
  </Accordion>

  <Accordion title="¿Qué tarjetas puede guardar mi cliente?">
    Visa y Mastercard. Si intenta con otra, verá el aviso «Tarjeta no soportada» y podrá intentar con otra tarjeta.
  </Accordion>
</AccordionGroup>

## Errores comunes

### No veo «Avanzado» ni «Tarjetas en archivo» en el menú

Tarjetas en archivo es parte de las cuentas de comercio. Si tu cuenta es de fabricante, no tienes esta sección. Si eres comercio y no la ves, escríbenos.

### Aparece «El nombre es requerido» o «Correo inválido»

Falta un dato de tu cliente o el correo no es válido. **Nombre**, **Apellido**, **Correo electrónico** y **Teléfono** son obligatorios: revisa el campo marcado y vuelve a hacer clic en **Crear método de pago**.

### Soy Miembro y no puedo crear el link

Crear links para guardar tarjetas es solo para el **Dueño** y el **Administrador**. Pídele a uno de ellos que lo cree por ti.

### Mi cliente dice que el link ya no funciona

El link deja de funcionar cuando vence o cuando tu cliente ya guardó su tarjeta. Búscalo en **Tarjetas en archivo**: si dice **Activo**, la tarjeta ya quedó guardada; si sigue **Pendiente** y ya pasó la fecha de **Expira**, crea un link 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/avanzado/guardar-la-tarjeta-de-un-cliente/guia.webp" preview="/media/manual/avanzado/guardar-la-tarjeta-de-un-cliente/guia-vista.webp" width={4560} height={14692} alt="Guía en imagen: cómo guardar la tarjeta de un cliente en 6 pasos" caption="Ábrela para acercarte a cada paso o descárgala." />

## Guías relacionadas

<CardGroup cols={2}>
  <Card title="Cobrar a una tarjeta" icon="credit-card" href="/manual/avanzado/cobrar-a-una-tarjeta-guardada">
    Cobra sin pedirle otra vez la tarjeta a tu cliente.
  </Card>

  <Card title="Retener fondos" icon="lock" href="/manual/avanzado/retener-capturar-o-liberar">
    Aparta un monto en la tarjeta y cóbralo después.
  </Card>

  <Card title="Cómo guarda tu cliente su tarjeta" icon="eye" href="/manual/tu-cliente/guardar-su-tarjeta">
    Lo que ve tu cliente al registrar su tarjeta.
  </Card>

  <Card title="Revocar una tarjeta" icon="ban" href="/manual/avanzado/revocar-una-tarjeta">
    Quita una tarjeta para que ya no se le pueda cobrar.
  </Card>
</CardGroup>

## ¿Necesitas ayuda?

<SupportBox />
