Skip to main content
Peer-to-peer transfers are the hardest transactions in a typical household to categorize automatically. The description is usually something like “ZELLE TO JOHN SMITH” or “VENMO *CASHOUT” — no merchant, no category hint, no context. Rules can only get you so far. The reasonable ceiling for a good rule is “tag it as P2P”; from there an agent (or a human) has to make the actual call. This guide describes the shape of the work and gives you an agent prompt tuned for it.

Why this is hard

A typical Zelle row might look like:
There’s no way to tell from that row alone whether John is a roommate being paid for rent, a contractor being paid for a one-off job, a friend being reimbursed for dinner, or a kid getting allowance. The answer usually lives in:
  1. Timing — rent lands on the 1st; allowance on a predictable cadence; dinner is irregular.
  2. Amount regularity — rent is always the same amount; dinner reimbursements vary.
  3. Counterparty history — if John appears only once every six months, he’s probably not a recurring bill.
  4. External context — a text message, a shared expense tracker, or a human’s memory.
The first three an agent can reason about. The fourth has to be solved by asking.

The prompt pattern

Give the agent three jobs: look the transaction up in a richer context (its own history plus other recent P2P rows), decide if the signal is strong enough, and either categorize or defer to a human.

The p2p-unmapped tag as a human queue

The key move is separating the agent’s verdict from the household’s. When the agent can’t decide, it leaves the transaction on p2p-review (so it stays in the specialist queue for next time) and adds p2p-unmapped so a human can find it quickly. In the dashboard, the household can filter to /transactions?tags=p2p-unmapped once a week, categorize each one by hand, and either remove both tags themselves or leave a comment explaining the context. If they leave a comment, the agent picks it up on the next pass and learns — next time a Zelle to the same counterparty shows up, the earlier comment is part of the context it reads.

A light rule to pre-tag the queue

Here’s the routing rule you’d pair with this agent. It sends anything with a Zelle/Venmo/Cash App/Apple Cash substring into p2p-review at sync time, so the agent has a clean queue to work.
Keep this at baseline stage so any more specific rule you write (e.g., “known rent counterparty”) can layer on top at standard or refinement.

A worked example

Consider three transactions the agent sees in a single batch: The agent’s reasoning:
  • John M → strong signal. 8 months of identical amounts on the 1st → rent. Categorize as rent_and_utilities_rent, remove p2p-review with the note “Recurring monthly payment to John M, consistent with rent since Aug 2025.”
  • Sarah K → moderate signal. Two prior occurrences, variable amounts, irregular cadence → probably dinner splits. Categorize as food_and_drink_restaurants, remove p2p-review, leave a comment: “Likely a dinner split — Sarah K has two prior matches at similar amounts.”
  • Mike A → no signal. First appearance, meaningful amount → leave p2p-review in place, add p2p-unmapped with note “First-time counterparty Mike A at $600. Household review needed.”
That third transaction now shows up in both the P2P specialist queue and the unmapped human queue. Whichever side resolves it first wins.

Where this pattern falls down

The agent will often misattribute when a household member starts a new recurring relationship (a new babysitter, a new rent situation). Expect the first few transactions to a new counterparty to always land in p2p-unmapped — that’s working as intended.
If you have a large amount of P2P traffic, consider maintaining a “counterparty memory” file in your agent’s long-term memory or project knowledge — a short list of known counterparties with their category mapping. The agent consults this first before doing the full cross-reference. We haven’t prescribed a specific shape for that memory, since most households don’t have enough counterparty traffic to justify it.
  • Multi-agent reviewer flows — how this specialist fits into a larger team.
  • Understanding rules — rule syntax for the pre-tagging step.
  • Tags — the conceptual model for p2p-review, p2p-unmapped, and any other queue you build.
  • MCP toolsquery_transactions with search and date filters, update_transactions for the compound write.
Last modified on June 25, 2026