September 14, 2026
POSM compliance tells us whether the promotional material in a store matches the promotion the brand funded: the right asset, carrying the right offer, applied to the right products, in the right place.
Notice how much of that sentence is relational. Not "is there a poster," but "is this the poster we paid for, saying what we agreed, over the products it was meant to sell." Every clause is a comparison against a plan.
Trade spend can reach 27% of revenue [9]. On many P&Ls it is the single largest line after cost of goods and it has spent most of its life as the least verified one. Materials shipped is not materials deployed. A display that never went up, or went up in the wrong place at the wrong price, still consumed the money.
The gap is not subtle when someone finally measures it. In one analysis at a major beverage bottler, head office assumed promotional compliance was running at roughly 90%. When the images were examined, the real figure was closer to 50%. Half of a funded, planned promotion was not running as designed and until the data existed nobody could say which half.
So the appetite for automated POSM verification is entirely rational. The value only lands, though, when a verified read is precise enough to change a spending decision.
Open-vocabulary detection, specialised OCR and frontier vision-language models are very good at this. Without ever having seen your artwork, they will tell you a display is present, whether it is a floor unit or a shelf strip and that the sign reads two for three pounds, across languages and through partial occlusion.
We use the same tools: OCR and large vision models, with extraction treated as configurable rather than fixed. In our platform a recognised concept carries a set of modalities (think of them as rich properties), each returning ranked predictions with a confidence score and a main value.
And parts of it are commoditised. PaddleOCR is Apache 2.0 and runs on a CPU [11]; Qwen3-VL reads a shelf edge about as well as most hosted APIs. Open weights now match or beat the closed models on the document-parsing leaderboards [2][4][5].
Which is why the category keeps concluding that POSM recognition is solved. It isn't. If reading a document is close to solved by weights you can download, reading the poster is not where a POSM programme is won or lost. Detection and extraction are steps one and two of five. The three above them are where compliance lives.
Steps one and two a general model handles well. Compliance is answering the rest: three, four and five.


Every case pack is detected and bounded. The promotional label is detected as its own concept. And the extraction returns the shelf price, the qualifying quantity, the composite price-quantity value and the offer text.
Note what is not there. The label matched no catalogue item. It is marked Unknown, with no product reference at all. Nothing about this asset had to be onboarded in advance.
The offer text on its own is not enough to close anything off. "Buy 2, get 1 free" could apply to the 12-packs beneath it, the single cans on the next shelf, or the whole bay. Trade spend is committed against specific SKUs, so the association has to be made at that level before a campaign can be settled.
That is what the spatial reasoning does here. Containment within the display region, the geometry of the stack and the SKU-to-promo association together let us say the offer governs the 12-pack SKUs in that display and not the ones around it. From there you have, at store level and with no promo catalogue to maintain: the shelf price, the offer, the mechanic in structured form and the list of SKUs it applies to.
Point that at a trade promotion calendar and you can answer the question trade marketing actually asks: is the promotion we funded live in this store, on the products we funded it for, at the price we agreed, this week? Yes or no, per store, with photographic evidence attached. That is a claim you can close a campaign against.



The fixture decomposes into shelf rows and the modalities on the selected runner read:
4.5_2 is the line to dwell on. "2 for $4.50" has become a value and a qualifying quantity. It is a mechanic that can be compared to a plan and to other mechanics, regardless of how the retailer chose to word it.
realogram:shelf: 2 places it on a specific row. fixture: cold distinguishes a cold door from an ambient display, so the same recognition stack reports both without needing a separate product.
Then the part the display example could not do. The runner is matched to a specific catalogue asset (a particular promotional runner, not just "a runner"), with the detected crop shown against the catalogue reference so a person can confirm or reject it.
This matters most to marketing. Shopper activation is supposed to carry the brand campaign into the store and whether it did is a question about which creative went up, not whether some promotion did. A brand team running a seasonal or licensed campaign needs to know their asset is the one on the fixture, in the accounts they paid for. Without asset identity, shopper activation and brand marketing are measured on separate evidence and nobody can say whether the two were ever aligned.

Look closely at the two thumbnails, because this is the whole argument in one screenshot. The detected runner is the 24oz strip carrying 2 for $4.50 and $2.89. The catalogue reference beside it is a 20oz runner at $2.49. Two red Coca-Cola shelf runners, same brand, same visual language, different pack size and different price point.
That is exactly why the confidence is 54% and not 95%. It is exactly the case the earlier sections were about. A system that returns one confident label would have quietly booked this as RUNNER_COKE and moved on. Every number downstream would have inherited the error. Instead the ambiguity is visible, both candidates are on screen and a person decides.
Fifty-four percent is not a figure most vendors would put in a screenshot. It is the right one to show. It is honest about a genuinely hard discrimination task and it demonstrates the behaviour that matters more than any accuracy headline: when the system is unsure, it says so.
Why that last step is worth paying for is the subject of the last section. First, the two steps in between.
A promotion is a structured concept: a mechanic type, a qualifying condition, a value, a scope. Reading the text off a poster is only the first step. The mechanic still has to be resolved and where that resolution happens decides whether the data is usable.
Consider what an ordinary grocery aisle contains:
And the trap that decides whether your compliance data is usable at all:
"Three for two" and "buy two get one free" are the same offer. "Two for £3" and "£1.50 each when you buy two" are the same offer. A system that compares extracted text sees four different promotions.
If a compliance engine treats wording variants as distinct mechanics, the compliance rate is not slightly wrong. It is arbitrary. Stores get flagged non-compliant for running exactly the funded offer in the retailer's own house wording. Someone spends a field visit correcting a display that was already correct and the promotion that genuinely failed two aisles over goes unreported.
Our pipelines are built from modalities and a modality is not a fixed column in a schema. It is something you define. And critically, you can constrain its output to a specific vocabulary.
A free-text modality returns whatever the sign happens to say. A constrained modality can only return a value from a list you define. Nothing outside it is a valid answer.
So rather than extracting "buy 2, get 1 free" as text and hoping a downstream rule recognises it, you define a mechanic modality whose vocabulary is the set of mechanics that actually exist:
"Three for two" and "buy two get one free" cannot come back as different mechanics, because no such output exists. The ambiguity is never created, so nothing downstream has to resolve it. That is the difference between a system that reports promotions and one you can trust to compare them.
A mechanic is not a fixed field we ship. We build it out of modalities and modalities are flexible: you choose which ones apply and you choose what each one is allowed to return. Which means the vocabulary can be the customer's own taxonomy, the mechanic types their trade promotion system already uses.
If a brand's TPM platform recognises eleven mechanic types, the modality is constrained to those eleven. The recognition output is then directly joinable to the trade promotion calendar: no mapping layer, no reconciliation table, no semantic drift between what the model reports and what the planning system means. Two teams stop arguing about whether a "multi-buy" in the compliance report is the same thing as a "multi-buy" in the promo plan.
That is what a shared execution signal has to mean in practice. Not a dashboard everyone looks at, but a vocabulary everyone's systems already speak.
In the earlier piece on the CPG ontology I described associating a price to the nearest SKU within a region of interest. In messy real-world environments, that can break:
Proximity alone won't do it. You need containment within a region of interest, fixture geometry, shelf-row decomposition and the catalogue binding that turns a detected shape into a specific product.
And you need the plan as an input, not just as the thing you compare against afterwards. Knowing which SKUs the promotion was meant to cover turns an open question (what might this sign refer to) into a narrow one: does the evidence support the association the plan asserts.
The out-of-stock case shows why it matters. Material present, offer correct, product absent. Step two calls that display compliant, because everything visible is right. Step four calls it the most urgent fix in the store.
Two pieces of promotional material can carry identical text and be operationally different things:
In every one of those, the words are the same and the thing is different. Which gives the claim this section exists to make:
The text on a poster is not the identity of the asset. When the difference between two assets is not in the text, no amount of reading the text recovers it.
That is not a competitive point. It is a statement about recognition in general and it constrains us exactly as much as anyone else. A model cannot reliably distinguish two things it was never shown to be distinct. You can get lucky on incidental cues (a layout difference, a logo placement) but you cannot systematically resolve an identity you have no reference for and a compliance programme cannot run on luck.
This is also where ranked predictions earn their place. When two onboarded variants are genuinely close, the useful output is not a confident single label. It is the top candidates with their scores, so the ambiguity is visible and routes to review rather than resolving silently into whichever variant happened to win. A system that only ever returns one answer cannot tell you when it nearly returned a different one.
The same problem is arriving from another direction, incidentally. Packaging design across large portfolios has been converging, with sugar and flavour variants of the same brand made deliberately more similar. Near-identical discrimination is getting harder, not easier. The industry's own design trend is working against the idea that you can skip the reference set.
Everything above the identity step verifies an offer. The identity step verifies an asset. The asset is frequently the thing being paid for.
Credits. A brand agrees to pay a retailer a credit for displaying a specific promotional runner, in that fixture, for that period. The credit is not owed because a promotion was displayed. It is owed because that asset was. Verifying the offer text does not discharge the obligation. Identifying the asset does.
Customer marketing agreements. A CMA commits the brand to a set of in-store executions with funding attached to named elements. Settling one requires knowing which of several near-identical runners was actually up. Two runners can advertise the same offer, sit in different agreements, at different values, for different periods.
So "no catalogue needed" is not simply a faster route to the same place. Extraction tells you the promotion ran. Identification tells you which funded asset delivered it: the question a credit or a CMA settlement turns on. One is compliance reporting. The other is money.
The objection that makes "day one, no catalogue" attractive is real and deserves a real answer. Building a catalogue by photographing everything in the field genuinely was slow and for years that was the honest price of accuracy.
That has changed and the shape of the change is visible in how the catalogue is structured. A catalogue item is the product identity: barcode, brand, size, flavour, container type, packaging size. Beneath it sit variations, each a distinct visual appearance of that item. Beneath each variation sit seeds, the visual evidence the model learns from, typed as a thumbnail, a synthetic render or a real photograph.
Two consequences matter commercially.
Variation is a first-class level in the model, not an edge case. Near-identical-but-different is where the data structure begins, rather than something patched in later.
A variation can be onboarded from artwork or from synthetic renders. You do not need a field photograph of an asset to recognise that asset. Which is why new SKUs onboard inside a day and a catalogue goes live in weeks rather than quarters.
So "you would need a catalogue" is no longer a cost objection. It is a design choice. The vendors leaning hardest on avoiding it are optimising away the one structure that resolves variant identity.
It is worth adding that the catalogue is governed rather than a free-for-all: entries can run through moderation, with defined validation on what is allowed in. If the catalogue is the reference every compliance number depends on, who is permitted to change it is not an administrative detail.
And it reframes onboarding entirely. Onboarding a runner is not overhead accepted for tidiness. It is what makes the asset a payable, auditable object. If a brand pays credits against specific POSM, the reference set is not administrative cost. It is the ledger.
The Execution Maturity Ladder in our pillar piece runs from no data at all to fully connected execution. It maps onto these steps almost exactly.
Steps one and two get a programme to Level 2, digitised capture: you have images and descriptions of what is in them. Useful and a long way from nothing.
Levels 3 and 4 need steps four and five: corrections delivered by the next visit and rules replacing rep discretion. You cannot instruct a rep to fix a specific thing you cannot specifically name. "Something promotional here looks wrong" is not an instruction. "This is last quarter's header card, the current one is in the stockroom and the price should read two for three pounds" is.
I want to be careful not to argue against something that works. Reading a display with a general model is real, we do it and anyone dismissing it is selling you something.
But there is a pattern worth naming. Every few years a capability arrives that handles the visible nine-tenths of a problem and the category briefly agrees the problem is finished. What's left is the tenth the plan actually depends on: not what the sign says, but which sign it is and what it applies to. That tenth is where the trade money sits.
The part I find most interesting is that the hard problem is often solved by narrowing rather than by scaling. Constraining a model's output to the vocabulary a business already uses does more for the reliability of a compliance number than another few points of raw extraction accuracy ever will. The most powerful solutions usually are the simple ones.
If you take one question into your next vendor conversation, make it this: show me two of my own promotional assets that read the same and are different, then tell me which is which. The answer tells you which step you are buying.
Earlier in this series: the CPG ontology behind the extraction · where image recognition sits in the CPG tech stack
POSM compliance is whether the promotional material in a store matches the promotion the brand funded: the correct asset, carrying the correct offer, applied to the correct products, in the correct location. It is a comparison against a plan, not a description of a photograph.
It can detect promotional material and read what is printed on it without any catalogue and that is genuinely useful for discovery and for cold-start coverage at a campaign launch. It cannot reliably tell you which of several near-identical versions of an asset is present, or which specific SKUs an offer governs, because neither is recoverable from the image alone.
Because textual similarity and offer identity differ in both directions. "Three for two" and "buy two get one free" are the same offer expressed differently, while two posters reading "two for £3" may be different funded assets from different quarters. Systems that compare extracted text rather than resolved mechanics get both cases wrong. Constraining the mechanic to a fixed vocabulary removes the first problem entirely; a reference catalogue is the only thing that addresses the second.
Ask instead what the accuracy is measured on. Detecting that promotional material is present is a much easier task than identifying which version of an asset it is and a single headline figure usually reflects the former. Ask for the number on the hard cases: near-identical variants, promotional material governing out-of-stock products and multi-tier offers.
With artwork or synthetic renders as the input rather than field photographs, a new asset can be onboarded in hours and new SKUs inside a day. The historic assumption that a catalogue takes months is what makes "no catalogue needed" sound like a good trade and it is the assumption that has changed.
Industry insights, retail intelligence and field-tested execution playbooks, so you always know what's happening in store.