---
title: Matching Transactions and Resolving Events
description: How real spending lines up with what you planned. The Match
  Transactions dialog, AI matching versus the manual fallback, when a tracked
  line closes itself, how account balances move, and how to undo a resolve or
  delete.
subtitle: How real spending lines up with what you planned.
sidebar:
  order: 30
  section: Day to day
canonical_html_url: https://eb.app/learn/matching-and-resolving/
---

# Matching Transactions and Resolving Events

Your plan and your bank account need to stay in sync. The app does this with two operations: *matching* a real bank transaction to the planned event it represents, and *resolving* the event so it leaves the planner and lands in History with your balance updated.

This page covers both, plus the in-between *Paid* state, how transactions move your account balance, the AI and non-AI ways to run a bulk match, and how to undo a resolve or delete from the History tab.

> **Most actions on this page are reversible.** Resolving creates a History row with an Undo button. Deleting an event creates one too. The only action that is not reversible is pruning a row from History itself.

---

## The three states of an event

Every row in the planner is in one of three states.

**Scheduled.** The event is on the planner waiting for its date. Your account balance is unchanged.

**Paid.** You have paid the bill in real life (autopay went out, you swiped a card, you wrote a check) but the bank has not shown the transaction yet. The toolbar's **Mark Event as Paid** button flags the event with a checkmark on the planner. Your balance does not move, because the bank has not moved its number either.

**Resolved.** The event is done. It has been moved off the planner and into the History tab, with your account balance updated. To reverse a Resolve, open the History tab and use Undo.

The Mark Event as Paid button is a toggle. Tapping it on a Paid event sets it back to Scheduled. Switching off the Paid checkmark does not create a History row, because it does not change your historical record; only resolves and deletes do.

> **Why a separate Paid state?** Without it, you would have a gap between paying a bill and the bank showing the transaction. Paid is the honest label for that gap. The alternative would move balance immediately on Mark Paid, which would push the app's number ahead of the bank for the day or two it takes the bank to catch up.

---

## Who can use Match

The toolbar's **Match** button has two visibility rules, depending on whether your budget is linked to a bank.

**On a budget with no bank link.** Owners always see the button. Editors see it too if they are on Premium. A free-plan editor sees the button greyed out and labelled **Requires premium or owner access**: they can read the planner and add transactions one at a time, but the bulk match flow needs Premium or owner access.

**On a Plaid-linked budget.** Owners always see the button. Anyone who is not on Premium does not see the button at all. Plaid-linked budgets are not designed to take file uploads, and the live sync that fills them is itself a Premium feature, so the bulk match path is hidden for non-Premium users on those budgets.

If you are the budget's owner, the Match button is enabled regardless of plan. If you are an editor and do not see the Match button on a particular budget, ask the budget's owner to run the match for you. See [Sharing a Budget](https://eb.app/learn/sharing.md) for more on roles.

<!-- SCREENSHOT: Planner toolbar on a non-Plaid budget with the user signed in as a free editor. The Match button shows in the toolbar with the disabled-state label "Requires premium or owner access" visible as a tooltip. The Add Item, Mark Event as Paid, Resolve item, Edit Event, and Delete Event buttons are visible alongside it. -->

---

## The three paths from Scheduled to Resolved

There are three ways an event becomes Resolved.

| Path | What triggers it | What happens to your balance |
|------|------------------|------------------------------|
| Bank transaction matches | You confirm matches in the **Match Transactions** dialog | Moves by the transaction amount when the transaction is recorded |
| Tracked-item resolve on its own | Transactions on the event reach or pass the planned amount | Already moved at each transaction; no extra move at resolve |
| Manual resolve | You tap **Resolve item**, or set Status to Resolved in the Edit Item Event dialog | Moves by the planned amount at the moment of resolve |

For tracked items (groceries, gas, dining), each transaction moves your balance the moment it is recorded and counts toward the event's running total. The event resolves on its own once the total reaches the planned amount, with no further action from you.

> **Why does balance move at the transaction, not at resolve?** The money already left your account. The bank moved it the moment you swiped the card. The app mirrors that immediately, without waiting for the budget period to close.

For cash payments, transfers between people, or anything else that has no bank transaction to match, select the event and tap **Resolve item**. If the event is a tracked item with no transactions yet, the **No Transactions Recorded** dialog asks first: **Add Transaction** to record what you actually spent, or **Resolve Anyway** to close at the planned amount. The same manual-resolve outcome is available from the Edit Item Event dialog: change the **Status** field to **Resolved** and save. The Status dropdown there reads `Scheduled`, `Paid/Spent`, and `Resolved`.

Mark Event as Paid is not a path to Resolved. It is a checkmark on the way to one of the three paths above.

---

## The Match Transactions dialog

The dialog opens when the planner toolbar's **Match** button is tapped, after a bank pull runs, or after a transaction file is uploaded. It is the home for the bulk-matching flow.

<!-- SCREENSHOT: Match Transactions dialog open on the input step. Header reads "Match Transactions". A segment selector at the top has two options: "Auto-Resolve Events" (selected) and "Compare Budget". An AI Mode toggle is below the segment, with the label "Bring Your Own AI (Free)" and the privacy hint "You are responsible for reviewing your AI provider's privacy policy". A file-upload area at the bottom prompts "Drop bank transaction files here" with the line "Accepts: Up to 3 CSV, TSV, or TXT files" and "Max 200KB per file". -->

The dialog runs in one of two modes. A segment at the top switches between them when both are available.

- **Auto-Resolve Events.** The matching mode. The app pairs new transactions with open events and brings up a review screen so you confirm what to commit.
- **Compare Budget.** A separate analysis that compares your actual spending against your plan. It does not produce matches; see [Comparing your spending](#comparing-your-spending) below.

### Choosing how the matching runs

Inside Auto-Resolve Events, an **AI Mode** toggle controls whether the app calls a Premium AI to do the matching for you, or generates a prompt you take to the AI of your choice.

- **Integrated AI (Premium).** The app sends your unmatched transactions and your relevant planner items to Google Gemini, gets the suggested matches back, and opens the review screen. The privacy hint reads "Your data is never sold or used for AI training." See [How AI works in this app](https://eb.app/learn/subscription.md#how-ai-works-in-this-app) on the Subscription page for what is and is not sent.
- **Bring Your Own AI (Free).** The app generates a prompt and shows it on a Prompt step inside the dialog. You paste it into ChatGPT, Claude, Gemini, or whatever AI tool you already trust, paste the response into the Paste step, and the app routes the matches to the same review screen. The privacy hint reads "You are responsible for reviewing your AI provider's privacy policy."

The toggle defaults to Integrated AI for Premium subscribers and to Bring Your Own AI for everyone else. You can flip it any time. If a free-plan user toggles to Integrated AI, the dialog inlines an upsell card that explains the upgrade; the matching is gated until they subscribe or flip the toggle back.

### Uploading transactions

If your budget is not linked to a bank, the input step is a drop area for transaction files. Drag a file in, or tap the area to choose one. The accepted formats are **CSV**, **TSV**, and **TXT**, up to **3 files** at once, **200 KB per file**. With Integrated AI on, the combined size of all files is capped at **600 KB**.

For each uploaded file, pick which of your accounts the transactions belong to using the dropdown next to the filename. Then tap **Next** to generate matches.

If the budget is linked to a bank, the input step shows a list of your linked accounts instead of the file picker. Tap **Connect Bank** to pull the most recent transactions from Plaid and feed them through the same matching flow. See [Bank Linking](https://eb.app/learn/bank-linking.md) for the connection setup.

---

## Reviewing the matches

After the app has computed candidate matches, an inner review screen titled **Review Transaction Matches** opens.

<!-- SCREENSHOT: Review Transaction Matches modal. The Match Summary card at the top has "All" and "None" buttons on the right, and a one-line subtitle reading "0 selected". Two account cards expanded below. The first card header shows "Chase Checking" with "Current Balance: $2,847.13". A tracking-item group inside is expanded, showing a progress bar at 70% with the running total below; below it, two non-tracking match rows with checkboxes. A footer button reads "Resolve 0 Selected Matches" in disabled state. -->

The screen groups matches by account. For each account, you see:

- The **Current Balance**, and once you have selected at least one match, a **Projected Balance** preview that reflects the change.
- A list of suggested matches grouped by tracking item where applicable, plus account-level **All** and **None** buttons to toggle every match in the account at once.
- For tracking-item groups, a progress bar showing how the selected transactions compare to the budgeted amount. A green **Will Resolve** tag appears next to the progress bar when the selection brings the running total to or past the planned amount.

> **Why this default? The review opens with nothing selected.** The matching engine is good but not perfect: a $43 grocery transaction and a $43 transfer to a friend look identical to it. Starting with everything unchecked makes you confirm each row deliberately, instead of skimming a screen of pre-checked matches and missing a wrong one. Tap **All** at the top of the Match Summary card to select everything in one go after you have looked, or tap individual rows to commit only what you trust.

When the selection is what you want, tap **Resolve N Selected Matches** at the bottom. The whole batch commits together: every selected transaction is recorded, balances move, and every event whose running total now meets its planned amount resolves into History. The modal stays open after a batch with the remaining matches still visible, so you can run a second pass without reopening the dialog. The Match Summary line tracks the running total: "X of Y transactions resolved · Z events resolved · N selected."

If something goes wrong (network blip, server error), the failed batch is returned to the modal and you can retry. Re-tapping Resolve with the same selection does not double-post: the app dedups by transaction hash, so the same transaction cannot be inserted twice.

---

## When nothing matches

The matcher shows one of three messages instead of opening the review screen when it cannot produce usable matches.

- **No Matches Found.** No pairing could be made between the uploaded or pulled transactions and your scheduled events. This is normal if the transactions do not correspond to budget items you have set up, or if they were resolved earlier.
- **No New Transactions.** Every transaction has already been processed. The matcher filters out transactions whose hash is already on one of your items, so re-uploading the same CSV or re-pulling the same Plaid range produces zero new matches. A **Match All Transactions** button on the dialog lets you re-run on the previously processed ones (useful if you skipped some by mistake last time).
- **Hash Verification Failed.** This appears only on the Bring Your Own AI path. The AI you used returned hash values that do not match the file you uploaded, usually because the AI tampered with or invented the hashes. Regenerate the prompt with your current file and ask the AI to copy the hash values exactly as shown.

If you expected a match and got none of these messages, check [Helping the matcher get it right](#helping-the-matcher-get-it-right) below.

---

## How transactions move your account balance

A transaction moves your account balance the moment it is recorded, not when the event resolves. Transactions are stored without signs; the direction of the balance change is derived from the linked item's category type:

- An **Income** category increases the account balance.
- An **Expense** category decreases it.
- A **Transfer** category decreases the source account and increases the destination by the same amount.

Categorizing items correctly is what tells the app which way the money is moving. A paycheck under an Expense category by mistake will drift your balance the wrong way, even if everything else is set up correctly. (See [Categories](https://eb.app/learn/categories.md#the-three-types-and-the-sign-rule) for category type setup.)

The exception is the manual-resolve path. With no transactions on the event, the resolve itself moves your balance by the planned amount, with the same sign rule.

> **Why is your bank's number authoritative, not the app's?** The app keeps its own copy of each account balance by adding your starting balance to every recorded transaction. That copy is usually right, but if it ever disagrees with what your bank shows, the bank wins. Edit the **Current Balance** in the account directly to match. (See [Accounts](https://eb.app/learn/accounts.md).)

---

## Helping the matcher get it right

Two settings on each item improve match accuracy.

- **Bank Transaction Merchant Name.** Write the merchant string as it appears on your bank statement (for example, `WHOLE FOODS MARKET` for a Groceries item, `SPOTIFY` for a Streaming item). The matcher leans on this when the item's name and the bank description do not look alike. Editable on every plan; on Plaid-linked accounts the app populates it for you and shows it as read-only text.
- **Transaction Tracking** on the item. With tracking on, every matched transaction is recorded against the event and the line closes itself when the total reaches the planned amount. With tracking off, the line is a one-to-one match between one transaction and the event.

See [Items](https://eb.app/learn/items.md) for both fields in context. If a recurring transaction keeps matching the wrong item, splitting one item into two with different merchant names is usually the easiest fix.

---

## Comparing your spending

The Match Transactions dialog has a second mode, **Compare Budget**, that does not produce matches. It runs a separate analysis comparing your actual spending across recent transactions against your planned budget items, and presents the result as a categorical breakdown. Use it when you want a quick read on "where am I over and under this month" without committing any matches.

Compare Budget has the same Bring Your Own AI alternative as the matching path, so it is available on the free plan via the prompt-and-paste flow.

---

## Undoing a resolve or delete

Open the **History** tab to find resolves and deletes. Select a row and tap **Undo Action** in the toolbar. The Undo confirmation dialog opens.

The dialog does two things: it tells you what is being restored (the event returns to the planner), and it tells you what happens to your account balance. The balance side has three forms.

### When the resolved event had no transactions

<!-- SCREENSHOT: Undo dialog titled "Undo Resolution of Rent". Two list items inside: "Restore to Planner" with the note "The event will be returned to your planner", and "Reverse Balance Change" with a toggle on the right (default on). Italic helper text below the toggle: "On by default because resolving this event posted its planned amount to your account balance." A red Undo button at the bottom. -->

You see a **Reverse Balance Change** toggle, defaulting on. The resolve was the moment your balance moved (by the planned amount), so undoing should usually put it back. Confirm with the toggle on to reverse the balance change as part of the undo. Switch the toggle off if you have already corrected the balance some other way and do not want a second adjustment.

### When the resolved event had transactions

You see no toggle, only a note explaining that your balance will not change. The transactions on the event moved your balance when they were recorded. Undo restores those transactions as active, so their effect on the balance stays in place. There is nothing extra to reverse.

### When you are undoing a delete

You see no toggle, only a note that the balance will not change. Deleting an event never moved your balance, so undo has nothing to reverse.

In all three cases, the event returns to the planner with whatever transactions and customizations it had at the time it left.

---

## When Undo is blocked

In a small set of cases the Undo button does not appear at all. The History row shows a **Cannot undo** message with the reason instead.

| Reason shown | What happened |
|---|---|
| The parent item no longer exists. | The item that produced this event was deleted. |
| Original account no longer exists. | The account this event was against was deleted. |
| Original category no longer exists. | The category this event used was deleted. |
| The schedule for this event has been deleted. | The schedule on the item was removed. |
| The schedule's timing has been modified since this event was resolved (or deleted). | The schedule's frequency, day, or starting date was changed; the original timing is no longer in place. |
| This event was created before undo support was introduced. | A small number of very old History rows are not undoable. |

The History row stays visible in all of these cases. The data is still there; it just cannot be reversed.

### When undo is rejected after you confirm

One specific case is not pre-checked. If the deleted event had bank transactions on it, and one of those transactions has since been re-matched to a different event, undo is rejected when you confirm with the message:

> Cannot undo: Bank transactions have been matched to other events. Please remove those matches before undoing this deletion.

The fix is the same every time. Open the other event that has the conflicting transaction, remove the transaction from it, then go back to History and try Undo again. The block exists so a single real-world transaction cannot sit under two events at once.

---

## What changes if Premium ends

If your Premium subscription ends while you have a matching workflow set up, the Match button stays available in two cases and disappears in one. On a non-Plaid budget you own, you keep the file-upload path and the Bring Your Own AI alternative; Integrated AI hides until you resubscribe. On a Plaid-linked budget where you are not the owner, the Match button disappears, because the bank link is no longer maintained on a free plan. Already-matched transactions, resolved events, and History rows are not affected.

See [Subscription](https://eb.app/learn/subscription.md#when-premium-ends) for the full list of what changes when Premium ends, and [Your Account](https://eb.app/learn/account.md#cancelling-premium) for where to cancel.

---

## Quick reference

| If you want to... | Do this |
|---|---|
| Flag a paid bill while you wait for the bank | Tap **Mark Event as Paid**. Balance is unchanged; tap again to clear. |
| Resolve an event without a bank transaction | Select the event, tap **Resolve item**. Balance moves by the planned amount. |
| Run a bulk match against bank or file transactions | Tap **Match** in the planner toolbar. |
| Match without a Premium AI | Flip the AI Mode toggle to **Bring Your Own AI** and use the prompt-and-paste flow. |
| Reduce wrong matches on a recurring item | Fill in **Bank Transaction Merchant Name** on the item. (See [Items](https://eb.app/learn/items.md).) |
| Undo a resolve or delete | Open the History tab, select the row, tap **Undo Action**, confirm the dialog. |
| Restore a deleted event whose transactions were re-matched elsewhere | Open the other event, remove the conflicting transaction, then retry Undo. |

---

## Behind the scenes

The matcher reads the unmatched transactions on each account plus the planner items that fall near those transaction dates, then asks the AI (Gemini on Integrated AI, whichever AI you paste into on Bring Your Own AI) to suggest pairings.

**Date window per item frequency.** The matcher only sends events that fall near the transaction date range, with a buffer that depends on the schedule:

| Schedule | Buffer added on each side of the date range |
|---|---|
| Daily | 2 days |
| Weekly | 4 days |
| Bi-weekly | 7 days |
| Monthly | 10 days |
| Quarterly | 15 days |
| Annually | 30 days |

Up to 40 events go into the prompt for each account. For tracking items, the matcher includes up to 3 occurrences so the AI can see the recurrence pattern.

**Duplicate detection.** Every transaction is hashed at parse time. Before the AI is called, the app filters out any transaction whose hash already exists on one of your items. Re-uploading the same CSV or re-pulling the same Plaid range produces zero new matches; the app shows the **No New Transactions** message instead. The same hash check runs server-side as a backstop.

**What the AI sees, and does not see.** The matcher sends the unmatched transactions on the file or Plaid pull, plus the relevant planner items (name, amount, due date, frequency, period, the optional Bank Transaction Merchant Name, and the tracking flag). It does not send your account balances, your account numbers, your bank login, your other budgets, or transactions on accounts you did not include in this match. See [How AI works in this app](https://eb.app/learn/subscription.md#how-ai-works-in-this-app) for the cross-cutting privacy framing.

When you commit a batch of matches, the resolves and the new transactions sync to every collaborator on the budget in real time. (See [Sharing a Budget](https://eb.app/learn/sharing.md).)

---

## Related pages

- [The Planner](https://eb.app/learn/planner.md) for the Grid and Calendar views, the toolbar, and editing an event versus editing the item.
- [Items](https://eb.app/learn/items.md) for the Transaction Tracking toggle and the Bank Transaction Merchant Name field.
- [Transactions](https://eb.app/learn/transactions.md) for adding, editing, and deleting transactions inside an event.
- [History and Undo](https://eb.app/learn/history-and-undo.md) for the History tab in detail and the full Undo dialog.
- [Bank Linking](https://eb.app/learn/bank-linking.md) for connecting an account so Match can pull bank transactions.
- [File Uploads](https://eb.app/learn/file-uploads.md) for supported formats and how the parser handles odd column orders.
- [Subscription](https://eb.app/learn/subscription.md) for what each plan includes, how AI features work, and what changes when Premium ends.
- [Your Account](https://eb.app/learn/account.md) for cancelling Premium or backing up a budget before you do.

---

## About this document

This is a markdown mirror of [https://eb.app/learn/matching-and-resolving/](https://eb.app/learn/matching-and-resolving/).
The HTML version is the canonical form. This file exists so AI/LLM
tools can ingest the content without HTML parsing.
