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

# Reconciliations

> Ari matches payments to invoices automatically, with partials, overpayments, and multi-currency included, so month-end close stops being a spreadsheet project.

export const AriMention = () => <span className="slack-mention">@Ari</span>;

export const SlackMessage = ({children, name = "Bailey", initials = "B", color = "#611f69", avatar = "/images/bailey-avatar.png", app = false, time = "2:47 PM"}) => <div className="slack-msg not-prose">
    <div className="slack-avatar" style={{
  backgroundColor: avatar ? "transparent" : color
}}>
      {avatar ? <img src={avatar} alt={name} /> : initials}
    </div>
    <div className="slack-msg-body">
      <span className="slack-name">{name}</span>
      {app ? <span className="slack-app-badge">APP</span> : null}
      <span className="slack-time">{time}</span>
      <div className="slack-text">{children}</div>
    </div>
    <div className="slack-actions">
      <button type="button" className="slack-action-btn" aria-label="Copy message" title="Copy message" onClick={e => {
  const msg = e.currentTarget.closest(".slack-msg");
  const el = msg && msg.querySelector(".slack-text");
  if (el && navigator.clipboard) {
    navigator.clipboard.writeText(el.innerText);
    const btn = e.currentTarget;
    const prev = btn.innerHTML;
    btn.innerHTML = '<svg viewBox="0 0 24 24" fill="none" stroke="#2AD48A" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>';
    setTimeout(() => {
      btn.innerHTML = prev;
    }, 1200);
  }
}}>
        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
          <rect x="9" y="9" width="13" height="13" rx="2" ry="2" />
          <path d="M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1" />
        </svg>
      </button>
    </div>
  </div>;

Matching payments to invoices is the least glamorous job in AR and the one where errors
compound quietly. Ari does it continuously: every payment that lands in Stripe gets
matched against your invoices by customer, amount, date, and reference, and only the
genuinely ambiguous ones come to you.

## What Ari does here

<CardGroup cols={2}>
  <Card title="Reconciliation" icon="scale-balanced" href="/ari/features/reconciliation">
    Automatic multi-factor matching, manual matching for edge cases, unmatched-payment
    review, and dispute investigation.
  </Card>

  <Card title="Accounting sync" icon="calculator" href="/ari/integrations/quickbooks">
    Reconciled transactions line up with QuickBooks so your books and your billing
    system tell the same story.
  </Card>
</CardGroup>

## Try it

<SlackMessage><AriMention /> is invoice #INV-12345 paid?</SlackMessage>

<SlackMessage><AriMention /> show unmatched payments from the last 30 days</SlackMessage>

<SlackMessage><AriMention /> match the {"$"}5,000 payment from Acme Corp on February 15 to invoice #INV-12340</SlackMessage>

<SlackMessage><AriMention /> show the reconciliation summary for February</SlackMessage>

## How the automatic matching works

<Steps>
  <Step title="Payments arrive">
    Customers pay through Stripe; Ari picks up new activity as it syncs.
  </Step>

  <Step title="Ari matches">
    Each payment is matched against open invoices using customer, amount, date
    proximity, and any invoice reference in the payment memo. Partial payments are
    allocated; overpayments are flagged.
  </Step>

  <Step title="You review only the exceptions">
    High-confidence matches complete on their own. Ambiguous ones are flagged, and you
    resolve them in Slack with a one-line instruction.
  </Step>
</Steps>

## When a customer says "we already paid"

<Steps>
  <Step title="Search for the claimed payment">
    `@Ari search for a payment from Acme Corp around February 10 for about $5,000`
  </Step>

  <Step title="Get the verdict">
    Ari checks Stripe transaction history and reports what he finds: the payment, a
    near-match worth reviewing, or nothing.
  </Step>

  <Step title="Resolve it">
    Found it? Match it on the spot. Nothing there? You now have the facts for the
    customer conversation, with the search logged in the thread.
  </Step>
</Steps>

## Month-end close

Make the close routine with a recurring [Reminder](/ari/features/reminders), then work
the exceptions list:

<SlackMessage><AriMention /> remind me on the 1st of each month to reconcile payments</SlackMessage>

<SlackMessage><AriMention /> show all reconciliation items that need review</SlackMessage>

Reports export to CSV or PDF for your accounting team and auditors, and every
reconciliation action keeps an audit trail. `@Ari who matched this payment and when?`
answers itself. See [Activity history](/ari/manage/activity-history).

## Powered by

[Stripe](/ari/integrations/stripe) (payments and invoices) ·
[QuickBooks](/ari/integrations/quickbooks) (accounting records) ·
[Email](/ari/integrations/email) (payment confirmations and customer identity)
