> ## 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 reprogramar el próximo cobro

> Mueve la fecha del siguiente cobro de una suscripción.

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

Si tu cliente te pide que le cobres otro día, por ejemplo cuando recibe su pago, mueve la fecha del próximo cobro. Desde esa fecha, los cobros siguientes se cuentan con el mismo periodo.

<GuideVideo src="/media/manual/suscripciones/reprogramar-el-proximo-cobro/video.mp4" poster="/media/manual/suscripciones/reprogramar-el-proximo-cobro/poster.webp" title="Cómo reprogramar el próximo cobro" duration="0:36" caption="Mira el paso a paso y síguelo en tu panel." />

## Dónde está en la app

* En el menú de la izquierda, entra a **Suscripciones** y haz clic en la suscripción.
* Arriba a la derecha del detalle, haz clic en **⋮** (los tres puntos) y elige **Reprogramar próximo cobro**.

## Antes de empezar

* Pueden hacerlo todos los roles de un comercio: **Dueño**, **Administrador** y **Miembro**.
* La suscripción tiene que estar **Activa**, **Fallando** o **Pausada**.
* La nueva fecha tiene que ser a partir de mañana.
* Aquí solo cambias la fecha. Para cambiar el monto o el periodo, [edita la suscripción](/manual/suscripciones/editar-una-suscripcion).

## Paso a paso

<Steps titleSize="h3">
  <Step title="Abre el menú" id="paso-1">
    <GuideImage src="/media/manual/suscripciones/reprogramar-el-proximo-cobro/paso-1.webp" preview="/media/manual/suscripciones/reprogramar-el-proximo-cobro/paso-1-vista.webp" width={2880} height={1922} alt="Paso 1: el botón de los tres puntos, arriba a la derecha del detalle de la suscripción" />

    En **Suscripciones**, abre la suscripción. Arriba a la derecha, haz clic en **⋮** (los tres puntos).

    <Tip>Se puede reprogramar el cobro de las suscripciones **Activa**, **Fallando** o **Pausada**.</Tip>
  </Step>

  <Step title="Reprograma el cobro" id="paso-2">
    <GuideImage src="/media/manual/suscripciones/reprogramar-el-proximo-cobro/paso-2.webp" preview="/media/manual/suscripciones/reprogramar-el-proximo-cobro/paso-2-vista.webp" width={2880} height={1922} alt="Paso 2: «Reprogramar próximo cobro» marcado en el menú de la suscripción" />

    En el menú, haz clic en **Reprogramar próximo cobro**.
  </Step>

  <Step title="Elige la nueva fecha" id="paso-3">
    <GuideImage src="/media/manual/suscripciones/reprogramar-el-proximo-cobro/paso-3.webp" preview="/media/manual/suscripciones/reprogramar-el-proximo-cobro/paso-3-vista.webp" width={2880} height={1922} alt="Paso 3: el calendario de «Próximo cobro» abierto, con el nuevo día marcado" />

    En **Próximo cobro**, haz clic en el calendario y elige el nuevo día. Tiene que ser a partir de mañana.

    <Tip>También puedes escribir la fecha en el campo: día, mes y año.</Tip>
  </Step>

  <Step title="Guarda la nueva fecha" id="paso-4">
    <GuideImage src="/media/manual/suscripciones/reprogramar-el-proximo-cobro/paso-4.webp" preview="/media/manual/suscripciones/reprogramar-el-proximo-cobro/paso-4-vista.webp" width={2880} height={1925} alt="Paso 4: la nueva fecha en «Próximo cobro» y el botón «Guardar», abajo a la derecha" />

    La nueva fecha ya está en **Próximo cobro**, y el aviso te dice que desde ese día los cobros siguen con el mismo periodo. Haz clic en **Guardar**.
  </Step>

  <Step title="Revisa la nueva fecha" id="paso-5">
    <GuideImage src="/media/manual/suscripciones/reprogramar-el-proximo-cobro/paso-5.webp" preview="/media/manual/suscripciones/reprogramar-el-proximo-cobro/paso-5-vista.webp" width={2880} height={1922} alt="Paso 5: la nueva fecha en «Próximo cargo», arriba del detalle de la suscripción" />

    El **Próximo cargo** ya muestra la nueva fecha. Los cobros siguientes se cuentan a partir de ella, con el mismo periodo.

    <Tip>Para mover la fecha otra vez, repite estos pasos.</Tip>
  </Step>
</Steps>

## Qué pasa después

* El siguiente cobro se hace en la nueva fecha, por el mismo monto y a la misma tarjeta.
* Los cobros que siguen se cuentan desde esa fecha. Por ejemplo, si la suscripción es mensual y la moviste al día 26, se cobra el 26 de cada mes.
* La fecha de inicio y los cobros que ya se hicieron no cambian.

## Preguntas frecuentes

<AccordionGroup>
  <Accordion title="¿Puedo adelantar el cobro?">
    Sí, a cualquier fecha a partir de mañana. No se puede elegir hoy ni una fecha pasada: en el calendario esos días aparecen en gris.
  </Accordion>

  <Accordion title="¿Cambia el monto si muevo la fecha?">
    No. El cobro se hace por el mismo monto de siempre. Si también quieres cambiar el monto, te lo explicamos en [Editar una suscripción](/manual/suscripciones/editar-una-suscripcion).
  </Accordion>

  <Accordion title="¿Cambia el periodo de la suscripción?">
    No. Los cobros siguen cada semana, cada mes o cada año, como estaba. Para cambiar el periodo, [edita la suscripción](/manual/suscripciones/editar-una-suscripcion).
  </Accordion>

  <Accordion title="¿Puedo reprogramar una suscripción pausada?">
    Sí. Mientras esté **Pausada** no se hace ningún cobro. Si la reanudas antes de la nueva fecha, el cobro se hace ese día. Te lo explicamos en [Pausar o reanudar](/manual/suscripciones/pausar-o-reanudar).
  </Accordion>
</AccordionGroup>

## Errores comunes

### No veo «Reprogramar próximo cobro» en el menú

La suscripción está **Cancelada** o **Completada**, y esas ya no tienen próximo cobro. Revisa su estado junto al título.

### «La nueva fecha debe ser a partir de mañana.»

Escribiste la fecha de hoy o una fecha pasada. Elige un día a partir de mañana y vuelve a hacer clic en **Guardar**.

### Hice clic en «Guardar» y no apareció «Próximo cobro reprogramado»

La fecha que elegiste es la misma que ya tenía, así que el diálogo solo se cierra. Elige otro dí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/suscripciones/reprogramar-el-proximo-cobro/guia.webp" preview="/media/manual/suscripciones/reprogramar-el-proximo-cobro/guia-vista.webp" width={4560} height={12500} alt="Guía en imagen: cómo reprogramar el próximo cobro en 5 pasos" caption="Ábrela para acercarte a cada paso o descárgala." />

## Guías relacionadas

<CardGroup cols={2}>
  <Card title="Ver tus suscripciones" icon="list" href="/manual/suscripciones/ver-tus-suscripciones">
    Tus suscripciones activas, pausadas o con cobros fallidos, y su detalle.
  </Card>

  <Card title="Editar una suscripción" icon="pen" href="/manual/suscripciones/editar-una-suscripcion">
    Cambia el monto, el periodo o el número de cobros.
  </Card>

  <Card title="Pausar o reanudar" icon="pause" href="/manual/suscripciones/pausar-o-reanudar">
    Detén los cobros por un tiempo y retómalos cuando quieras.
  </Card>

  <Card title="Reintentar un cobro" icon="rotate-right" href="/manual/suscripciones/reintentar-un-cobro">
    Vuelve a intentar un cobro que la tarjeta de tu cliente rechazó.
  </Card>
</CardGroup>

## ¿Necesitas ayuda?

<SupportBox />
