Every supplier bill on the right job: attribution with a review queue
Three Make scenarios put supplier costs on the right job. One matches each supplier bill in QuickBooks to its project on monday.com by purchase order, job number and vendor rules. Another signs in to the materials supplier's portal each day and attaches any missing invoice PDFs. A third links invoices to projects through a map of purchase-order aliases, and sends anything it is not sure of to a person.
Where this applies
Contractors and builders who buy materials against many jobs at once and need every supplier bill and invoice costed to the right one.
- runs in the windows read, no errors
- 874
- of invoices checked on every fetch
- 35 days
- main matching branches for bills
- 4
The problem
Job costing is only as good as its attribution. A contractor buying paint and materials for dozens of jobs receives bills and invoices that name the job however the person at the counter typed it: a job number, a purchase-order name, a site nickname, or nothing at all.
Matching by hand is an afternoon a week for someone in accounts. A rule that guesses is worse: a cost on the wrong job is harder to find than a cost on no job. So an automatic match has to be confident, and everything else has to land where a person will look.
What we built
Bills matched by the rules accounts would use
The bill attribution scenario, about fifty-five modules on a schedule of a few minutes, matches each supplier bill to its project by purchase order, job number and vendor rules. Nested routers carry each bill down four main branches, iterators and aggregators handle bills with many lines, and the match is written to both systems, so the job board and the accounts agree. Error routes keep one bill from stopping the rest.
The supplier's PDFs, fetched daily
Once a day a scenario signs in to the supplier's portal API, iterates the company's supplier accounts and fetches the last thirty-five days of invoices. For each it finds the matching monday row with one GraphQL query that also returns the files already attached, and downloads a PDF only where none is attached yet. A failed download or upload is logged to a data store and the run carries on.
Linking by alias, not by guesswork
A purchase-order name is often a nickname for the job. The linking scenario reads invoices that have a purchase order but no project and no triage decision, and looks each one up in an alias map, using only entries that point to one fixed project. Exactly one match links the invoice. Anything else is flagged for review, which also takes it out of future runs, so an uncertain invoice is neither reprocessed nor quietly linked.
A review queue as the safety valve
A purchase order that can't be parsed is skipped rather than guessed at. The design is deliberately conservative: an invoice the rules are unsure of costs a person a minute, while one linked to the wrong job costs an investigation.
The outcome
In the History windows read, bill attribution ran 650 times between 17 and 21 October 2026, the PDF fetch 33 times between 19 September and 21 October, and the alias linker 191 times between 18 September and 21 October. None of the 874 runs had an error.
Where it stops
These three scenarios sit inside a wider set. The daily import that puts supplier invoices on the board, the first-tier link by job number, the scenarios that grow and rank the alias map and the matching of expenses are not described here. An invoice flagged for review stays out of automatic linking until someone clears it. PDF failures are logged rather than alerted, and an invoice that falls outside the thirty-five-day window without its PDF is not looked for again.
Built with
- Make.com
- QuickBooks Online
- monday.com
- GraphQL API
- HTTP API
- Make data store
Patterns used
- Confidence before linking
- Review queue that drops out
- Fetch only what is missing
- Failure log in a data store
Page copy drafted with AI assistance. Skofi is accountable for it. Editorial policy
Have something shaped like this?
If any part of the above resembles a problem you are living with, a short call is the fastest way to find out whether it is the same problem underneath.
What happens on the call
- 15 minutes, no deck
- We map the process on the call
- A written scope, or an honest no