Product recognition
When a member uploads a receipt photo, IncentIA reads each line (for example YOG NAT 4X125G) and matches it to a product in your catalogue. This screen keeps that matching reliable: you load your product master, review what the system is unsure about and check how much is recognised without help. Menu: Product recognition.
Product recognition permission to view the screen · Editing product recognition to act (import, accept, ignore, add or delete receipt names, disable, change thresholds). Tenant accounts only.
Without the edit permission you can see the data, but not the action buttons or the threshold editor.
How it works
- Each receipt text is normalised (uppercase, no accents,
4X125Gformat) and looked up among the known receipt names (the Aliases tab): receipt texts that already point to a product, optionally per retail chain. - If the text does not match with confidence, the system stores a suggestion (candidate) with a confidence score and leaves it in Pending.
- When you accept it, the text becomes a known receipt name and later identical lines are recognised automatically.
The score is shown as a percentage with a colour: green if it reaches the auto-accept threshold, amber if it reaches the review threshold, and grey if it is lower or there is no suggestion. Thresholds are edited in the Metrics tab.
Typical flow
- In Products, click Import products and upload your master (see Importing products). Products and their initial receipt names are created.
- As receipts arrive, doubtful lines show up in Pending.
- Review each text: Accept the suggestion, Pick product if it is another one, Ignore or Not ours. For high-confidence suggestions use Bulk accept.
- In the Aliases tab (receipt names) fix what was learned (disable, split) or add one by hand, and in Conflicts resolve ambiguous texts.
- In Metrics check the auto-recognition coverage and tune the thresholds.
Tabs
Pending
This is the landing tab. It groups suggestions awaiting review by receipt text, most frequent first.
| Column | What it is |
|---|---|
| Receipt text | A sample of how the line appears on the receipt. |
| Occurrences | Times the text has been seen. |
| Chains | Retail chains where it appears. |
| Suggestion | Proposed product and its confidence score. |
Filters: text search and a chain dropdown (All chains).
| Action | What it does |
|---|---|
| Accept | Creates the receipt name pointing to the suggested product. Disabled when there is no suggestion. |
| Pick product | Opens a lookup to assign a product other than the suggested one. |
| Ignore | Discards the suggestion without teaching the system anything. |
| Not ours | Marks the text as a product that is not yours (after confirmation). If a product was suggested, a negative receipt name is stored so it is not proposed again. |
| Bulk accept | Accepts at once every suggestion scoring at or above the Accept suggestions from slider (50 % to 100 %). It respects the chain filter and asks for confirmation. |
Each operation handles at most 500 items and reports how many were processed.
Aliases
Known receipt texts and the product they point to.
| Column | What it is |
|---|---|
| Receipt text | Normalised receipt name text (with a Disabled mark when it is). |
| Product | Product it points to. |
| Chain | A specific chain, or All chains if it applies to any. |
| Source | Manual, OCR (EAN), Learned, AI (LLM), Import or Backfill. |
| Confidence | Receipt name confidence. |
| Confirmations / rejections | Times it was confirmed or corrected by hand. |
Filters: text, chain, source, confidence (≥ 90 % or ≥ 60 %) and state (Active / Disabled).
Row actions: Disable / Enable (a disabled receipt name stops being used, without deleting it), Delete (only on Manual ones; asks for confirmation with “Delete this manual receipt name?” and removes the record) and Split, for an ambiguous text that means a different product in each chain: pick one product per chain with Add chain.
Products
Your product master for recognition.
- Two indicators: Products with barcode and Products with alias (percentage of the total).
- A table with Name (and variant), Size, Barcodes (the primary one highlighted) and the number of Aliases. Inactive products are dimmed.
- Text search and the Import products button (edit permission only).
Conflicts
Receipt texts that, within one chain, point to several products at once, with each receipt name's confidence and confirmations/rejections. If there are none you will see «No conflicts: no receipt text points to several products». To resolve them, go to Aliases and disable or split the extra one.
Metrics
Summary for the chosen period (Period (days): 7, 30 or 90; 30 by default) over the receipt lines processed:
| Indicator | What it measures |
|---|---|
| Auto-match coverage | Share of lines recognised without human intervention. |
| Unknown lines | Lines that could not be matched to a product, with their trend per day. |
| Manual overrides | Rejections recorded on receipt names in the period. |
| Estimated precision | 100 % minus corrections over the automatically recognised lines. It is an estimate, not an exact measure. |
| Top chains without aliases | Where to start reviewing or importing receipt names. |
This screen only counts lines; it does not list them one by one. If you see «No receipt lines in this period yet», no receipts have been processed yet.
This tab also holds the Confidence thresholds editor (edit permission only):
| Field | What it does | Default |
|---|---|---|
| Auto-accept from | Score from which a line is accepted without review. | 0.90 |
| Review from | Minimum score for it to be proposed as a suggestion to review. | 0.60 |
| Confirmations to learn an alias | Human confirmations a learned receipt name needs to apply on its own. | 1 |
| Require double human confirmation | Asks for a second confirmation before learning. | Off |
Both thresholds must be between 0 and 1, and Review from cannot exceed Auto-accept from. Values are per account.
Products without a barcode
The EAN is not required. Many receipts do not print one, and each line is still matched. For every line IncentIA tries these steps in order and keeps the first one that gives an answer:
- EAN, if the receipt prints one that matches a product in your master.
- Chain receipt name: a text already known for that store chain.
- Global receipt name: a text already known that applies to any chain.
- Text similarity: the line is compared with your product names, taking size and, when available, price into account.
- Meaning-based search and, as a last resort, AI. Both are optional and off by default; when they are not enabled this step is skipped. Whatever they propose is always reviewed by a person.
If the text matches a known receipt name the line is recognized immediately. If there is only text similarity or an AI proposal, the line is proposed and a person confirms it; it goes to Pending instead of being accepted automatically. If two products score almost the same, it is not decided automatically either.
One product, many names
The same product shows up under different names depending on the chain or receipt. Each name is a receipt name (the tab and counters on the screen call it “alias”): a normalized receipt text, the product it points to and, optionally, a specific chain. A product can have as many receipt names as you need. They are created in these ways:
| Way | How it works |
|---|---|
| Import | Importing products generates receipt names from the name, variant and size. They apply to all chains. |
| Pick product | In Pending, assign a specific product to the text with Pick product. The receipt name is created with your confirmation. |
| Split | In Aliases, Split assigns an ambiguous text to a different product per chain. The new receipt names are marked Manual. |
| Learned during review | When you confirm or correct a receipt line in evidence review, the text becomes a receipt name of that product for that chain (source Learned). |
| Add receipt name | In Aliases, you type it by hand (see Adding a receipt name by hand). Source Manual. |
| Candidate list | Pending gathers texts that keep appearing unrecognized, with a suggested product if there is one. Accept or Ignore them one by one, or use Bulk accept. |
Adding a receipt name by hand
In the Aliases tab, the Add receipt name button (edit permission only) opens a form with three fields: Product, Receipt text (the name “exactly as printed on the receipt”) and Chain (default All chains). On save it is created with source Manual and 100 % confidence. The text is normalised the same way as receipt lines. It is rejected when:
- The text is empty: “Enter the ticket name as it is printed on the receipt.”
- Another product already uses it in that chain: “That ticket name already belongs to another product for this chain. Remove it there first.” (a disabled one does not count).
- It is marked as negative for that product (“not this product”): “That ticket name is marked as «not this product» for this product. Remove that mark first.”
- The chain does not exist: “Retail chain not found.”
If a disabled receipt name already existed for that product and chain, it is re-enabled as Manual instead of being duplicated.
Deleting a manual receipt name
Delete only appears on Manual receipt names (added by hand or created with Split). After confirmation it is really removed and cannot be undone. For other sources use Disable.
When a receipt name applies on its own
Receipt names learned by the machine (source Learned or AI (LLM)) are not applied automatically until they have the human confirmations set by Confirmations to learn an alias (default 1). Until then the line is proposed for a one-click confirmation. Manual and import receipt names apply directly.
- If the receipt also prints an EAN that matches the receipt name's product, one confirmation is enough.
- With Require double human confirmation, every non-manual receipt name needs at least 2 confirmations from different people, and the EAN shortcut no longer applies.
- Accepting a suggestion in Pending counts as a human confirmation.
Negative receipt names and expiry
- Negative receipt name. Not ours states that a text is not that product. It is stored as a receipt name marked Negative, and the system never proposes that product for that text again. If the text matches no other product, the line stays unknown.
- Expiry. A daily process lowers the confidence of receipt names that have not been seen on any receipt for a long time. A receipt name that was never confirmed and has been rejected repeatedly is disabled. Nothing is deleted: you can Enable the receipt name again in the Aliases tab.
Example
Your brand sells "Plain yogurt 4x125 g". The chain is fictional: "North Supermarkets".
- You import your master. The product already has import receipt names such as
PLAIN YOGURT. - A North Supermarkets receipt arrives with the line
YOG NAT 4X125Gand no EAN. There is no exact receipt name, so the system compares the text and proposes "Plain yogurt 4x125 g". It sits in Pending with its score. - A person clicks Accept. The receipt name
YOG NAT 4X125Gis created for North Supermarkets, pointing to that product. - On the next receipt from that chain the same line is recognized on its own.
- Later you see that at another fictional chain, "South Stores", the text
YOG NATis a different product. With Split you assign each chain to its product.
Importing products
In Products › Import products. It is a three-step wizard.
- Upload and read file. A
.csvor.xlsxfile of up to 5 MB and 10,000 data rows. The first row must be the header. - Mapping. IncentIA matches columns by header name; check which column feeds each field and adjust. Click Preview.
- Preview and import. You see each row as Create, Update or Unchanged, plus per-row errors. Click Import. The preview expires after 30 minutes.
| Field | Recognised headers (examples) | Rules |
|---|---|---|
| Name | name, nombre, product, description | Required. Max 256 characters. |
| Barcode (EAN/GTIN/CN) | ean, gtin, barcode, cn, codigo | Several codes in one cell, separated by ;. A code of EAN/GTIN length (8, 12, 13 or 14 digits) has its check digit validated. A 6–7 digit code is treated as a national pharmacy code. |
| Size | size, tamano, formato | Positive number; comma or dot accepted, and also 165g with the unit attached. |
| Unit | unit, unidad | g, kg, ml, cl, l, ud… Kilos and litres are converted to grams and millilitres. |
| Pack | pack, multipack | Integer from 1 to 999. |
| Variant | variant, flavor, variante | Max 256 characters. |
| Category | category, categoria | Max 256 characters. |
| SKU | sku, reference, ref | Max 100 characters. |
Only the name is required.
Row errors that block a row: missing name, name too long, invalid barcode (check digit), code or SKU repeated in the file, code already belonging to another product, unknown unit, invalid size or pack, and values that are too long. Tick Import only the valid rows and skip the ones with errors to import the rest; otherwise you must fix the file.
What the import does:
- An existing product is located first by SKU and otherwise by its primary barcode; if found it is updated, otherwise created. Re-importing the same file changes nothing.
- For each product it automatically generates import receipt names (name, name with variant, abbreviated versions and versions with size) valid for all chains, at 90 % confidence.
- When finished you get the summary: Created, Updated, Unchanged, Skipped, Barcodes added and Aliases added. Rows that changed between preview and import are listed as rejected.
Statuses and limits
- Import: 5 MB, 10,000 rows, 30-minute preview session. It requires a loyalty programme to exist.
- Accept, ignore and mark as «not ours»: at most 500 candidates per operation.
- Imported products are created in the account's first loyalty programme.
Permissions
| I want to… | Permission | Key |
|---|---|---|
| See the screen and its tabs | Product recognition | Pages.Loyalty.ProductRecognition |
| Import, accept, ignore, split, disable, add or delete receipt names and change thresholds | Editing product recognition | Pages.Loyalty.ProductRecognition.Edit |