Monthly supplier check against official company registers

Every month, check that your Xero suppliers are still active companies, flag any that are dissolved or insolvent in Slack, and log the full pass.

Agentic Task
OpenCorporatesXeroSlackGoogle SheetsFinanceOperationsResearch & MonitoringNotifications & Alerts
PromptCreate

On the first Monday of each month, re-verify our entire supplier base against official company registers so we never pay a company that has quietly been dissolved. Run this on a cron trigger set to the first Monday of every month.

Start by pulling the supplier list from Xero with List Contacts, and keep only the contacts marked as suppliers. This is the working set for the pass.

For each supplier, find its registry record in OpenCorporates. Use Search Companies on the supplier's registered company name, restricting to the supplier's jurisdiction where Xero gives you enough address detail to infer one. From the search results, pick the record you are confident is the same legal entity, then call Get Company with that record's jurisdiction code and company number to read its current status. A company is identified by the jurisdiction code and company number pair rather than a single id, so carry both through the workflow. Then call List Company Statements for that company to catch gazette and insolvency notices, which are the real point of this check because they surface trouble before the official registry status flips.

Where the name match is ambiguous, skip it rather than guessing. Treat a match as ambiguous when several companies share the name with no clear jurisdiction or address tiebreak, when the only candidates are dissolved shells that may or may not be the same business, or when the Xero contact name is a trading name that does not correspond to a registered entity. Matching the wrong company is worse than not matching, since it can either clear a failing supplier or wrongly accuse a healthy one. Collect every skipped supplier into a separate needs manual review list.

Treat a supplier as flagged when its registry status is dissolved, in liquidation, struck off, or the local equivalent in that jurisdiction, or when its statements include a new insolvency or gazette notice. To decide whether a notice is new, compare the notice date against the date of the previous run, which you can read from the most recent check date in the audit log. Only treat notices dated after the previous check as new, so the same old notice does not get re-reported every month.

Post a Slack message to the finance channel with Send a Message, containing only the flagged suppliers. For each one give the supplier name as it appears in Xero, the matched company name and number, the registry status, the specific notice and its date where that is what triggered the flag, and a link to the OpenCorporates record. Add the needs manual review list underneath as a short separate section. Do not list the clean suppliers, and do not pad the message with a summary of everything checked, since this channel is only worth reading if it stays signal only. If nothing was flagged and nothing needs review, post a single short line confirming the check ran and found no issues, so the absence of a message is never confused with a workflow that failed to run.

Append the full pass, including every clean supplier, to the Google Sheets audit log with Append Values. Write one row per supplier with the check date, the supplier name from Xero, the matched company name, the jurisdiction code, the company number, the registry status that was read, whether any insolvency or gazette notice was found along with its date, a link to the OpenCorporates record, and the outcome as clean, flagged, or needs manual review. The audit log matters as much as the alert, because the point is being able to evidence that the check happened and against which record, not just that something was found.

Be economical with lookups. OpenCorporates enforces per plan daily and monthly quotas, which is why this runs monthly rather than more often. Do not re-search a supplier you have already resolved in this pass, and if the quota is exhausted partway through, still post what you found and log the suppliers you got through, noting in the log which ones were not reached so the next run can pick them up.

What does this prompt do?

  • Pulls your full supplier list out of Xero on the first Monday of every month, so the check always covers everyone you actually pay
  • Looks up each supplier in official company registers and reads its current status, plus any gazette or insolvency notices, which often appear before a status officially changes
  • Posts a Slack message to your finance channel listing only the suppliers that are dissolved, in liquidation, struck off, or carrying a new insolvency notice
  • Appends every supplier from the pass, including the clean ones, to a Google Sheets audit log with the check date so you have a defensible paper trail

What do I need to use this?

  • A Xero account with your suppliers set up as contacts
  • An OpenCorporates account for looking up official company register records
  • A Slack workspace and the finance channel you want alerts posted to
  • A Google Sheets spreadsheet to use as the running audit log

How can I customize it?

  • Change the timing, for example to every quarter if your supplier base is large or to twice a month if you onboard suppliers quickly
  • Choose which channel gets the alert, such as a dedicated risk channel instead of the main finance channel
  • Adjust what counts as worth flagging, for example also raising suppliers whose registered address or company name recently changed
  • Narrow the check to suppliers above a certain spend level rather than every contact in Xero

FAQs

Which countries does this work in?
Official company register data is available for a very wide range of countries, so most supplier bases are well covered. The exact wording of a company status varies by country, so a status may read as dissolved in one register and struck off or removed in another. The workflow accounts for this and treats the local equivalents as the same warning sign.
Why does it run monthly rather than every day?
A company's registered status rarely changes from one day to the next, so a daily check adds noise without adding safety. Monthly is frequent enough to catch a supplier before your next payment run, and it keeps the number of company lookups comfortably inside a normal OpenCorporates plan allowance.
What happens when two companies have a similar name?
It skips them rather than guessing. Matching the wrong company would be worse than not matching at all, because it could either clear a failing supplier or wrongly accuse a healthy one. Anything ambiguous is listed separately as needing manual review, so a person can make the call.
Will it message the team when everything is fine?
No. The Slack post only ever lists suppliers that need attention, so the channel stays worth reading. If nothing is flagged it posts a single short line confirming the check ran and found nothing, which is what makes it useful as an audit control. The full pass, clean suppliers included, always goes to the spreadsheet.
Why keep a log of the suppliers that passed?
Because the value in an audit is being able to show the check happened, not just that something was found. The log records every supplier looked at, the register record it was matched to, and the date it was checked, so you can evidence the control rather than rely on the absence of alerts.

Related templates

Auto-fix your calendar when a flight slips, and flag what's at risk

When your flight moves, your calendar times get corrected automatically and you get a Slack note naming the meetings you're about to miss.

Google Calendar
AviationStack
Slack
Agentic Task
Trace phishing emails to the sending IP and report abuse

Every 15 minutes, forwarded phishing reports get traced back to the server that really sent them, with a verdict in Slack and the worst senders reported.

AbuseIPDB
Gmail
Slack
Agentic Task
Weekly Amazon S3 bucket security audit posted to Slack

Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.

Amazon S3
Slack Bot
Google Sheets
Agentic Task
Turn procurement portal tenders into CRM deals each morning

Every weekday at 7am, sign in to the tender portals you track, filter new notices against your bid criteria, and open a deal for the ones worth chasing.

Anchor Browser
Google Sheets
HubSpot
+1
Agentic Task
Draft polite follow-ups for emails that never got a reply

Every weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.

Aurinko
Google Sheets
Slack Bot
Agentic Task
Turn each week's football fixtures into a venue staffing plan

Every Monday, rank the week's matches by expected demand, put the big ones on your venue calendar, and post a rota-ready summary to Slack.

API-Sports
Google Calendar
Slack
Agentic Task

Never pay a company that no longer exists.

Re-verify your whole supplier base against official registers every month, and keep the paper trail that proves you did.