Why Your Policy Numbers Never Match the Carrier's
You'd think the policy number would be the one thing everyone agrees on. It's the unique identifier. It's printed on the dec page. The carrier issued it.
And yet a surprising share of the unmatched lines on any commission statement come down to a policy number that is technically the same policy and looks nothing like what's in your management system.
The good news is that the ways policy numbers drift are limited, and they repeat. Once you know the patterns, you can write rules for them.
How the drift happens
A few common causes:
Prefixes and suffixes. The carrier's internal number might be HO 4472918 03, where HO is the line of business and 03 is the term or version. Your AMS might store 4472918, or HO4472918, or the full thing with spaces. All four refer to the same policy.
Leading zeros. One system stores 0083321, the other stores 83321. Spreadsheets are especially bad here, because they quietly convert anything that looks like a number into a number and throw the zeros away.
Punctuation and spacing. Dashes, slashes, spaces, periods. CA-221-0098 and CA2210098 are the same string once you strip the dashes, but an exact-match lookup won't know that.
Letters that look like digits. The letter O and the digit 0. Capital I, lowercase l and the digit 1. If anyone ever typed a policy number from a paper dec page, this has happened somewhere in your book.
Renumbering at renewal. Some carriers keep the same base number and bump a suffix each term. Others issue a completely new number at renewal. If your system still has last year's number, the renewal commission has nowhere to land.
Rewrites and conversions. When a policy moves to a new program or a new company within the same carrier group, the number often changes entirely. More on that below.
A set of normalization rules
Normalizing means converting both sides (your AMS data and the carrier's statement) into the same canonical form before you compare them. You never change the original values; you compare the normalized copies.
Here's an order that works well. Apply each step to both sides.
- Convert to uppercase. Removes the case problem entirely.
- Strip whitespace and punctuation. Remove spaces, dashes, slashes, periods and underscores. Keep only letters and digits.
- Strip known prefixes per carrier. Build a small table: for each carrier, which leading letter codes are line-of-business markers. Only strip prefixes you've confirmed for that carrier. A blanket "remove all leading letters" rule will create false matches.
- Separate the term suffix. For carriers that use a term or version suffix, split it off into its own field instead of deleting it. You want to match on the base number but still know which term a line belongs to.
- Strip leading zeros from the numeric part. After the prefix is gone,
0083321and83321both become83321. - Leave O/0 and I/1 alone at first. Don't substitute these automatically in your primary match. Use them only in a fallback pass (see below), because blind substitution can merge two genuinely different policies.
Do this and you'll usually see the unmatched pile shrink noticeably on the first run. How much depends entirely on how messy your data entry has been over the years.
Matching in passes, not all at once
The mistake people make after normalizing is to throw every fuzzy rule into one step. Then something matches and nobody can say why.
Run matching in passes, from strictest to loosest, and record which pass produced each match:
- Pass 1: exact match on the normalized base number plus carrier.
- Pass 2: normalized base number plus carrier, ignoring the term suffix, and only if the effective dates line up with a single term in your system.
- Pass 3: O/0 and I/1 substitution, carrier must match, and the insured name must also match closely.
- Everything else: goes to a human.
The last bucket shouldn't be big. If it is, look at what's in it before adding another rule. Often it's one carrier doing something odd, and one carrier-specific rule fixes dozens of lines at once.
Fix the source, not just the symptom
Normalization rules let you match today's statement. They don't stop the mess from growing.
A few habits help:
When a renewal comes in with a new number, update the policy record right away and keep the old number in a "prior policy number" field. Matching against both current and prior numbers catches the late commission that the carrier attributes to last year's term.
Decide on one way to enter policy numbers in your AMS, write it down, and make it part of onboarding for anyone who touches policy data. Exactly as printed on the dec page, including prefixes, is usually the safest choice, since normalization can always strip information but can never add it back.
Format the policy number column in any spreadsheet you use as text before you paste anything into it. This one setting prevents most of the leading-zero damage.
And keep a short log of each carrier's quirks. Which ones renumber at renewal, which ones put the line of business in front, which ones add a version suffix after an endorsement. That list is worth more than it looks, especially the day the person who knows it all by heart goes on vacation.
If you'd rather not maintain all of this by hand, PolicyBalance applies per-carrier normalization and passes like these automatically. Either way, the logic is the same, and it's worth understanding even if a system is doing it for you.
Get new articles by email
Practical writing on reconciliation, commissions, and trust accounting. Roughly weekly. Unsubscribe in one click.