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

# Rastrear un flujo de pago de Stripe de extremo a extremo

export const UseCaseHero = ({title, description, prompt, category, features, devinUrl, agent, intent, playbookId, type}) => {
  const encodedPrompt = encodeURIComponent(prompt || '');
  const tag = 'docs-use-case-gallery';
  const utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=hero-cta';
  const agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  const devinHref = type === 'schedule' ? 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + (prompt ? '&prompt=' + encodedPrompt : '') : type === 'review' ? 'https://app.devin.ai/review?' + utm : agent === 'ada' ? 'https://app.devin.ai/search?' + utm + '&noSubmit=true' + (prompt ? '&prompt=' + encodedPrompt : '') : devinUrl ? devinUrl.includes('?') ? devinUrl + '&' + utm + agentParams : devinUrl + '?' + utm + agentParams : prompt ? 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encodedPrompt : 'https://app.devin.ai/?' + utm + agentParams;
  const buttonLabel = type === 'schedule' ? 'Schedule in Devin ↗' : type === 'review' ? 'Set Up Devin Review ↗' : agent === 'advanced' ? 'Try in Devin ↗' : agent === 'dana' ? 'Try in Dana ↗' : agent === 'ada' ? 'Try in Ask Devin ↗' : 'Try in Devin ↗';
  const featureList = features ? features.split(',').map(f => f.trim()) : [];
  return <div className="uc-hero">
      <div className="uc-hero-inner">
        <div className="uc-hero-left">
          <h1 className="uc-hero-title">{title}</h1>
          <p className="uc-hero-desc">{description}</p>
          <div>
            <a href={devinHref} target="_blank" rel="noopener noreferrer" className="try-in-devin-btn">
              {buttonLabel}
            </a>
          </div>
        </div>
        <div className="uc-hero-meta">
          <div className="uc-meta-item">
            <span className="uc-meta-label">Author</span>
            <span className="uc-meta-value">Cognition</span>
          </div>
          <div className="uc-meta-item">
            <span className="uc-meta-label">Category</span>
            <span className="uc-meta-value">{category}</span>
          </div>
          {featureList.length > 0 && <div className="uc-meta-item">
              <span className="uc-meta-label">Features</span>
              <span className="uc-meta-value">{featureList.join(', ')}</span>
            </div>}
        </div>
      </div>
    </div>;
};

export const PromptBlock = ({children, type, agent, intent, playbookId}) => {
  var utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=prompt-block';
  var tag = 'docs-use-case-gallery';
  var agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  var label = type === 'schedule' ? 'Schedule in Devin' : type === 'playbook' ? 'Create Playbook' : type === 'knowledge' ? 'Add to Knowledge' : agent === 'advanced' ? 'Try in Devin' : agent === 'dana' ? 'Try in Dana' : agent === 'ada' ? 'Try in Ask Devin' : 'Try in Devin';
  var buildUrl = function (text) {
    var encoded = encodeURIComponent(text);
    if (type === 'schedule') return 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + '&prompt=' + encoded;
    if (type === 'playbook') return 'https://app.devin.ai/settings/playbooks/create?' + utm + '&body=' + encoded;
    if (type === 'knowledge') return 'https://app.devin.ai/knowledge?' + utm + '&body=' + encoded;
    if (agent === 'ada') return 'https://app.devin.ai/search?' + utm + '&noSubmit=true&prompt=' + encoded;
    return 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encoded;
  };
  const ref = React.useRef(null);
  const [href, setHref] = React.useState('#');
  React.useEffect(() => {
    if (!ref.current) return;
    var codeEl = ref.current.querySelector('pre code');
    if (codeEl) {
      var text = codeEl.textContent.trim();
      if (text) setHref(buildUrl(text));
    }
    var header = ref.current.querySelector('[data-component-part="code-block-header"]');
    if (header && !header.querySelector('.prompt-block-devin-link')) {
      var link = document.createElement('a');
      link.href = href;
      link.target = '_blank';
      link.rel = 'noopener noreferrer';
      link.className = 'prompt-block-devin-link';
      link.style.cssText = 'display:inline-flex;align-items:center;gap:6px;text-decoration:none;color:#fff;font-size:11px;font-weight:500;padding:4px 10px;border-radius:6px;white-space:nowrap;background:#317CFF;transition:background 0.2s;margin-left:8px;';
      link.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> ' + label;
      link.onmouseenter = function () {
        link.style.background = '#2968D9';
      };
      link.onmouseleave = function () {
        link.style.background = '#317CFF';
      };
      header.appendChild(link);
    }
    var existingLink = ref.current.querySelector('.prompt-block-devin-link');
    if (existingLink && href !== '#') existingLink.href = href;
  });
  return <div className="prompt-block" ref={ref}>{children}</div>;
};

<UseCaseHero title="Rastrear un flujo de pago de Stripe de extremo a extremo" description="Usa Ask Devin para mapear cada archivo y función en un flujo de pago de Stripe, desde el botón «Subscribe» hasta el controlador del webhook, antes de escribir una sola línea de código." prompt="Necesito agregar lógica de reintento a nuestro controlador de webhook de pago. Antes de empezar, guíame a través del flujo de pago completo — desde el botón de checkout en el frontend, pasando por la API, la integración con Stripe, el procesamiento del webhook y las actualizaciones de la base de datos. Enumera cada archivo y función involucrados." category="Desarrollo de funcionalidades" features="MCP" agent="ada" />

<div className="uc-detail-wrapper">
  <Tip>¿No quieres configurarlo manualmente? Pega un enlace a esta página en una sesión de Devin y pídele que lo configure todo por ti.</Tip>

  <Steps>
    <Step title="Pide a Devin que rastree el flujo de pago">
      Te han asignado un ticket para agregar lógica de reintentos al controlador de webhooks de Stripe, pero te uniste al equipo hace dos semanas y no has trabajado con pagos antes. En lugar de pasar una hora haciendo clic entre archivos fuente, abre [Ask Devin](https://app.devin.ai/search?utm_source=docs\&utm_medium=use-case-gallery) y pídele que rastree el flujo por ti.

      Selecciona **Ask Devin** en la barra lateral izquierda, elige tu repo y describe el flujo que necesitas entender:

      <PromptBlock agent="ada">
        ```txt Rastrea el flujo de pagos theme={null}
        Necesito agregar lógica de reintentos a nuestro controlador de webhooks de pago. Antes de
        empezar, explícame paso a paso cómo funcionan los pagos de extremo a extremo:

        1. ¿Qué sucede cuando un usuario hace clic en "Subscribe" en la página de precios?
        2. ¿Qué ruta de la API maneja la solicitud?
        3. ¿Cómo funciona la integración con Stripe? ¿Dónde se crean las suscripciones?
        4. ¿Cómo se procesan los webhooks y dónde se actualiza la base de datos (DB)?

        Para cada paso, dame la ruta del archivo, el nombre de la función y un resumen en una línea
        de lo que hace.
        ```
      </PromptBlock>

      Devin lee la documentación de [DeepWiki](/es/work-with-devin/deepwiki) de tu repo, busca en el código fuente real y rastrea las llamadas a funciones entre archivos para construir una visión completa. Devuelve un mapa estructurado de todo el flujo:

      ```
      ## Payment Flow: Subscribe → Database

      1. src/pages/pricing/PricingCard.tsx:45
         handleSubscribe() → POST /api/v2/subscriptions

      2. src/api/v2/subscriptions/create.ts:12
         Validates input, checks eligibility → calls SubscriptionService.create()

      3. src/services/SubscriptionService.ts:89
         Creates Stripe subscription via stripe.subscriptions.create()
         Stores pending record with status="pending"

      4. src/webhooks/stripe.ts:34
         Receives invoice.payment_succeeded → calls SubscriptionService.activate()
         ⚠ No retry logic here — this is where you'll make changes

      5. src/services/SubscriptionService.ts:134
         Updates status to "active", creates invoice record, emits event
      ```

      En menos de un minuto obtienes un mapa a nivel de archivo del pipeline de pagos: cinco archivos, los nombres exactos de las funciones y el punto donde va tu cambio.
    </Step>

    <Step title="Profundiza en el controlador del webhook mediante preguntas de seguimiento">
      Ask Devin es conversacional: puedes hacer todas las preguntas de seguimiento que necesites. Ahora que puedes ver el pipeline, profundiza en el área que vas a modificar:

      <PromptBlock agent="ada">
        ```txt Find error handling patterns theme={null}
        Muéstrame cómo otros manejadores de webhooks en esta base de código gestionan los fallos.
        ¿Hay ya mecanismos de reintento o colas de mensajes muertos (dead letter queues) que debería
        reutilizar? Revisa src/webhooks/ y cualquier middleware compartido.
        ```
      </PromptBlock>

      <PromptBlock agent="ada">
        ```txt Check for related callers theme={null}
        Encuentra todos los puntos donde se llama a SubscriptionService; quiero asegurarme
        de que mi lógica de reintento no vaya a romper ninguna de las demás llamadas. Revisa también si hay
        un wrapper compartido de StripeClient con soporte de reintentos integrado.
        ```
      </PromptBlock>

      Sigue haciendo preguntas de seguimiento hasta que tengas el panorama completo. Ask Devin conserva el contexto de toda la conversación, de modo que cada pregunta se basa en las respuestas anteriores. También puedes pedirle a Devin que describa tu enfoque de implementación.
    </Step>

    <Step title="Inicia una sesión de programación directamente desde Ask Devin">
      Ahora ya sabes el archivo exacto que debes cambiar (`src/webhooks/stripe.ts`), la utilidad de reintentos existente que puedes reutilizar (`src/lib/retry.ts`) y la *dead letter queue* a la que otros controladores ya envían eventos (`src/queues/dlq.ts`).

      Pulsa **⌥ Opción + Enter** (o haz clic en el icono de la flecha) para iniciar una sesión de Devin directamente desde tu conversación de Ask Devin. Devin conserva todo lo que ha aprendido — el mapa de archivos, los patrones de manejo de errores, la utilidad de reintentos —, por lo que omite la fase de investigación y pasa directamente a la implementación. El **estado de la sesión será visible directamente en tu conversación de Ask Devin**, para que puedas supervisar el progreso sin cambiar de contexto.

      También puedes escribir una instrucción de implementación específica antes de pulsar ⌥ Enter para guiar lo que Devin implemente:

      <PromptBlock>
        ```txt Implement with full context theme={null}
        Add exponential backoff retry logic to the Stripe webhook handler at
        src/webhooks/stripe.ts. Reuse the existing RetryPolicy class from
        src/lib/retry.ts that other webhook handlers already use.

        If webhook processing fails, retry up to 3 times with backoff
        (1s, 4s, 16s). After all retries are exhausted, push the event to
        the existing SQS dead letter queue at src/queues/dlq.ts.

        Add tests covering the retry and DLQ scenarios.
        ```
      </PromptBlock>

      Como la sesión hereda el contexto de tu conversación de Ask, Devin produce un PR (pull request) más preciso con menos iteraciones. Este flujo de trabajo Ask-to-Agent es la forma más rápida de pasar de "no conozco esta base de código" a "aquí tienes un PR." Obtén más información en la [guía de Ask Devin](/es/work-with-devin/ask-devin).
    </Step>
  </Steps>
</div>
