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.

UsesExaOpenAISerper

Verify the vendor behind a bank or card line

ValuesSet lineText to blank.Set lineText to blank.
Decisions & LoopsIf a step below fails, save the error as directRunErrorIf a step below fails, save the error as directRunError
Try
TextTrim bankLine and save it as lineText.Trim bankLine and save it as lineText.
On error
Decisions & LoopsStop and report a problem: This workflow takes its bank line from the workflow that runs it. To check one line, run 'Find out who a bank charge was paid to'; to work through a spreadsheet, run 'Identify who was paid on every bank feed line'. Both pass their values into this one.Stop and report a problem: This workflow takes its bank line from the workflow that runs it. To check one line, run 'Find out who a bank charge was paid to'; to work through a spreadsheet, run 'Identify who was paid on every bank feed line'. Both pass their values into this one.
Decisions & LoopsIf lineText is blankIf lineText is blank
Yes
Decisions & LoopsStop and report a problem: The workflow that ran this passed an empty bank line. Give it the line exactly as the bank printed it.Stop and report a problem: The workflow that ran this passed an empty bank line. Give it the line exactly as the bank printed it.
No
No steps
TextTrim clientNotes and save it as notesText.Trim clientNotes and save it as notesText.
Decisions & LoopsIf notesText is blankIf notesText is blank
Yes
ValuesChange 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..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..
No
No steps
TextTrim whatYouKnow and save it as knownText.Trim whatYouKnow and save it as knownText.
Decisions & LoopsIf knownText is blankIf knownText is blank
Yes
ValuesChange knownText to Nothing beyond the line itself..Change knownText to Nothing beyond the line itself..
No
No steps
TextTrim clientName and save it as clientLabel.Trim clientName and save it as clientLabel.
Decisions & LoopsIf clientLabel is blankIf clientLabel is blank
Yes
ValuesChange clientLabel to not named.Change clientLabel to not named.
No
No steps
ValuesSet 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.
ValuesSet 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.
AI AgentRun an AI agent with 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.
ValuesSet found to research.output.Set found to research.output.
TextMake found.status lowercase and save it as status.Make found.status lowercase and save it as status.
TextTrim found.vendor_name and save it as vendorName.Trim found.vendor_name and save it as vendorName.
TextMake found.vendor_type lowercase and save it as vendorType.Make found.vendor_type lowercase and save it as vendorType.
TextTrim found.website and save it as website.Trim found.website and save it as website.
TextTrim found.what_they_do and save it as whatTheyDo.Trim found.what_they_do and save it as whatTheyDo.
TextTrim found.likely_reason_for_payment and save it as likelyReason.Trim found.likely_reason_for_payment and save it as likelyReason.
TextTrim found.summary and save it as summary.Trim found.summary and save it as summary.
TextTrim found.suggested_account and save it as suggestedAccount.Trim found.suggested_account and save it as suggestedAccount.
TextMake found.confidence lowercase and save it as confidence.Make found.confidence lowercase and save it as confidence.
TextTrim found.evidence and save it as evidence.Trim found.evidence and save it as evidence.
TextTrim found.sources and save it as sources.Trim found.sources and save it as sources.
TextTrim found.question_for_client and save it as questionForClient.Trim found.question_for_client and save it as questionForClient.
ListsCount the items in research.tool_calls and save it as toolCallCount.Count the items in research.tool_calls and save it as toolCallCount.
ValuesSet claimsMatch to [identified, likely] contains status and vendorType is not bank.Set claimsMatch to [identified, likely] contains status and vendorType is not bank.
Decisions & LoopsIf claimsMatch is yes and toolCallCount is 0If claimsMatch is yes and toolCallCount is 0
Yes
ValuesChange 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.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.
ValuesChange status to not identified.Change status to not identified.
ValuesChange vendorName to blank.Change vendorName to blank.
ValuesChange confidence to low.Change confidence to low.
Else if @claimsMatch is yes and @sources is empty
ValuesChange 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.
ValuesChange status to not identified.Change status to not identified.
ValuesChange vendorName to blank.Change vendorName to blank.
ValuesChange confidence to low.Change confidence to low.
Otherwise
No steps
Decisions & LoopsIf status is identified and confidence is not highIf status is identified and confidence is not high
Yes
ValuesChange status to likely.Change status to likely.
No
No steps
ValuesSet reviewNote to blank.Set reviewNote to blank.
Decisions & LoopsIf a step below fails, save the error as reviewErrorIf a step below fails, save the error as reviewError
Try
Decisions & LoopsIf Read the summary against the evidence, the sources, notesText (the client notes)…If Read the summary against the evidence, the sources, notesText (the client notes)…
Yes
ValuesChange 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..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..
Decisions & LoopsIf status is identifiedIf status is identified
Yes
ValuesChange status to likely.Change status to likely.
No
No steps
No
ValuesChange 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..
Not sure
ValuesChange 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..
On error
ValuesChange 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.
Decisions & LoopsIf status is processor onlyIf status is processor only
Yes
ValuesChange suggestedAccount to none, because only the payment processor is identified.Change suggestedAccount to none, because only the payment processor is identified.
Else if ["identified", "likely"] doesn't contain @status
ValuesChange suggestedAccount to none, because the vendor is not identified.Change suggestedAccount to none, because the vendor is not identified.
Otherwise
No steps
Decisions & LoopsIf status is not identified and questionForClient is blankIf status is not identified and questionForClient is blank
Yes
ValuesChange questionForClient 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?.
No
No steps
Decisions & LoopsIf vendorName is blankIf vendorName is blank
Yes
ValuesChange vendorName to Not identified.Change vendorName to Not identified.
No
No steps
Decisions & LoopsIf website is blankIf website is blank
Yes
ValuesChange website to none found.Change website to none found.
No
No steps
Decisions & LoopsIf whatTheyDo is blankIf whatTheyDo is blank
Yes
ValuesChange whatTheyDo to not confirmed.Change whatTheyDo to not confirmed.
No
No steps
Decisions & LoopsIf likelyReason is blankIf likelyReason is blank
Yes
ValuesChange likelyReason to nothing found supports a reason.Change likelyReason to nothing found supports a reason.
No
No steps
Decisions & LoopsIf suggestedAccount is blankIf suggestedAccount is blank
Yes
ValuesChange suggestedAccount to none.Change suggestedAccount to none.
No
No steps
Decisions & LoopsIf sources is blankIf sources is blank
Yes
ValuesChange sources to none.Change sources to none.
No
No steps
Decisions & LoopsIf questionForClient is blankIf questionForClient is blank
Yes
ValuesChange questionForClient to nothing.Change questionForClient to nothing.
No
No steps
TextJoin [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.
ValuesShow in the output: report.Show in the output: report.