All posts

Coding, close, and accuracy

GL coding for property management: building a chart of accounts that codes itself

Coding automation learns from your history, so an inconsistent chart of accounts produces a faster inconsistent chart. Fix the GL first, then automate it.

The BillRoute Team9 min read

Coding automation is trained on how your team has coded before. That is the whole mechanism, and it is also the catch.

If two properties code the same expense to different accounts, a model learns both and applies whichever it saw more of. You get an inconsistent chart of accounts, applied faster and more confidently than a human would have applied it.

So the sequence matters. Fix the GL, then automate it.

Four conditions make a chart of accounts codable

Not "clean." Codable. The difference is that codable means a machine can reach one answer from the invoice in front of it.

One expense, one account, portfolio-wide. If HVAC filter replacement is 5290 at one property and 5155 at another, no amount of training resolves it, because both are correct according to somebody.

Account descriptions that describe the expense, not the history. "5305 Contract Services" is codable. "5307 Misc - see Sandra" is not, and every portfolio has one.

A capital threshold everybody applies the same way. The line between R&M and capital is a policy, and if it lives in three people's heads you will find it at close.

Vendor-to-account defaults that hold. A landscaping vendor should map to a landscaping account by default and require a reason to deviate. Where a vendor legitimately spans accounts, the split should be at line-item level rather than a coin flip on the header.

The failure mode is a vendor who spans accounts

Most coding is boring. One vendor, one account, done.

The interesting case is the vendor who does three different things. A general contractor who paints a unit, repairs a roof, and replaces an HVAC compressor on the same invoice touches make-ready, capital, and R&M in one document.

Header-level coding cannot represent that. You pick one account and the other two are wrong, or you split the invoice by hand every time.

Line-item coding is the only honest answer. BillRoute codes at the line-item level for exactly this reason, so a single invoice covering paint at one property and a punch list at another splits across both accounts rather than landing in one.

Validate against the systems of record, not against a rule table

Coding without validation moves the problem downstream rather than solving it.

Four checks, all against something authoritative rather than a list somebody maintains:

Supplier code against the supplier master. A vendor that does not exist yet is a setup task, not a coding decision.

Property code against that property's chart of accounts. Not every account exists at every property, particularly across affordable and conventional assets.

Line prices against the matched purchase order, where one exists.

Three-way match where goods receipt is required, which is a different question from price matching and gets its own post.

BillRoute syncs vendors, properties, and the chart of accounts from ResMan in real time. That matters more than it sounds: a batch sync on a several-hour cycle means an invoice can validate against a supplier record that has since changed, and you find out at close.

The five error types tell you what to fix

An error queue is only useful if it names the failure. Ours reports five, and each points at a different owner:

Supplier code mismatch. Usually a vendor setup gap. Procurement's problem.

Property code mismatch. Usually a chart of accounts gap at one property. Accounting's problem.

Price mismatch. The invoice disagrees with the PO. Either the vendor is wrong or the PO was never updated. Operations' problem.

Missing invoice number. Almost always a document quality issue, common on handwritten field invoices.

Failed extraction. The document could not be read. Sometimes a bad photo, sometimes a layout the template has not seen.

Sorting your error queue by type once a month tells you which of those four owners has a systemic gap, rather than treating every exception as a one-off.

Run this diagnostic before you automate anything

Pick your three highest-volume vendors. For each, pull twelve months of invoices and list every GL account they were coded to.

If a vendor hits more than two or three accounts and the pattern is not explainable by line-item content, you have found your inconsistency. That vendor is where automation will be least reliable, because the history it learns from disagrees with itself.

Fixing that costs a conversation and a mapping decision. It is also the best hour you will spend, because it is the difference between coding automation you can trust and coding automation you have to check.

Which of your top vendors codes to the most accounts?

Keep reading

Coding, close, and accuracy

The multifamily month-end close checklist, AP section

Close is late for two reasons: AP is still coding, and nobody can see what has not posted. Six things have to be true on the last day, and each is a query rather than a conversation.

8 min read