← All standards
Open specificationDraftPublished October 2026Changelog

The Document Filing Build Standard

Paperwork piling up faster than anyone can file it? This standard is the daily office run: every document that arrives, through any door, is put on the right job, customer or supplier, its key details typed in, and filed once. Anything that needs a person goes on one list. By the end of the day every document is filed or on that list, and nothing is in between. Written so you can build it yourself.

Used by

  • Office Administrator
  • Office Manager
  • Data Entry Clerk
  • Records Officer
  • Administration Assistant

11 min read · Published by AI Pathway

Using Claude? This standard installs as a skill. Guides for ServiceM8, Xero and Simpro.

What this is

An open build standard for the daily office run. Every document that arrives (an emailed invoice, a scanned docket, a photo from site, a web form) is put on the right job, customer or supplier, with its key details typed in, once.

The core rule

A document goes to a record only by a job, order or account number printed on it. No number, or a number that fits two records or none, and it goes to one list for a person.

What it does not do

It never answers anyone, never pays or approves, never guesses a value it cannot read, and never overwrites what the record already says. It files and it types in, and that is all.

The hard part

Not the reading. Landing each document on the one record it belongs to inside the job system the office actually uses, entering details there without overwriting anything, and closing the day so a missed run shows.

Monday, 8am. The office administrator opens the inbox to forty attachments over the weekend, a stack of dockets someone left on the desk from the ute, and three web forms. There is a photo of a delivery docket from site with no job number on it, and nobody is sure which job it belongs to. The same supplier invoice came in by email and again through the copier. By Friday half of it is filed, some of it twice, and the rest is in a pile that nobody can say the size of.

Every door, one run, one list

  1. A document arrives through any door: an email attachment, a scan from the copier, a phone photo from site, a web form or a supplier portal download.
  2. It is counted first, with the door it came through, the time and a fingerprint of the file.
  3. It is given exactly one kind from the list the business wrote. A document that is none of them goes to the exceptions list.
  4. It is matched to its job, purchase order, customer or supplier by a number printed on it, never by a name or an amount.
  5. The gate: does it fit exactly one record, and does every detail to be entered read clearly, add up, and agree with what the record already holds? If not, it goes to the one exceptions list with a reason and an owner.
  6. If so, its details are entered into the record and the original is filed once against it. A second copy of the same document is noted as a duplicate.
  7. At the close of the day: is everything accounted for, arrived equals filed plus on the list plus duplicates? The close is published either way, a quiet day included, and any gap is named on it for the next run.
The filled diamond is the hard step: the document fits exactly one record and every detail reads clearly, inside the job system the office really uses. A no is not an error, it is the exceptions list. The second diamond is the close, published every working day either way.

Take the spec to Claude, ChatGPT or Copilot. The sentence to paste is one click away.

1. What this standard covers, and what it leaves to others

Documents, from every door, and the data entry that goes with them. Each one is counted as it arrives, given one kind, matched to its job, purchase order, customer or supplier by a number printed on it, has the details the business chose typed into that record, and is filed there once. Anything the run cannot do cleanly goes to one exceptions list with a reason and an owner. At the end of the day the run publishes a close: documents in equals filed plus on the list plus duplicates.

What is out of scope, and where it lives instead. Messages, as opposed to documents, belong to the Inbox Triage standard: one shared inbox, who answers each message, response clocks, complaints and acknowledgements. This standard takes documents from every door, not only the inbox, does the data entry into the record, and never answers anything. It reuses two of Inbox Triage’s rules on purpose, and says so: “Every message gets exactly one kind from a closed list” and “A message about a job or a supplier is filed against that record by id”. Here they apply to documents rather than messages, so an office running both keeps one discipline: a closed list and a record id, never a folder.

A supplier invoice this run files is handed on, not paid. It sits on its purchase order or supplier record, where the Invoice Check standard reads it and decides whether it is right to pay. And making two systems agree, the job system and the ledger say, is the Two Records standard. This standard never reconciles two systems. It borrows one rule from Two Records: “The run publishes on schedule with its counts, including the all-clear”, so a day the run did not happen is visible.

What cannot meet it, and what can. Any job system or CRM that can look a record up by its id and accept an attachment against it: ServiceM8, Simpro, Fergus, AroFlo and Jobber for jobs, and Xero contacts for customers and suppliers. Tradify has no public API, so a build cannot file into it directly. And an office that runs on paper with no record numbers cannot meet check 3 until it starts writing a job number on its paperwork. That one change, a job number on every docket and order, is usually the cheapest win in the whole standard.

Is there a ready-made version? Not yet. No product runs this filing run across every door with the exceptions list and the close. So this standard is a Draft, and the build is yours.

2. Every document is counted the moment it arrives

Five doors, and the first thing that happens at each is a count: which door, what time, and a fingerprint of the file. Nothing is filed, set aside or raised that was not counted first, because the close at the end of the day is only as honest as this count.

DoorWhat comes through it
emailAn attachment in the accounts or admin inbox
scannerA page fed through the office copier
phone_photoA photo of a docket or job sheet sent from site
web_formA form a customer filled in on the website
supplier_portalA statement or invoice downloaded from a supplier's portal

Then each document gets exactly one kind, from a list the business writes. The list below is a starting point; the business may change it, but it stays closed. A document that is none of them goes on the exceptions list as unknown_kind. It never starts a new folder, because a folder called “Misc” is where documents go to be lost.

3. Each one goes on its record by the number printed on it

Each kind says which printed number finds its record and which details are typed in. The business writes this table once. The build reads it and invents nothing beyond it.

KindFound byTyped into the record
supplier_invoiceThe purchase order numberThe invoice number and the total, if the lines add up
delivery_docketThe job numberThe docket number and the delivery date
purchase_orderThe job numberWhatever the business lists; often nothing
signed_quoteThe job numberThe quoted amount and the date it was signed
job_sheet_or_photoThe job numberNothing: filed for the record
certificateThe job numberNothing, or the certificate number
statementThe supplier account numberNothing: filed for the supplier
customer_formThe customer account numberA new email or phone, into a blank field only

Never by a name, an address or an amount. The photo of the docket with no job number names the supplier and the site, and the job system’s search box would happily offer a job at that address. It might even be the right one. But “might” is how a delivery ends up on the wrong job and gets invoiced to the wrong customer, so the docket goes on the list as no_id and a person who knows says which job. A bare “1055” that fits both job 1055 and order 1055 goes on the list too.

Typing in follows the same caution. Every detail for that kind must read clearly, and a total must equal its lines. If one does not, nothing from that document is typed in: the field is named on the list and left blank, never guessed. And if the record already holds a different value (the job says the quote was $4,800, the signed quote says $4,850), the record keeps its value and both go on the list side by side. A document is never allowed to quietly change what the business already wrote down.

4. The records it keeps, in the shape your developer needs

Five objects. The Arrival is the one most builds leave out, and without it the close cannot add up, because nobody counted what came in.

For your developer. Show the fields for your developer
Arrival                           # written first, append only
  - arrival_id, door (email | scanner | phone_photo |
                      web_form | supplier_portal)
  - arrived_at, file_hash, original   # the file as it came in
  - state (counted | filed | duplicate | on_list)
  - duplicate_of (nullable)

KeyingRule                        # written by the business, per kind
  - kind, document_detail, record_field, must_add_up

Filing                            # unique on (kind, document_number, record_id)
  - arrival_id, kind, document_number
  - record_id                       # the job, order, customer or supplier
  - entered [{field, value, cleared_by}]
  - link -> the original, unaltered
  - filed_at

Exception                         # the one list
  - arrival_id, reason (no_id | two_matches | no_match |
      unreadable_field | does_not_add_up |
      conflicts_with_record | unknown_kind)
  - owner, since                    # the list runs oldest first
  - field, document_value, record_value
  - status (open | cleared)
  - cleared_by, cleared_at, cleared_to

DailyClose                        # one per working day, quiet days too
  - day, arrived, filed, on_list, duplicates
  - open_exceptions [oldest first], published_at

A Filing with no Arrival behind it, or an Arrival that is none of filed, duplicate or on the list at the close, is the defect this standard exists to make visible.

5. The checks, in order

The order is the claim. Counting comes before reading, because the close depends on it. The kind comes before the match, because the kind says which number to look for. The match comes before any typing, and the typing stops at the first doubt.

  1. Every document is counted the moment it arrives. Before anything else, each arrival is written down with the door it came through, the time, and a fingerprint of the file. Nothing is filed, set aside or raised that was not counted first.
  2. Each document gets exactly one kind from a list the business writes. Supplier invoice, delivery docket, purchase order, signed quote, job sheet or photo, certificate, statement, customer form. A document that is none of these goes on the exceptions list as unknown_kind. It never starts a new folder.
  3. It is matched to its record by a number printed on it, never by a name or a guess. The job number, the purchase order number, or the customer or supplier account number printed on the document. No number on it, a number that fits two records, or a number that fits none goes on the exceptions list as no_id, two_matches or no_match.
  4. Details are entered into the record only when they read clearly and add up. The details the business chose for each kind (an invoice number and total, a docket's delivery date, a signed quote's amount) are entered only if every one reads clearly and the lines add up to the total. Otherwise nothing from that document is entered, the field is named, and it goes on the list.
  5. A value already in the record is never overwritten by a document that disagrees. If the record already holds a different value, both go on the exceptions list side by side as conflicts_with_record, and the record keeps its value until a person decides.
  6. The same document arriving twice is filed once. An invoice emailed and also scanned is one document. It is recognised by its kind, its own number and its record, not by the file, because a scan and a PDF of the same page never match byte for byte. The second arrival is noted as a duplicate of the first.
  7. The original is kept exactly as it arrived, and linked from the record. The build never edits, renames over or deletes an original. What the record links to is the file that came in, with the same fingerprint it was counted under.
  8. Anything that needs a person waits on one list, with a reason and an owner, oldest first. The reasons are a closed list: no_id, two_matches, no_match, unreadable_field, does_not_add_up, conflicts_with_record, unknown_kind. Each exception has an owner. Nothing that needs a person waits anywhere else.
  9. The run files and enters details, and never replies, pays, approves or sends. Nothing goes to a customer or a supplier. A filed supplier invoice is left on its record for the Invoice Check standard, which decides on paying. Replies and response clocks belong to Inbox Triage. The only message the run sends is to the owner of an exception, inside the business.
  10. The day closes with every document accounted for, published even when it is all clear. At the close, documents in equals filed plus on the list plus duplicates, and the count is published every working day, a quiet day included, so a run that did not happen shows as missing rather than as calm.
  11. A person clearing an exception is recorded, and the document then files as normal. Who cleared it, which record they chose and when. The document is then filed to that record and its details entered from what the person decided, with their name against it.
  12. For any document, where it came from and what happened to it can be looked up. The door and the time, its kind, the record it was filed to, what was entered from it, whether it was a duplicate, and who cleared it if a person had to.
  13. It survives the builder. Someone other than the builder can explain what it does, and it runs on an account the business owns.
  14. The pass test passes. On the business's own job system and inbox: a supplier invoice emailed and also scanned is filed once with one duplicate, a docket photo with no job number and a document changed to disagree with the record each wait on the list with their reason, and the day's close adds up.

The exception reasons, a closed list:

no_idNo job, order or account number printed on it
two_matchesThe number fits two records, say a job and an order
no_matchThe number fits no record
unreadable_fieldA detail to be entered cannot be read; the field is named
does_not_add_upThe lines do not add up to the printed total
conflicts_with_recordThe record already holds a different value; both are shown
unknown_kindIt is none of the kinds on the list

6. The day closes with every document accounted for

At the end of each working day the run publishes one short line: how many documents came in, how many were filed, how many are on the list, and how many were duplicates. The first number always equals the other three added together. Under it, the open exceptions, oldest first, each with its reason and its owner.

It publishes on a quiet day too. “Nothing came in, nothing is waiting” is a real answer, and a missing close is a different one: the run did not happen. Silence must never be mistaken for calm, which is the rule this standard borrows from Two Records.

Duplicates are counted, not hidden. The same invoice arriving by email and through the copier is one document, recognised by its kind, its own number and its record. Not by the file: a scan and a PDF of the same page never match byte for byte, so a duplicate rule built on the file alone files every scanned invoice twice.

7. What stays with a person

  • Clearing every exception: which job a docket with no number belongs to, which of two values is right, what an unreadable figure says. The run records who cleared it, and then files it.
  • Writing the list of kinds and what is typed in for each. The build follows the table; it does not grow it.
  • Every reply to a customer or a supplier. That is Inbox Triage's ground, with its own release step.
  • Deciding a supplier invoice is right to pay. The run files it where Invoice Check reads it.
  • Deleting anything. The run never deletes an original, and neither does any flow it starts.
  • How long documents are kept. The run keeps everything; the business sets its own retention.

8. Run it on what you already use

The run lives beside the job system the office already works in. Three ways, all held to the same checks:

  • Existing tools only. A shared mailbox, the copier’s scan-to-email, and SharePoint lists for the count, the exceptions and the close. The Microsoft 365 plan lays out the lists and flows.
  • A personal dashboard. Hand this page to a coding agent and it builds a small page with today’s count, the exceptions list and a clear button, against the stub until it has to write into the real job system.
  • A long-lived bot. A routine that runs through the day as documents arrive, posts each new exception to its owner, and publishes the close at 5pm.

How to run any standard each of these ways is in run a standard anywhere.

9. What your developer builds, and the step that needs care

One step not to hand-roll: landing each document on the one record it belongs to inside the job system the office really uses, entering details there without overwriting anything, and keeping the original exactly as it arrived. Everything else a coding agent builds against the stub in an afternoon.

For your developer. Show the setup for your developer
provider:
  stub:       local.mock_office_run
  production: none                       # scoped build, not a product

the stub                             # local.mock_office_run
  - a morning's arrivals through five doors, with fingerprints
  - jobs, purchase orders, customers and suppliers by id
  - a search box and a file store, so a shortcut shows
  - one exceptions list, and a person who clears it next day

production: your own systems
  - the job system or CRM: look up by id, attach, enter a field
  - the real inbox, copier and phone photos
  - quoted as a scoped build; no hosted product runs this

stays local                          # yours, and the standard
  - counting, kinds, matching, the exceptions list, the close
  - clearing an exception, which is a person's, always

cannot meet the standard
  - a job system with no way to attach a file by record id
  - paperwork with no job, order or account number on it

A vendor selling document capture is usually selling the reading. Ask them three things: what happens to a docket with no job number, what happens when the document disagrees with what the job already says, and where the count of what arrived today is published.

The pass test. On your own job system and inbox. Forward one real supplier invoice to the inbox and scan the same invoice on the copier. Photograph a delivery docket with no job number on it. Take a copy of a signed quote or invoice, change one amount so it disagrees with what the record says, and send it in. Then let the day close. Expect one filing of the invoice with its details entered once, one duplicate noted, two exceptions on the list (no_id and conflicts_with_record), the record still holding its own amount, and a close where arrived equals filed plus on the list plus duplicates. If the docket was filed to a job, or the record now shows the changed amount, the build guessed, which is the failure this standard exists to prevent.

10. A checklist to hold any build or supplier to

Hold a DIY build or a vendor to this. If a box is empty, it is not in production.

  • 1. Every document is counted the moment it arrives. Before anything else, each arrival is written down with the door it came through, the time, and a fingerprint of the file. Nothing is filed, set aside or raised that was not counted first.
  • 2. Each document gets exactly one kind from a list the business writes. Supplier invoice, delivery docket, purchase order, signed quote, job sheet or photo, certificate, statement, customer form. A document that is none of these goes on the exceptions list as unknown_kind. It never starts a new folder.
  • 3. It is matched to its record by a number printed on it, never by a name or a guess. The job number, the purchase order number, or the customer or supplier account number printed on the document. No number on it, a number that fits two records, or a number that fits none goes on the exceptions list as no_id, two_matches or no_match.
  • 4. Details are entered into the record only when they read clearly and add up. The details the business chose for each kind (an invoice number and total, a docket's delivery date, a signed quote's amount) are entered only if every one reads clearly and the lines add up to the total. Otherwise nothing from that document is entered, the field is named, and it goes on the list.
  • 5. A value already in the record is never overwritten by a document that disagrees. If the record already holds a different value, both go on the exceptions list side by side as conflicts_with_record, and the record keeps its value until a person decides.
  • 6. The same document arriving twice is filed once. An invoice emailed and also scanned is one document. It is recognised by its kind, its own number and its record, not by the file, because a scan and a PDF of the same page never match byte for byte. The second arrival is noted as a duplicate of the first.
  • 7. The original is kept exactly as it arrived, and linked from the record. The build never edits, renames over or deletes an original. What the record links to is the file that came in, with the same fingerprint it was counted under.
  • 8. Anything that needs a person waits on one list, with a reason and an owner, oldest first. The reasons are a closed list: no_id, two_matches, no_match, unreadable_field, does_not_add_up, conflicts_with_record, unknown_kind. Each exception has an owner. Nothing that needs a person waits anywhere else.
  • 9. The run files and enters details, and never replies, pays, approves or sends. Nothing goes to a customer or a supplier. A filed supplier invoice is left on its record for the Invoice Check standard, which decides on paying. Replies and response clocks belong to Inbox Triage. The only message the run sends is to the owner of an exception, inside the business.
  • 10. The day closes with every document accounted for, published even when it is all clear. At the close, documents in equals filed plus on the list plus duplicates, and the count is published every working day, a quiet day included, so a run that did not happen shows as missing rather than as calm.
  • 11. A person clearing an exception is recorded, and the document then files as normal. Who cleared it, which record they chose and when. The document is then filed to that record and its details entered from what the person decided, with their name against it.
  • 12. For any document, where it came from and what happened to it can be looked up. The door and the time, its kind, the record it was filed to, what was entered from it, whether it was a duplicate, and who cleared it if a person had to.
  • 13. It survives the builder. Someone other than the builder can explain what it does, and it runs on an account the business owns.
  • 14. The pass test passes. On the business's own job system and inbox: a supplier invoice emailed and also scanned is filed once with one duplicate, a docket photo with no job number and a document changed to disagree with the record each wait on the list with their reason, and the day's close adds up.
  1. 1

    Hold the build to the checklist

    The checks in this standard are what a working build looks like. Implement it yourself, hand it to a developer, or hand the page to an AI with the button below.

  2. 2

    Do not hand-roll

    There is no product for this step. Highest option: none. Checklist plus a build.

  3. 3

    If you are stuck

    Exceptions, three systems, a team that will not maintain a Zap, or an owner who wants it done. We implement when it has to survive the business.

Building this on Microsoft 365: the lists, the flows and the daily close.

Related reading

Want the whole thing by email?

This paper, plus the rest of the library. One click to stop them.

Run these checks yourself

Every check on this page is published as structured data. This prints them with what to inject, what to assert, and which ones can be proved on your own machine rather than against the live thing.

npx @aipathway/conformance show document-filing-build-standard

Free and open source, CC BY 4.0. The checks are fetched from this page rather than bundled, so a correction here reaches you without a release, and you cannot end up conformant against a stale copy. The raw JSON is there if you would rather wire it into your own harness, and the package shows how to drive your build through the ports.

Built it, and one check failed?

Tell us which one. You have already read the standard and tried it, so the answer is a fixed price to finish that step, not a call to work out what you need.