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

# Expenses and invoices

> Get the AP inbox and expense questions out of email: vendor invoices as tracked tickets, policy questions answered by the agent, and a payment run that is a view rather than a spreadsheet.

export const Checkbox = ({items = []}) => {
  const [checked, setChecked] = useState(Array(items.length).fill(false));
  const toggle = index => {
    setChecked(prev => {
      const copy = [...prev];
      copy[index] = !copy[index];
      return copy;
    });
  };
  return <div className="custom-checkbox-list">
      {items.map((text, index) => <div key={index} className="custom-checkbox-item flex items-center mb-2">
          <input type="checkbox" checked={checked[index]} onChange={() => toggle(index)} className="mr-2" />
          <span>{text}</span>
        </div>)}
    </div>;
};

Accounts payable runs on a shared inbox, which means the state of an invoice lives in whether someone has read the email. Expense questions run on DMs to whoever answered last time. Both are fixable without changing how anyone outside Finance behaves.

<Info icon="list-check">
  **Prerequisites:** a Finance workspace with a channel, and the [email support](/guides/playbooks/email-support) playbook if you want vendors to keep using the address they already have.
</Info>

## What good looks like

<Checkbox
  items={[
"Vendors email the same address they always have, and each invoice becomes a ticket",
"Employees get expense policy answers from the agent instead of waiting for Finance",
"The payment run is a saved view, and nothing in it is a surprise",
"An invoice waiting on an internal approval is visibly waiting, not silently ignored"
]}
/>

<Steps>
  <Step title="Point the AP inbox at the channel">
    Every channel has an inbound email address. Forward `ap@` or `invoices@` to it and vendor email arrives as tickets, with attachments intact, without asking a single supplier to change anything.

    Two details that matter:

    * **Set the outbound sender** so replies come from your AP address rather than a Ravenna one. Vendors filter on the address they know.
    * **Vendors become guest requesters.** They can see their own ticket and nothing else. That is the behavior you want, and it means you do not need to think about their access.

    <Callout icon="link" color="#6B7280">Learn more in [email support](/guides/playbooks/email-support)</Callout>
  </Step>

  <Step title="Separate the two kinds of work with categories, not channels">
    The Finance desk handles two flows that look nothing alike:

    | Category | Comes from                      | Looks like                                          |
    | -------- | ------------------------------- | --------------------------------------------------- |
    | Invoice  | Email, from vendors             | An attachment, a due date, and an internal approval |
    | Expense  | Slack or Portal, from employees | A question about policy, or a reimbursement chase   |

    One channel, two categories. Splitting them into separate channels means the invoice one goes unwatched during a busy month.

    <Callout icon="link" color="#6B7280">Learn more about [choosing between channels, views, and categories](/guides/best-practices/channels-views-categories)</Callout>
  </Step>

  <Step title="Let the agent take the policy questions">
    This is where the volume is. "Can I expense this", "what is the per diem", "which card do I use", "when do reimbursements land" are all answerable from documents, and they are the requests Finance least wants to answer individually.

    Index the expense policy, the travel policy, the card policy, and the payment calendar as text. A scanned PDF of the policy is invisible to the agent, which is the single most common reason a Finance agent underperforms.

    Then set the boundary explicitly:

    <Prompt description="Answer expense and travel policy questions from the knowledge base and quote the relevant rule. Never approve an expense, confirm that something will be reimbursed, or give a figure that is not in the policy. If the answer is not documented, create a ticket for the Finance team.">
      Answer expense and travel policy questions from the knowledge base and quote the relevant rule. Never approve an expense, confirm that something will be reimbursed, or give a figure that is not in the policy. If the answer is not documented, create a ticket for the Finance team.
    </Prompt>

    <Callout icon="link" color="#6B7280">Learn more in [structuring knowledge for AI](/guides/best-practices/knowledge-for-ai)</Callout>
  </Step>

  <Step title="Track invoice state with statuses you already use">
    Resist a custom status per accounting step. Three states cover the invoice lifecycle:

    * **Open**, needs a human to look at it
    * **A pause status** for invoices waiting on an internal approver or a PO match, so the SLA clock stops
    * **Resolved** when scheduled for payment

    Put the payment date on the ticket as a due date rather than in a status name. That way it is filterable and it shows up in a view.

    <Callout icon="link" color="#6B7280">Learn more about [statuses](/documentation/tickets/organize/statuses) and [due dates](/documentation/tickets/due-dates)</Callout>
  </Step>

  <Step title="Make the payment run a view">
    One saved view: category is Invoice, status is not resolved, due date is within the next 14 days, sorted by due date. That is the payment run, and it is current every time someone opens it.

    Add a second view for invoices in the pause status for more than five days. That is your list of things quietly waiting on someone internal.

    <Callout icon="link" color="#6B7280">Learn more about [views](/documentation/tickets/organize/views)</Callout>
  </Step>

  <Step title="Automate the chasing, not the paying">
    Two workflows earn their place:

    * **Invoice received.** Trigger on a ticket created through the email channel, set the category to Invoice, and apply the purchase approval template if the amount is above your threshold.
    * **Due soon and unapproved.** Trigger on a due date approaching, and post to the triage channel if the approval is still pending.

    Leave the payment itself alone. If you want to push an approved invoice into your accounting system, build that with [Foundry](/guides/how-to/foundry/overview) once the process above is reliable.
  </Step>
</Steps>

## Where teams get this wrong

<AccordionGroup>
  <Accordion title="Asking vendors to use a new address">
    They will not. Forward the old one.
  </Accordion>

  <Accordion title="Forgetting the outbound sender">
    Replies from an unfamiliar domain get filtered, and then the vendor emails again.
  </Accordion>

  <Accordion title="A status per accounting step">
    Twelve statuses is a taxonomy, not a workflow. Use fields and views.
  </Accordion>

  <Accordion title="Policy documents as scans">
    The agent cannot read an image. This is the whole ballgame for expense questions.
  </Accordion>

  <Accordion title="Duplicate invoices">
    The same invoice arrives twice from two contacts more often than you would think. Merge the tickets rather than closing one.
  </Accordion>
</AccordionGroup>

<Callout icon="link" color="#6B7280">Learn more about [merging tickets](/documentation/tickets/merge-tickets)</Callout>

## Next

<CardGroup cols={2}>
  <Card title="Purchase approvals" icon="receipt" href="/guides/playbooks/finance/purchase-approvals" horizontal>
    Where the invoice approval path comes from.
  </Card>

  <Card title="Email support" icon="mail" href="/guides/playbooks/email-support" horizontal>
    The full email channel setup.
  </Card>
</CardGroup>


## Related topics

- [Finance](/guides/playbooks/finance/overview.md)
- [Purchase approvals](/guides/playbooks/finance/purchase-approvals.md)
- [Guides](/guides/overview.md)
- [Playbooks](/guides/playbooks/overview.md)
- [Employee offboarding](/guides/playbooks/hr/employee-offboarding.md)
