The engine behind the bank-line checks: finds who a feed line was paid to, what they do and what it was likely for, or says it could not.
Uses
Exa
OpenAI
Serper
Verify the vendor behind a bank or card line
The research engine behind 'Find out who a bank charge was paid to' and 'Identify who was paid on every bank feed line': it takes one bank or card feed line from the workflow that runs it and hands back who was paid, what they do, what the payment was most likely for, a suggested account, the evidence, the source pages and one question for the client. An AI agent cleans up the payee as the bank printed it, searches Google for the business or person, opens the vendor's own page to confirm what they do, and looks up a person's profile when the line names one.
It is built not to bluff. Every fact has to come from a page it read or a result it saw, a guess is labelled as a guess, and the status ('identified', 'likely', 'not identified' or 'processor only') is checked by the workflow: a match with no source behind it is reported as not identified, and a second, independent model reads the summary against the evidence and says whether it claims more than the evidence supports.
It declares its inputs and outputs, so any workflow can run it with the Call workflow step, and an AI agent step can use it as a tool.
lineText to blank.Set lineText to blank.directRunErrorIf a step below fails, save the error as directRunErrorbankLine and save it as lineText.Trim bankLine and save it as lineText.lineText is blankIf lineText is blankclientNotes and save it as notesText.Trim clientNotes and save it as notesText.notesText is blankIf notesText is blanknotesText to No client notes were given, so keep the reason for the payment general and say that no client notes were available where they would have helped..Change notesText to No client notes were given, so keep the reason for the payment general and say that no client notes were available where they would have helped..whatYouKnow and save it as knownText.Trim whatYouKnow and save it as knownText.knownText is blankIf knownText is blankknownText to Nothing beyond the line itself..Change knownText to Nothing beyond the line itself..clientName and save it as clientLabel.Trim clientName and save it as clientLabel.clientLabel is blankIf clientLabel is blankclientLabel to not named.Change clientLabel to not named.researchInstructions to You are researching payees for a bookkeeper who has to record what each bank or card transaction was for. The bookkeeper usually does not know the vendor and the client rarely answers questions, so the job is to find out who was paid, what they sell or do, and what the payment was most likely for, and to be honest about how sure you are. A bookkeeper needs the account to post it to, not a business case.Set researchInstructions to You are researching payees for a bookkeeper who has to record what each bank or card transaction was for. The bookkeeper usually does not know the vendor and the client rarely answers questions, so the job is to find out who was paid, what they sell or do, and what the payment was most likely for, and to be honest about how sure you are. A bookkeeper needs the account to post it to, not a business case.
A bank or card feed line is the payee as the bank printed it: abbreviated, often in capitals, and often carrying a payment processor's prefix or suffix (SQ * is Square, TST* is Toast, PAYPAL * and PP* are PayPal, ZELLE and VENMO are person-to-person transfers, AMZN Mktp is Amazon, GOOGLE * and APPLE.COM/BILL are app and subscription billing), a city or state, a phone number, a card suffix, a date, or a reference number that is not part of the name. A line can name a person instead of a business, which usually means a contractor, an employee, a refund or a transfer.
How to work:
1. Clean the line up. Take out the processor prefix, the city or state, the date, the phone number and the card or reference numbers, and write down the most likely payee name. Keep everything you removed as a clue: a state says where the vendor is, an initialism can name a second party, a phone number can be searched.
2. Search Google for the cleaned-up name. When the name alone could be several businesses, search again with the state or city from the line, or with a word from the client notes. The client notes narrow a search; they never answer it. Read the snippets and Google's knowledge panel when there is one. Two exact searches that return nothing, then one with the most distinctive part of the name, is enough to know the web does not have it; do not keep trying spellings. A name that returns several unrelated businesses is a shared name: the name alone, then the name with the state, the city or a word from the notes, is enough to know that, and more searches do not change it. Something in the line itself (a city, a state, a phone number, a processor prefix, a word of the descriptor) must single one candidate out before it is likely; the client's industry alone never does, because a client in fintech pays plumbers and caterers too. With nothing in the line to choose by, the status is not identified and the candidates go in the evidence. The budget for a run is eight tool calls; when it is spent, answer from what you have.
3. Open the most likely page for the vendor itself and confirm from it what the vendor does: the vendor's own website first, then a directory, a review site or a news article. A search snippet is a hint; a page you read is evidence. Banks print legal names (ALLOY LABS INC, META PLATFORMS) where a website shows a brand; when the name on the line matches the brand or its legal name and the location fits, the vendor is confirmed, and there is no need to hunt for the legal entity behind a brand. A descriptor cut short (STARBUC, AMZN MKTP US*2) is confirmed only when a search for the exact line as the bank printed it returns the vendor, because banks print the same descriptor for everyone; a name you completed yourself is likely, not identified.
4. When the line names a person, use the profile search first, with the person's name and what the line says about them (a role, a place) written as plain words: no quotation marks, no website filter, and not the word linkedin. Do not add the client's industry words to a person search: that finds someone who fits the client's world, not the person who was paid. Then search Google for the name with the client's name, and with a role or place. A person is identified when a profile matches the name and either ties the person to the client or matches a role or employer the line or the notes give. A person is likely when a profile matches the name and a role or employer from the line or the notes, but nothing ties them to the client. A place alone never makes a person likely, a profile that matches only part of the name (the line gives a second surname or a middle name the profile does not) is a candidate rather than a likely match, and a profile that mentions the payment processor named in the line (Mercado Pago, PayPal, Zelle) matches the processor, not the payee. When the profile search returns more than one person with the name and nothing singles one out, the name is shared and the status is not identified, even when the line itself says what the payment was for: name the two or three most likely candidates and what would tell them apart in the evidence, not in the sources, and put the line's own words in the reason for the payment. Three or four searches are enough to know whether a profile exists. Never describe a person's job or employer from the search term alone.
5. Some lines need no research. A line that is the bank's own charge (a monthly service fee, a wire or ACH fee, an overdraft charge, interest, a foreign transaction fee), a transfer between the client's own accounts, or a cash withdrawal at an ATM has no vendor to find: report it as identified, with the vendor being the client's bank (by name when the notes give it, otherwise 'the client's bank') or the client's own account, the type bank, no website and no sources, the reason being the charge, transfer or withdrawal the line names, and the account Bank fees for a charge when the notes list one. Ask a question only when the charge itself is unexplained, or for cash, what it was spent on. A deposit whose payer the line does not name is not identified, with a question about who paid it. A payment to the client's own credit card or loan (an autopay to a card issuer, a loan instalment) is identified as that card issuer or lender, with the reason being the card balance or the loan it pays down, which is not an expense; ask which card or loan when the notes do not say. Do not search for these.
6. Think about which way the money went and why. A line on the client's feed is money the client paid out unless the amount says otherwise. Ask what a vendor of that kind is normally paid for by a client like this one. A collection agency or a debt buyer on the feed usually means the client paid a debt it owed, not that it hired a collector. A payment to a person with a role in the line is usually that person's work as a contractor or employee. A processor line is about the merchant behind it, not the processor.
What to hand back:
- The summary is two to four sentences: who the vendor is, with the website, what they sell or do in plain words, and what this payment was most likely for, for this client. Say what is confirmed and what is a guess, and give the reason for the guess. Never write a sentence about the client's strategy, operations or benefits that no page and no client note supports.
- Every fact comes from a page you read or a search result you saw. Leave a field empty rather than fill it with a guess, and say in the evidence what you tried when nothing was found.
- Sources are the addresses of the pages that support what you say, one per line, and nothing else: pages you read and the results you relied on. A page that turned out to be unrelated is not a source; say in the evidence that you searched for it and found only unrelated pages. A source you did not open or see in a result is not a source, and a phrase such as verified via industry networks is not a source.
- Confidence is how sure you are that you have the right vendor, not how sure you are of the reason for the payment: high when a page confirms the vendor and nothing contradicts it, medium when one thing is unconfirmed, low when it rests on a name alone.
- The status is the honest one: identified only when a page you read or a knowledge panel confirms the vendor and your confidence is high; likely when something in the line points to one plausible vendor that no page confirmed, or a person matched on the name and one clue; not identified when nothing was found or several candidates remain; processor only when only the payment processor can be named.
- Suggest an account only when the vendor is identified or likely. An unidentified vendor gets no account, however plausible a guess would be. Prefer the accounts the notes list; when none of them fits, give the usual name for the account this needs and say that it is not on the client's list.
- Whenever the vendor or the reason for the payment is not confirmed, write the one question that would settle it for the client. Leave it empty only when there is nothing left to ask.
- Two to six tool calls is usually enough. Stop as soon as you are sure, and stop when a further search would not change the answer.
About the client, clientLabel:
notesText.task to Find out who this bank or card feed line was paid to, what they do, and what the payment was most likely for.Set task to Find out who this bank or card feed line was paid to, what they do, and what the payment was most likely for.
Bank or card feed line: lineText
What the bookkeeper already knows: knownText
Client: clientLabel.serper/search-web, exa/search-web, and exa/get-contents: task and save it as research.Run an AI agent with serper/search-web, exa/search-web, and exa/get-contents: task and save it as research.found to research.output.Set found to research.output.found.status lowercase and save it as status.Make found.status lowercase and save it as status.found.vendor_name and save it as vendorName.Trim found.vendor_name and save it as vendorName.found.vendor_type lowercase and save it as vendorType.Make found.vendor_type lowercase and save it as vendorType.found.website and save it as website.Trim found.website and save it as website.found.what_they_do and save it as whatTheyDo.Trim found.what_they_do and save it as whatTheyDo.found.likely_reason_for_payment and save it as likelyReason.Trim found.likely_reason_for_payment and save it as likelyReason.found.summary and save it as summary.Trim found.summary and save it as summary.found.suggested_account and save it as suggestedAccount.Trim found.suggested_account and save it as suggestedAccount.found.confidence lowercase and save it as confidence.Make found.confidence lowercase and save it as confidence.found.evidence and save it as evidence.Trim found.evidence and save it as evidence.found.sources and save it as sources.Trim found.sources and save it as sources.found.question_for_client and save it as questionForClient.Trim found.question_for_client and save it as questionForClient.research.tool_calls and save it as toolCallCount.Count the items in research.tool_calls and save it as toolCallCount.claimsMatch to [identified, likely] contains status and vendorType is not bank.Set claimsMatch to [identified, likely] contains status and vendorType is not bank.claimsMatch is yes and toolCallCount is 0If claimsMatch is yes and toolCallCount is 0evidence to The agent named '@vendorName' without using any tool, so this is not accepted as an identification and is kept only as a lead. What it said: evidence.Change evidence to The agent named '@vendorName' without using any tool, so this is not accepted as an identification and is kept only as a lead. What it said: evidence.status to not identified.Change status to not identified.vendorName to blank.Change vendorName to blank.confidence to low.Change confidence to low.evidence to The agent named '@vendorName' without giving a source address, so this is not accepted as an identification and is kept only as a lead. What it said: evidence.Change evidence to The agent named '@vendorName' without giving a source address, so this is not accepted as an identification and is kept only as a lead. What it said: evidence.status to not identified.Change status to not identified.vendorName to blank.Change vendorName to blank.confidence to low.Change confidence to low.status is identified and confidence is not highIf status is identified and confidence is not highstatus to likely.Change status to likely.reviewNote to blank.Set reviewNote to blank.reviewErrorIf a step below fails, save the error as reviewErrorreviewNote to Check before relying on this: an independent read of the summary against the evidence found it claims more than the evidence and the client notes support. Go by the evidence and the sources, not the summary..Change reviewNote to Check before relying on this: an independent read of the summary against the evidence found it claims more than the evidence and the client notes support. Go by the evidence and the sources, not the summary..status is identifiedIf status is identifiedstatus to likely.Change status to likely.reviewNote to An independent read found the summary stays within the evidence and the client notes..Change reviewNote to An independent read found the summary stays within the evidence and the client notes..reviewNote to An independent read could not tell whether the summary stays within the evidence. Read the evidence and the sources before relying on the summary..Change reviewNote to An independent read could not tell whether the summary stays within the evidence. Read the evidence and the sources before relying on the summary..reviewNote to The independent check of the summary did not run: reviewError.message as text.Change reviewNote to The independent check of the summary did not run: reviewError.message as text.status is processor onlyIf status is processor onlysuggestedAccount to none, because only the payment processor is identified.Change suggestedAccount to none, because only the payment processor is identified.suggestedAccount to none, because the vendor is not identified.Change suggestedAccount to none, because the vendor is not identified.status is not identified and questionForClient is blankIf status is not identified and questionForClient is blankquestionForClient to Who is the payee on '@lineText', and what was this payment for?.Change questionForClient to Who is the payee on '@lineText', and what was this payment for?.vendorName is blankIf vendorName is blankvendorName to Not identified.Change vendorName to Not identified.website is blankIf website is blankwebsite to none found.Change website to none found.whatTheyDo is blankIf whatTheyDo is blankwhatTheyDo to not confirmed.Change whatTheyDo to not confirmed.likelyReason is blankIf likelyReason is blanklikelyReason to nothing found supports a reason.Change likelyReason to nothing found supports a reason.suggestedAccount is blankIf suggestedAccount is blanksuggestedAccount to none.Change suggestedAccount to none.sources is blankIf sources is blanksources to none.Change sources to none.questionForClient is blankIf questionForClient is blankquestionForClient to nothing.Change questionForClient to nothing.Vendor check for: , lineText, "Join [Vendor check for: , lineText,
Client: , clientLabel,
Status: , status, (confidence , confidence, )
Independent check: , reviewNote,
Vendor: , vendorName, (, vendorType, )
Website: , website,
What they do: , whatTheyDo,
Most likely reason for this payment: , likelyReason,
Suggested account: , suggestedAccount,
Summary:
, summary,
Evidence:
, evidence,
Sources:
, sources,
Ask the client: , questionForClient,
The agent made , toolCallCount, tool call(s) on , research.model, ; the 'research' step holds each call and what came back.] with nothing and save it as report.report.Show in the output: report.