> ## 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.

# Review Plans and Approvals

> Exactly what Ari does freely, what waits for your sign-off, and how to review like a manager.

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

export const AriMessage = ({children, time = "2:47 PM"}) => <div className="slack-msg not-prose">
    <div className="slack-avatar" style={{
  backgroundColor: "transparent"
}}>
      <img src="/logo/ari/ledgerup-favicon.svg" alt="Ari" />
    </div>
    <div className="slack-msg-body">
      <span className="slack-name">Ari</span>
      <span className="slack-app-badge">APP</span>
      <span className="slack-time">{time}</span>
      <div className="slack-text">{children}</div>
    </div>
  </div>;

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

Ari operates on an **approval-first model**: he never changes data or contacts a customer
without a human clicking **Approve**. This page is the precise reference for what runs
freely, what waits for you, and how to make the review step count.

## The line, precisely

| Ari does this freely                               | Ari waits for your approval                    |
| -------------------------------------------------- | ---------------------------------------------- |
| Answer questions and look up records               | Send any email or message to a customer        |
| Run read-only queries ("show me overdue invoices") | Create, finalize, or void invoices             |
| Generate reports, summaries, and exports           | Create, update, pause, or cancel subscriptions |
| Analyze trends, cohorts, and metrics               | Refund charges                                 |
| Check reconciliation and payment status            | Create or update customer records              |
| Extract and summarize contract terms               | Match a payment to an invoice manually         |
| List your reminders, tasks, and prompts            | Create tasks or change a task's execution mode |

The rule of thumb: **reading is free, writing waits.** If an action would change a record
in any connected system or put anything in front of a customer, it goes through approval.

## One inbox for everything to review

Every item waiting on a human queues in your **unified inbox**: invoices ready to send,
billing emails and support tickets to handle, contracts to approve for revenue
recognition. It's a single review surface across all your connected systems, so approvals
never sit unnoticed in one tool while you're working in another. You can act on any item
from the inbox or from the Slack thread where the work started; they stay in sync.

## How an approval works

<Steps>
  <Step title="Ari analyzes your request">
    You ask for an action ("send a payment reminder to Acme Corp"), and Ari works out
    what that requires across your connected systems.
  </Step>

  <Step title="Ari posts a plan, not a result">
    You get the full plan in Slack before anything happens: what will be done, who is
    affected, and the expected outcome. For an email, that means the actual recipient,
    subject, and body text.
  </Step>

  <Step title="You decide">
    **Approve** executes the plan as shown. **Modify** asks Ari to adjust it, which is
    faster than rejecting and re-asking because he keeps the context. **Reject**
    cancels; nothing happens.
  </Step>

  <Step title="Ari executes and confirms">
    On approval, Ari acts across your systems and posts a confirmation with the result
    in the same thread.
  </Step>
</Steps>

<SlackMessage><AriMention /> send a payment reminder to Acme Corp for invoice INV-001</SlackMessage>

<AriMessage time="2:48 PM">
  Here's my plan:
  <br />• Send email reminder to [accounting@acmecorp.com](mailto:accounting@acmecorp.com)
  <br />• Reference invoice INV-001 ({"$"}15,000, 45 days overdue)
  <br />• Use your standard "friendly reminder" template
  <br />• Update the "reminded" flag in Stripe

  <br />

  <span className="slack-btn slack-btn-primary">Approve</span>
  <span className="slack-btn">Modify</span>
  <span className="slack-btn slack-btn-danger">Reject</span>
</AriMessage>

<Warning>
  Approval is the point of no return. Once you click **Approve**, the action executes and
  cannot be undone from Slack. The plan is your review checkpoint; spend the ten seconds
  it deserves.
</Warning>

## Review like a manager, not a rubber stamp

1. Check who will be contacted and what will change
2. Spot-check the numbers: is the balance right? the invoice ID?
3. Ask: does this match what I asked for?
4. Then approve

If anything is off, click **Modify** and tell Ari what to change. Take extra care on
batch reminders, large refunds, and bulk record updates: read the full recipient list.

## Extra guardrails on high-impact actions

For bulk operations, large refunds, and similar high-stakes requests, Ari asks additional
verification questions before he'll even present a plan. You can also raise the bar
yourself with a standing [instruction](/ari/work-together/instructions):

<SlackMessage><AriMention /> remember: for customers with ARR over {"$"}100K, always ask for my approval before sending collection emails.</SlackMessage>

## Automated tasks and approval

[Tasks](/ari/features/tasks), Ari's event-driven automations, run in one of two modes:

| Mode                  | Behavior                                             | Default for                                       |
| --------------------- | ---------------------------------------------------- | ------------------------------------------------- |
| **Approval required** | Ari posts the plan and waits, same as a live request | Anything that modifies data or contacts customers |
| **Auto-execute**      | Ari runs the action immediately when the event fires | Read-only actions: notifications, lookups         |

Graduate automations slowly. Every new task starts in approval mode; watch a few runs
and promote it to auto-execute only once the runs are boringly correct. Task chains
execute end-to-end, so review the whole chain before enabling auto-execute on any step.

## Every approval leaves a record

Who asked, who approved, what happened, and when: it's all logged in the thread and in
the LedgerUp platform's audit history, which covers everything that runs through
LedgerUp services. See [Activity history](/ari/manage/activity-history).
