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

# Direct Pay UI best practices

> Build a clear and trustworthy Direct Pay experience.

export const DirectPayBestPractices = () => {
  const checklistGroups = [{
    key: "allocation",
    number: "01",
    title: "Choose destinations",
    description: "Show the available loan amount, then lead with liabilities that can receive a payment.",
    items: [{
      title: "Show the loan amount and any allocation rule",
      description: <>
              Keep the approved amount visible while the user allocates it. If
              the lender requires a minimum Direct Pay share, show the
              percentage and dollar minimum. Omit the policy treatment when no
              rule applies.
            </>
    }, {
      title: "Check payment capability before selection",
      description: <>
              Check the Account <code>products</code> array. Make the account
              selectable when it contains <code>payment</code>. For an American
              Express Account with <code>payment</code> in{" "}
              <code>restricted_products</code>, launch Opal Account Verification
              and check the Account again. Keep accounts without payment
              capability in a collapsed group.
            </>,
      demo: "capability-check",
      apis: [{
        label: "Account products",
        href: "/reference/accounts/products/overview"
      }, {
        label: "Opal account verification",
        href: "/opal/account_verification/overview"
      }]
    }, {
      title: "Lead with active liabilities",
      description: <>
              Group selectable accounts by liability type. Within each group,
              put accounts with recent activity first and keep less likely
              destinations in a collapsed list.
            </>,
      apis: [{
        label: "Accounts",
        href: "/reference/accounts/overview"
      }, {
        label: "Account updates",
        href: "/reference/accounts/updates/overview"
      }]
    }, {
      title: "Make every liability recognizable",
      description: <>
              Show the product name, current balance, and last four digits when
              available. Use Card Brand art for credit cards and the Method
              Merchant logo for non-card liabilities. Keep the balance date
              inside the payment editor.
            </>,
      apis: [{
        label: "Retrieve an account",
        href: "/reference/accounts/retrieve"
      }, {
        label: "Card brands",
        href: "/reference/accounts/card-brands/overview"
      }, {
        label: "Retrieve a merchant",
        href: "/reference/merchants/retrieve"
      }, {
        label: "Account updates",
        href: "/reference/accounts/updates/overview"
      }]
    }, {
      title: "Collapse longer account groups",
      description: <>
              Lead with the most likely destinations, then keep additional
              eligible accounts in a collapsed group. Expanded accounts must
              keep the same add action. Label joint or authorized-user accounts
              when needed. Read <code>usage_pattern</code> to identify cards
              without recent activity. When the value is <code>dormant</code>,
              keep the card in the secondary group.
            </>,
      demo: "other-accounts",
      apis: [{
        label: "Account attributes",
        href: "/reference/accounts/attributes/overview"
      }, {
        label: "Account updates",
        href: "/reference/accounts/updates/overview"
      }]
    }, {
      title: "Separate accounts that cannot be paid",
      description: <>
              Put closed and payment-unsupported accounts in a separate
              collapsed group. State the exact reason that an account cannot
              receive funds. A zero balance is a warning state, not proof that
              the account is unavailable.
            </>,
      demo: "unavailable-accounts",
      apis: [{
        label: "Account lifecycle",
        href: "/guides/accounts/lifecycle"
      }, {
        label: "Account products",
        href: "/reference/accounts/products/overview"
      }, {
        label: "Account updates",
        href: "/reference/accounts/updates/overview"
      }]
    }]
  }, {
    key: "account",
    number: "02",
    title: "Make a payment",
    description: "Open one focused editor for the selected destination, amount, and payment timing.",
    items: [{
      title: "Keep the loan context behind the editor",
      description: <>
              Preserve the loan total, remaining amount, and list position. The
              payment editor is a detail view of the allocation, not a separate
              flow.
            </>
    }, {
      title: "Repeat useful account identity",
      description: <>
              Repeat the product name, card art or brand, and last four digits.
              Show “Authorized user” or “Joint” only when it applies; do not
              label a default individual account.
            </>,
      apis: [{
        label: "Retrieve an account",
        href: "/reference/accounts/retrieve"
      }]
    }, {
      title: "Show the balance date and amount choices",
      description: <>
              Label the value as “Balance as of [date].” Offer the full balance
              or a custom amount and keep the minimum payment amount explicit.
            </>,
      apis: [{
        label: "Create an account update",
        href: "/reference/accounts/updates/create"
      }]
    }, {
      title: "Warn when an amount exceeds the balance",
      description: <>
              Compare the custom amount with the latest balance. State the
              excess and require an explicit confirmation before the user can
              save it.
            </>,
      demo: "payment-warning",
      apis: [{
        label: "Create a payment",
        href: "/reference/payments/create"
      }, {
        label: "Account balances",
        href: "/reference/accounts/balances/overview"
      }]
    }, {
      title: "Warn on payments to accounts with no balance",
      description: <>
              Warn that a payment to an account with a $0 balance can fail at
              the creditor or create a credit. Let the user confirm and continue
              when the program permits it.
            </>,
      demo: "zero-payment",
      apis: [{
        label: "Create a payment",
        href: "/reference/payments/create"
      }, {
        label: "Create an account update",
        href: "/reference/accounts/updates/create"
      }]
    }, {
      title: "Keep balances current with Update subscriptions",
      description: <>
              Enroll eligible accounts in the <code>update</code> subscription.
              Process the <code>update.create</code> and{" "}
              <code>update.update</code> webhook events. Use the latest
              completed Update and its <code>data_as_of</code> value in the
              payment editor.
            </>,
      apis: [{
        label: "Update subscriptions",
        href: "/guides/updates/subscriptions"
      }, {
        label: "Webhooks",
        href: "/reference/webhooks/overview"
      }]
    }, {
      title: "Preview posting timing before saving",
      description: <>
              Create a dry-run payment for the selected amount. Show the
              estimated posting date before the user saves the allocation.
            </>,
      apis: [{
        label: "Create a payment",
        href: "/reference/payments/create"
      }, {
        label: "Payment fields",
        href: "/reference/payments/overview"
      }]
    }, {
      title: "Compare the posting estimate with the due date",
      description: <>
              Put the estimated posting date next to the account due date. Warn
              when the payment may post after the due date so the user can
              choose another amount or payment option.
            </>,
      apis: [{
        label: "Account updates",
        href: "/reference/accounts/updates/overview"
      }, {
        label: "Payment fields",
        href: "/reference/payments/overview"
      }]
    }]
  }, {
    key: "review",
    number: "03",
    title: "Review and submit",
    description: "Reconcile the loan and show the expected posting date for every destination.",
    items: [{
      title: "Reconcile the full loan in one list",
      description: <>
              Show creditor payments and cash to the borrower together. The
              destination amounts must add up to the approved loan amount, and
              any lender minimum must be met before submission.
            </>,
      apis: [{
        label: "Balance Transfer sessions",
        href: "/reference/elements/sessions/overview"
      }]
    }, {
      title: "Run a payment dry run",
      description: <>
              Immediately before submission, create a dry-run Payment for every
              creditor. Confirm payability and show the expected posting date.
              Refresh all dry runs when a destination or amount changes.
            </>,
      apis: [{
        label: "Create a payment",
        href: "/reference/payments/create"
      }, {
        label: "Payment delivery",
        href: "/reference/payments/overview"
      }]
    }]
  }, {
    key: "receipt",
    number: "04",
    title: "Confirm and track",
    description: "Keep every creditor payment and the borrower deposit in one receipt.",
    items: [{
      title: "Show every destination in one receipt",
      description: <>
              Put creditor payments and cash to the borrower in one list. Repeat
              the destination, last four digits, amount, and expected date for
              each row. Show the delivery method only when it changes what the
              borrower should expect, such as a paper check.
            </>
    }, {
      title: "Call out paper-check delivery",
      description: <>
              Make a paper check explicit because its timing and status differ
              from electronic delivery. Continue to show its expected date and
              later whether the check was cashed.
            </>,
      apis: [{
        label: "Payment delivery",
        href: "/reference/payments/overview"
      }]
    }, {
      title: "Track the same details after submission",
      description: <>
              Keep the receipt consistent with payment status updates. Send the
              same details by email and update the product when a payment posts,
              a check is cashed, or a payment is returned.
            </>,
      apis: [{
        label: "Payment lifecycle",
        href: "/guides/payments/overview"
      }, {
        label: "Payment webhooks",
        href: "/reference/webhooks/overview"
      }]
    }]
  }];
  const renderCard = (variant = "sapphire", stateClass = "") => {
    const cardLabels = {
      sapphire: "Chase Sapphire Reserve card",
      united: "United Explorer card",
      "credit-one": "Credit One Bank Platinum Visa card"
    };
    return <span className={`dp-ui-card dp-ui-card-${variant} ${stateClass}`} role="img" aria-label={cardLabels[variant]} />;
  };
  const renderLoanSummary = (state = "progress") => <div className={`dp-ui-loan-summary is-${state}`}>
      <div className="dp-ui-loan-summary-top">
        <span>
          <small>Loan proceeds</small>
          <strong>$10,000.00</strong>
        </span>
        <span className="dp-ui-remaining">
          <small>
            {state === "complete" ? "Unallocated" : "Left to allocate"}
          </small>
          <strong>{state === "complete" ? "$0.00" : "$6,800.00"}</strong>
        </span>
      </div>
      <div className="dp-ui-allocation-meter" aria-hidden="true">
        <span className="dp-ui-meter-direct" />
        {state === "complete" ? <span className="dp-ui-meter-cash" /> : null}
      </div>
      <div className="dp-ui-allocation-legend">
        <span>
          <i className="is-direct" />
          Direct Pay {state === "complete" ? "$8,400" : "$3,200"}
        </span>
        <span>
          <i className="is-remaining" />
          {state === "complete" ? "Cash $1,600" : "Remaining $6,800"}
        </span>
      </div>
    </div>;
  const renderScreen = screenKey => {
    if (screenKey === "allocation") {
      return <div className="dp-product dp-product-allocation" aria-label="Example loan allocation interface">
          <div className="dp-ui-progress">
            <span>Choose destinations</span>
            <span>1 of 4</span>
          </div>
          <div className="dp-ui-heading">
            <strong>Choose debts to pay</strong>
            <span>Decide how to use your approved loan.</span>
          </div>
          {renderLoanSummary()}
          <div className="dp-ui-requirement is-pending">
            <span>80%</span>
            <div>
              <strong>$8,000 must go to creditors</strong>
              <small>$4,800 more is required for this loan.</small>
            </div>
          </div>
          <div className="dp-ui-group-label">
            <span>Credit cards</span>
          </div>
          <div className="dp-ui-account-list">
            <div className="dp-ui-account is-selected">
              {renderCard()}
              <span className="dp-ui-account-name">
                <strong>Chase Sapphire Reserve</strong>
                <small>•••• 4412 | Balance: $5,240</small>
              </span>
              <span className="dp-ui-allocation-action is-amount">
                <strong>$3,200.00</strong>
                <small>allocated</small>
              </span>
            </div>
            <div className="dp-ui-account">
              {renderCard("united")}
              <span className="dp-ui-account-name">
                <strong>United Explorer</strong>
                <small>•••• 3560 | Balance: $2,875</small>
              </span>
              <span className="dp-ui-allocation-action" aria-label="Add account">
                +
              </span>
            </div>
          </div>
          <div className="dp-ui-other-accounts">
            <div className="dp-ui-other-trigger">
              <span>
                <strong>More credit cards</strong>
                <small>3 available</small>
              </span>
              <span className="dp-ui-chevron">⌄</span>
            </div>
            <div className="dp-ui-other-details">
              <div className="dp-ui-other-account">
                {renderCard("credit-one")}
                <span>
                  <span className="dp-ui-other-name">
                    <strong>Credit One Platinum</strong>
                    <em>Dormant</em>
                  </span>
                  <small>•••• 9902 | Balance: $0</small>
                </span>
                <span className="dp-ui-allocation-action">+</span>
              </div>
              <div className="dp-ui-other-account">
                <span className="dp-ui-issuer-logo dp-ui-issuer-logo-amex" role="img" aria-label="American Express logo" />
                <span>
                  <span className="dp-ui-other-name">
                    <strong>American Express Platinum</strong>
                    <em>Authorized user</em>
                  </span>
                  <small>Balance: $680</small>
                </span>
                <span className="dp-ui-allocation-action">+</span>
              </div>
              <div className="dp-ui-other-account">
                <span className="dp-ui-issuer-mark is-discover">D</span>
                <span>
                  <span className="dp-ui-other-name">
                    <strong>Discover it</strong>
                    <em>Joint</em>
                  </span>
                  <small>•••• 7741 | Balance: $1,240</small>
                </span>
                <span className="dp-ui-allocation-action">+</span>
              </div>
            </div>
          </div>
          <div className="dp-ui-group-label dp-ui-installment-label">
            <span>Installment loans</span>
          </div>
          <div className="dp-ui-account-list dp-ui-installment-list">
            <div className="dp-ui-account">
              <span className="dp-ui-loan-mark dp-ui-loan-mark-truist" role="img" aria-label="Truist Bank logo" />
              <span className="dp-ui-account-name">
                <strong>Truist Personal Loan</strong>
                <small>•••• 2214 | Balance: $4,180</small>
              </span>
              <span className="dp-ui-allocation-action" aria-label="Add account">
                +
              </span>
            </div>
          </div>
          <div className="dp-ui-unavailable-accounts">
            <div className="dp-ui-unavailable-trigger">
              <span>
                <strong>Accounts that need attention</strong>
                <small>2 accounts</small>
              </span>
              <span className="dp-ui-unavailable-chevron">⌄</span>
            </div>
            <div className="dp-ui-unavailable-details">
              <div className="dp-ui-unavailable-account is-verification">
                <span className="dp-ui-issuer-logo dp-ui-issuer-logo-amex" role="img" aria-label="American Express logo" />
                <span>
                  <strong>American Express Blue Cash</strong>
                  <small>Verify with Opal to enable payments</small>
                </span>
                <span className="dp-ui-verify-action">Verify</span>
              </div>
              <div className="dp-ui-unavailable-account">
                <span className="dp-ui-loan-mark dp-ui-loan-mark-capital-one" role="img" aria-label="Capital One Auto Loan logo" />
                <span>
                  <strong>Capital One Auto Loan</strong>
                  <small>•••• 8834 | Account closed</small>
                </span>
              </div>
            </div>
          </div>
          <div className="dp-ui-primary is-disabled">Review allocation</div>
        </div>;
    }
    if (screenKey === "account") {
      return <div className="dp-product dp-product-account" aria-label="Example account payment modal">
          <div className="dp-ui-modal-context">
            <div className="dp-ui-progress">
              <span>Choose destinations</span>
              <span>$6,800 left</span>
            </div>
            <div className="dp-ui-heading">
              <strong>Choose debts to pay</strong>
            </div>
            {renderLoanSummary()}
            <div className="dp-ui-account-list">
              <div className="dp-ui-account">{renderCard()}</div>
              <div className="dp-ui-account">{renderCard("united")}</div>
            </div>
          </div>
          <div className="dp-ui-modal-backdrop" />
          <div className="dp-ui-payment-modal">
            <div className="dp-ui-modal-header">
              <span>Make a payment</span>
              <span aria-hidden="true">×</span>
            </div>
            <div className="dp-ui-modal-account">
              {renderCard("sapphire", "dp-ui-modal-account-default")}
              <span className="dp-ui-account-name dp-ui-modal-account-default">
                <strong>Chase Sapphire Reserve</strong>
                <small>Visa •••• 4412</small>
              </span>
              {renderCard("credit-one", "dp-ui-modal-account-zero")}
              <span className="dp-ui-account-name dp-ui-modal-account-zero">
                <strong>Credit One Platinum</strong>
                <small>Visa •••• 9902 · Dormant</small>
              </span>
            </div>
            <div className="dp-ui-payment-fact">
              <span className="dp-ui-balance-date-default">
                Balance as of Aug 22
              </span>
              <strong className="dp-ui-balance-value-default">$5,240.00</strong>
              <strong className="dp-ui-balance-value-zero">$0.00</strong>
            </div>
            <div className="dp-ui-field-label">Amount to send</div>
            <div className="dp-ui-choice">
              <span className="dp-ui-radio" />
              <span>
                <strong>Pay full balance</strong>
              </span>
              <b className="dp-ui-full-balance-default">$5,240</b>
              <b className="dp-ui-full-balance-zero">$0</b>
            </div>
            <div className="dp-ui-choice is-selected">
              <span className="dp-ui-radio is-checked" />
              <span>
                <strong>Custom amount</strong>
                <small>Minimum $500</small>
              </span>
            </div>
            <div className="dp-ui-money-input">
              <span>$</span>
              <strong className="dp-ui-amount-default">3,200.00</strong>
              <strong className="dp-ui-amount-warning">5,565.00</strong>
              <strong className="dp-ui-amount-zero">500.00</strong>
            </div>
            <div className="dp-ui-payment-alert is-overpayment">
              <span aria-hidden="true">!</span>
              <div>
                <strong>Amount is above the balance</strong>
                <small>
                  This is $325 above the Aug 22 balance and could create a
                  credit. Confirm or enter $5,240.
                </small>
              </div>
            </div>
            <div className="dp-ui-payment-alert is-zero">
              <span aria-hidden="true">!</span>
              <div>
                <strong>This account has no balance</strong>
                <small>
                  A payment could fail at the creditor or create a credit.
                  Confirm the balance before you continue.
                </small>
              </div>
            </div>
            <div className="dp-ui-payment-fact is-posting">
              <span>Expected to post by</span>
              <strong>Aug 27</strong>
            </div>
            <div className="dp-ui-due-warning">
              <span aria-hidden="true">!</span>
              <div>
                <strong>May post after the due date</strong>
                <small>Payment due Aug 26</small>
              </div>
            </div>
            <div className="dp-ui-primary">
              <span className="dp-ui-primary-default">
                Save account payment
              </span>
              <span className="dp-ui-primary-overpayment">
                Confirm $5,565 payment
              </span>
              <span className="dp-ui-primary-zero">Confirm $500 payment</span>
            </div>
          </div>
        </div>;
    }
    if (screenKey === "review") {
      return <div className="dp-product dp-product-review" aria-label="Example allocation review interface">
          <div className="dp-ui-progress">
            <span>Review and submit</span>
            <span>3 of 4</span>
          </div>
          <div className="dp-ui-heading">
            <strong>Review your loan</strong>
            <span>Payment previews updated just now.</span>
          </div>
          {renderLoanSummary("complete")}
          <div className="dp-ui-review-list">
            <div className="dp-ui-review-row">
              {renderCard()}
              <span>
                <strong>Chase Sapphire Reserve</strong>
                <small>•••• 4412 · Posts Aug 27</small>
              </span>
              <b>$5,240.00</b>
            </div>
            <div className="dp-ui-review-row">
              {renderCard("united")}
              <span>
                <strong>United Explorer</strong>
                <small>•••• 3560 · Posts Aug 31</small>
              </span>
              <b>$3,160.00</b>
            </div>
            <div className="dp-ui-review-row is-cash">
              <span className="dp-ui-bank-mark">$</span>
              <span>
                <strong>Cash to your bank</strong>
                <small>Checking •••• 9081 · Deposits Aug 26</small>
              </span>
              <b>$1,600.00</b>
            </div>
          </div>
          <div className="dp-ui-total-row">
            <span>Total allocated</span>
            <strong>$10,000.00</strong>
          </div>
          <div className="dp-ui-primary">Submit allocation</div>
        </div>;
    }
    return <div className="dp-product dp-product-receipt" aria-label="Example payment confirmation interface">
        <div className="dp-ui-progress">
          <span>Confirm and track</span>
          <span>4 of 4</span>
        </div>
        <div className="dp-ui-success">✓</div>
        <div className="dp-ui-heading">
          <strong>Your loan is on its way</strong>
          <span>$10,000 allocated Tuesday, August 25</span>
        </div>
        <div className="dp-ui-receipts">
          <div className="dp-ui-receipt">
            {renderCard()}
            <span className="dp-ui-account-name">
              <strong>Chase Sapphire Reserve</strong>
              <small>•••• 4412</small>
              <em>Posts by Thu, Aug 27</em>
            </span>
            <b>$5,240.00</b>
          </div>
          <div className="dp-ui-receipt">
            {renderCard("united")}
            <span className="dp-ui-account-name">
              <strong>United Explorer</strong>
              <small>•••• 3560</small>
              <em>Paper check · Expected Mon, Aug 31</em>
            </span>
            <b>$3,160.00</b>
          </div>
          <div className="dp-ui-receipt is-cash">
            <span className="dp-ui-bank-mark">$</span>
            <span className="dp-ui-account-name">
              <strong>Cash to your bank</strong>
              <small>Checking •••• 9081</small>
              <em>Expected Wed, Aug 26</em>
            </span>
            <b>$1,600.00</b>
          </div>
        </div>
        <div className="dp-ui-email">
          <span>↗</span>
          <div>
            <strong>Receipt sent</strong>
            <small>Payment details and posting dates are in your inbox.</small>
          </div>
        </div>
        <div className="dp-ui-primary">Done</div>
      </div>;
  };
  const setDetailState = (root, detailState = "") => {
    if (root == null) return;
    root.dataset.detailState = detailState;
  };
  const activateStep = (root, stepKey) => {
    if (root == null || root.dataset.activeStep === stepKey) return;
    root.dataset.activeStep = stepKey;
    root.querySelectorAll(".dp-story-screen").forEach(screen => {
      screen.setAttribute("aria-hidden", screen.dataset.screen === stepKey ? "false" : "true");
    });
    const label = root.querySelector("[data-story-active-label]");
    const activeSection = root.querySelector(`[data-step="${stepKey}"]`);
    if (label && activeSection) {
      label.textContent = activeSection.dataset.label;
    }
  };
  const observeStory = node => {
    if (node == null || node.dataset.observerReady === "true") return;
    node.dataset.observerReady = "true";
    if (window.IntersectionObserver === undefined) return;
    const sections = Array.from(node.querySelectorAll(".dp-story-step"));
    const updateActiveStep = () => {
      const focusLine = window.innerHeight * 0.38;
      const focusedSection = sections.find(section => {
        const bounds = section.getBoundingClientRect();
        return bounds.top <= focusLine && bounds.bottom >= focusLine;
      });
      const nearest = focusedSection || sections.map(section => ({
        section,
        distance: Math.abs(section.getBoundingClientRect().top - focusLine)
      })).sort((a, b) => a.distance - b.distance)[0].section;
      if (nearest) {
        activateStep(node, nearest.dataset.step);
      }
    };
    const observer = new IntersectionObserver(updateActiveStep, {
      rootMargin: "-18% 0px -42% 0px",
      threshold: [0, 0.2, 0.5]
    });
    sections.forEach(section => observer.observe(section));
    updateActiveStep();
  };
  return <div className="dp-story" data-active-step="allocation" data-detail-state="" ref={observeStory}>
      <div className="dp-story-layout">
        <div className="dp-story-copy">
          {checklistGroups.map(group => {
    const headingId = `direct-pay-${group.number}`;
    return <section className="dp-story-step" aria-labelledby={headingId} data-label={group.title} data-step={group.key} key={group.number} onClick={event => activateStep(event.currentTarget.closest(".dp-story"), group.key)} onFocus={event => activateStep(event.currentTarget.closest(".dp-story"), group.key)}>
                <header className="dp-story-heading">
                  <span aria-hidden="true">{group.number}</span>
                  <div>
                    <h3 id={headingId}>{group.title}</h3>
                    <p>{group.description}</p>
                  </div>
                </header>

                <div className="dp-story-mobile-preview" aria-hidden="true">
                  {renderScreen(group.key)}
                </div>

                <div className="dp-story-items">
                  {group.items.map(item => <div className="dp-story-item" data-demo={item.demo || ""} key={item.title} onMouseEnter={event => setDetailState(event.currentTarget.closest(".dp-story"), item.demo || "")} onMouseLeave={event => setDetailState(event.currentTarget.closest(".dp-story"))} onClick={event => {
      if (event.target.closest("a")) return;
      const checkbox = event.currentTarget.querySelector('input[type="checkbox"]');
      if (checkbox && event.target !== checkbox) {
        checkbox.checked = !checkbox.checked;
      }
      setDetailState(event.currentTarget.closest(".dp-story"), item.demo || "");
    }}>
                      <input type="checkbox" aria-label={item.title} />
                      <span className="dp-story-item-copy">
                        <strong>{item.title}</strong>
                        <span>{item.description}</span>
                        {item.apis ? <span className="dp-story-api-links" aria-label="Related API documentation">
                            <small>API</small>
                            {item.apis.map(api => <a href={api.href} key={api.href}>
                                {api.label}
                              </a>)}
                          </span> : null}
                      </span>
                    </div>)}
                </div>
              </section>;
  })}
        </div>

        <aside className="dp-story-stage" aria-hidden="true">
          <div className="dp-story-stage-label">
            <span>Reference UI</span>
            <span data-story-active-label>Choose destinations</span>
          </div>
          <div className="dp-story-canvas">
            {checklistGroups.map(group => <div className="dp-story-screen" data-screen={group.key} aria-hidden={group.key === "allocation" ? "false" : "true"} key={group.key}>
                {renderScreen(group.key)}
              </div>)}
          </div>
        </aside>
      </div>
    </div>;
};

Use this checklist to make Direct Pay clear from destination selection through payment tracking. The reference flow prioritizes eligible liabilities, keeps optional lender rules in context, previews delivery before submission, and puts every destination in one receipt.

## Integration checklist

<DirectPayBestPractices />

## See also

* [Payments overview](/guides/payments/overview)
* [Account lifecycle and product eligibility](/guides/accounts/lifecycle)
* [Balance freshness and Updates](/guides/updates/overview)
* [Create a payment](/reference/payments/create)
* [Balance Transfer session fields](/reference/elements/sessions/overview)
