Is Your IFS Cloud Project Off Track? 8 Signals
Independent IFS Cloud practice · Project recovery notes Eight signals that an IFS Cloud project has left its plan, and a two-week health check that ends in a…
Read moreIndependent IFS Cloud practice · Project recovery notes Eight signals that an IFS Cloud project has left its plan, and a two-week health check that ends in a…
Read moreIndependent IFS Cloud practice · Operations notes An IFS Cloud update calendar: who reads the notes, who tests, and what happens in the week of a maintenance…
Read moreIndependent IFS Cloud practice · Implementation Two IFS Cloud quotes for the same project, and totals that differ widely: eight lines that make them comparable…
Read moreIndependent IFS Cloud practice · Partner selection Choosing an IFS Cloud implementation partner: fifteen questions that test the named team, the method and the…
Read moreIndependent IFS Cloud practice · Implementation notes IFS Cloud hypercare: how to run the first weeks after go-live, and how to prove they are over Key…
Read moreIndependent IFS Cloud practice · IFS Cloud upgrade planning IFS Applications 10 Extended Support: what has to exist by 27 March 2027 According to the published…
Read moreIndependent IFS Cloud practice · Go-Live IFS Cloud handover to support: what the package must hold, and when to hand it over Key takeaways A handover to…
Read moreIndependent IFS Cloud practice · Updates IFS Cloud service update vs release update: what each one is and how to plan around them Key takeaways A Release…
Read moreShort answer: IFS Cloud Crystal Reports is supported in 24R2, 25R1, 25R2 (from service update 3) and 26R1, and IFS plans to remove the Crystal integration in…
Read more
Independent IFS Cloud practice · Implementation
Key takeaways
Most articles about ERP business impact are written from the brochure. This one is written from the projects. I have spent seventeen years inside IFS, from Apps 7.5 through Cloud, and the pattern that repeats is not that companies pick the wrong system. They pick a capable one and then implement it in a way that throws the capability away: a template nobody reuses, an automation layer nobody trusts, reports rebuilt one for one from the old system because nobody had the authority to delete any of them.
So this is not a list of what IFS Cloud can do. It is a walk through the places where a decision taken during implementation determines whether the platform pays for itself or just replaces one kind of manual work with another. Where a topic deserves its own treatment, I have linked to the longer piece on the ifs-erp.com blog rather than compressing it into two sentences here.
Grouping sites so they share parts, defaults and process setup is sold as a speed feature. It is really a consistency feature, and the speed is a side effect. When site four inherits the purchasing parameters that sites one to three already run on, you are not just saving a week of configuration. You are removing the possibility that site four quietly does receiving differently, which is what costs you two years later when someone tries to compare performance across the group and finds the numbers are not measuring the same event.
The catch is that a cluster only helps if the template being cloned is one somebody defended. Rolling out a bad standard quickly is worse than rolling it out slowly, because a slow rollout at least gives each site a chance to object. I ask for the template to be signed off by the person who will own the process across all sites, not by the site that happened to go first. That is also where the multi-site purchasing decisions belong: whether demand consolidates centrally, and how stock moves between sites once it has.
Further reading: centralised purchasing in IFS Cloud, distribution orders between sites, and from planning to go-live.
IFS Cloud gives you three tools that cover most of what people used to write code for, and knowing which one to reach for is the whole skill. A Quick Report reads data out: a saved query for a list or an extract, with no logic. A Custom Field stores something the standard data model does not. A Custom Event reacts when a row changes, and can hand off to a Workflow that routes an approval, sends a notification, or calls out to another system.
The failure mode is predictable. Teams discover Custom Events, like them, and attach one to everything. Six months later there is an event layer nobody can explain, firing on saves that were never meant to be significant, and the business has learned to ignore the notifications it produces. The second failure mode is subtler: reaching for a Custom Event when the requirement is actually a scheduled check. An event fires when a row changes. It cannot fire because a row has not changed, which is exactly what an unconfirmed order or an untouched receipt is.
Where the requirement crosses a system boundary, the answer is usually an interface rather than an in-system automation. IFS Cloud's OData projections are the normal integration surface, and keeping the orchestration outside IFS keeps that logic out of your ERP, where it would otherwise become one more thing to retest at every release.
Further reading: Custom Events explained, Quick Reports vs Custom Fields vs Custom Events, IFS Cloud API integration, orchestrating IFS Cloud with n8n. Work that has already been built once sits in the configurations and interfaces sections of the marketplace.
IFS Cloud ships R1 and R2 every year. That cadence is the biggest single change in how you should think about customisation, and it is where legacy habits do the most damage. On Apps 9 or 10 an upgrade was an event you prepared for over months, so carrying technical debt between them felt survivable. On Cloud it arrives twice a year, and anything built outside the Extensibility Framework has to be checked, and often reworked, on that same rhythm.
The boundary is simple to state and easy to cross by accident. Extending the data model with Custom Fields, adding logic through Custom Events and Workflows, adapting screens through configuration: all inside the contract, all carried forward. Touching a core object, or building a report or an interface directly against an internal view rather than a published projection, puts you outside it. Nothing stops you at the time. The bill arrives at the next release, and at every release after that.
I have watched this go wrong in both directions. Companies that refuse all extension end up with a shadow layer of spreadsheets doing the work the system was not allowed to do, which is worse, because at least a customisation is visible. The honest position is that some extension is necessary, and the only real question is whether it is built where the platform will maintain it for you.
Further reading: update-safe extensions, the true cost of customisation, clean core in an SCM context, the upgrade tax, the upgrade readiness checklist, and what a release actually brings, with 25R2 purchasing as the worked example. Scoped modification work is listed under marketplace modifications.
Ask a buyer what goes wrong and you get something dramatic: a late shipment, a line stopped for a missing part. Look in the data and the costly problems are the undramatic ones, because nothing in the system objects to them.
| What is sitting there | Why nobody sees it | What it turns into |
|---|---|---|
| A released PO the supplier never acknowledged | The order is valid and open. No field says "ignored" | A delivery date everyone planned around that was never agreed |
| Goods received, invoice never matched | Both records are individually correct | An accrual that grows quietly until period end |
| A supplier price that moved between orders | The new price applies cleanly, exactly as configured | Margin erosion found during an annual review |
| A buyer who stopped ordering from a usual source | Every individual order is legitimate | Concentration risk, or a supplier problem nobody escalated |
All of this is detectable, and all of it is readable through standard OData projections on a read-only account. That means a monitor can look for it daily without touching a record, installing an object, or adding anything the next release has to be checked against. It is the design principle behind the SCM Automation Pack, and the reason the five-day exception scan exists as a way to see what is already in your own data before committing to anything ongoing.
On the physical side the same principle applies to warehouse work. Picking strategy and packing proposals are configuration decisions that quietly set your throughput ceiling, and they are rarely revisited after go-live.
Further reading: unconfirmed purchase orders, what unmatched receipts do at period end, supplier price changes, advanced picking strategies, the packing proposal.
Anomaly detection, demand forecasting and predictive maintenance are genuinely useful, and they all rest on the same unglamorous foundation: whether your master data is good enough for a model to learn from. A forecast built on lead times copied out of the legacy system in 2019 and never reviewed will be precise, confident and wrong, and it will be harder to challenge than a human guess because it arrives with a number attached.
The second thing the demo leaves out is what happens to the output. Detection is the easy half. The half that decides whether any of it pays off is routing: who receives the signal, how it reaches them, and what happens when they do nothing. An alert stream with no named owner and no escalation is a mailing list, and people unsubscribe from mailing lists in their heads long before they do it in the client.
That is why I design exception rules around the recipient rather than the condition. One deduplicated digest per owner per day beats forty individual notifications that are each technically correct. And a rule that cannot state in one sentence what the recipient is supposed to do about it does not ship.
Further reading: alert fatigue and exception design, the cost of missed exceptions, detecting supplier behaviour change, the data attention gap, assumed vs confirmed records, read-only OData monitoring.
Crystal Reports layouts from Apps 9 and 10 do not carry across to IFS Cloud. That is the fact that matters for your plan, whatever any vendor's support calendar says, and it is usually discovered later than it should be, because reporting gets treated as a workstream that can start once the real configuration is done.
IFS Cloud splits the job across different tools. Quick Reports handle lists and extracts: saved queries, no layout ambition, self-service for anyone who can be trusted with a data set. Laid-out business documents are produced through IFS Cloud's own report layout tooling. Analysis and dashboards belong in the reporting and analytics layer rather than in a printed report at all. Trying to recreate a 200-item Crystal inventory inside any one of these is how reporting becomes the critical path.
The work that actually saves you time is triage, and it is a business job rather than a technical one. Pull the usage data first. Most report inventories contain a long tail nobody has run in two years, a middle band that exists because one person likes the format, and a small core the business genuinely runs on. Rebuild the core properly, convert the middle band to Quick Reports or a dashboard, retire the tail. The conversation about retiring the tail is the hard part, which is why it needs to start early and needs someone senior to close it.
Further reading: when a Quick Report is the right answer, and the reports section of the marketplace.
Permission sets in IFS Cloud are capable enough to express proper segregation of duties. Whether they end up doing so is decided in the first six weeks of the project, when someone is under time pressure and the fastest way to unblock testing is to grant a broad set to a group and move on. That grant is almost never revisited, because nothing breaks. It surfaces at the first external audit, when a tester asks who can both create a supplier and approve a payment to it, and the honest answer takes a fortnight to assemble.
Design the role model against the process rather than the org chart, and build it while the process design is still fresh in everyone's head. It costs days then and weeks later. The same applies to standards work: if you operate under ISO requirements, the evidence those audits want is largely a by-product of decisions you are already taking, provided you record them as you go instead of reconstructing them afterwards.
Further reading: RBAC and segregation of duties, permission sets in IFS Cloud, ISO standards in IFS Cloud, and the security section of the marketplace. My own view on the wider ownership question sits on the data governance page.
Every implementation plan has a migration workstream, and most are optimistic by the same margin. The reason is consistent: the effort is not in loading the data, it is in deciding what the data should say. Loading is mechanical. Agreeing that these 4,000 part records are the ones worth keeping, that this status code maps to that one, and that a customer with no valid tax ID is a customer you are not going to migrate, is a series of business decisions with no obvious owner.
Two habits change the outcome. Rehearse the load more than once, on a schedule, with a defined cut of source data each time, so the failure list shrinks between rehearsals instead of being discovered on cutover weekend. And treat validation as its own deliverable with its own sign-off rather than as the last step of loading, because IFS Cloud enforces its business rules at load time: well-formed source data can still be rejected for violating application logic nobody had read.
Further reading: the data migration checklist, how FNDMIG and the Data Migration Manager fit together, and the data migration section of the marketplace.
In most of the companies I work with, a large amount of operational knowledge lives in one person's head and one person's spreadsheet. The buyer who knows which supplier actually delivers on time regardless of what the lead time field says. The planner whose workbook reconciles two things the system does not reconcile. None of this shows up in an ERP assessment, and all of it walks out of the building when that person leaves.
An implementation is the one moment when you have a mandate to surface it. Every shadow spreadsheet is a documented requirement waiting to be read: it exists because the system does not do something, and finding out what that something is tells you more about your real process than a workshop will. Some of them should become configuration. Some should become a Quick Report. A few are genuinely someone's judgement and should stay human, but at least then you know where they are.
The same logic applies to the implementation record itself. Decisions taken in month two get questioned in month eleven by people who were not in the room, and a project that cannot answer "why is it set up this way" reopens settled arguments for the rest of its life.
Further reading: shadow spreadsheet risk, knowledge loss when people leave, buyer knowledge concentration, and the implementation documentation kit if you would rather not build the templates from scratch.
I am wary of quoting percentage improvements. Published ranges come from situations you cannot inspect, with baselines nobody defined, and a number borrowed from another company's business case is not evidence about yours. What I can offer is the short list of measures that survive contact with an actual steering committee.
Further reading: ERP ROI analysis, why go-live is a load test, the implementation crisis.
If you are live on IFS Cloud and this article has described your situation rather than your plan, the order that works is roughly this. Find out what is actually in your data before redesigning anything, because the exception population usually contradicts the received wisdom about where the problems are. Then fix the governance decisions that get harder with time: the role model, the report inventory, the ownership of master data. Automation comes after that, not before, because automating a process nobody owns only makes it produce wrong answers faster.
What I do is on the offer page, the platform view is on the IFS Cloud page, and the process side sits under business process optimisation. The applications themselves, including the read-only exception monitoring described in section 4, live on ifs-erp.com.
No, but the work changes shape. Before go-live it is a design decision that costs nothing extra. After go-live it is an inventory exercise: list everything built outside the Extensibility Framework, establish what each item actually does, and decide case by case whether to rebuild it inside the contract, replace it with standard functionality, or accept the maintenance cost knowingly. The last option is legitimate. What is not legitimate is not knowing which category each item falls into, which is the usual starting position.
No. In most projects I see, the unclaimed value sits in exceptions a plain query would find: orders nobody confirmed, receipts nobody invoiced, prices that moved. That is rule-based detection rather than machine learning, and it works on data that is merely adequate. Model-driven forecasting is worth doing once master data has an owner and a maintenance routine, and worth postponing until it does.
Yes, and that is the approach I prefer for anything that only needs to read. Standard OData projections plus an integration account with read permission are enough to detect the exception patterns in section 4. Nothing is installed in IFS, nothing is written back, and there is no object for the next R1 or R2 release to break. If you want to see the output before committing to anything ongoing, the five-day exception scan produces the same report in observation mode only.
Budget the triage, not the rebuild. Pulling usage statistics and getting a decision on what to retire takes longer than rebuilding the reports that survive, because it needs business sign-off rather than developer time. Start it in parallel with configuration rather than after it, and give the retire list an owner with the authority to say no. Teams that skip this step rebuild everything one for one and carry the whole inventory forward, including the part nobody has opened since 2019.
The configuration saving is small at that scale. The consistency saving is not, and it compounds: two sites configured independently will diverge on receiving, costing and reporting definitions within a couple of years, and reconciling them later is considerably more work than agreeing a shared template now. If there is any prospect of a fourth site, an acquisition, or a group-level report, treat it as worth it.
Dariusz Myśliwiec: 25+ years in ERP and supply chain, 17+ on IFS (Apps 7.5–10 and IFS Cloud). IFS Certified Associate Consultant. PRINCE2® 7. Based in Kraków, delivering remotely across Europe and globally through an independent practice.
Selected clients: Fugro · LGC · BVI Medical · Betafence (PRÆSIDIAD) · Barlinek · NGK Ceramics · Newag · Oleofarm.
IFS is a registered trademark of IFS AB; this practice is not affiliated with IFS AB.
If you are scoping an IFS Cloud implementation, or you are already live and suspect the value case has quietly gone missing, a short call is the fastest way to work out which two or three of the eleven sections above are actually costing you something.
Independent IFS Cloud practice · Field notes
Key takeaways
I have run enough data migrations into IFS, across Apps 7.5 through 10 and now IFS Cloud, to have stopped being surprised by which loads cause the trouble. It is never the load that fails. A failed load is a good day: the log tells you exactly what broke, and you fix it and rerun it. The loads that cost real money weeks later are the ones that finish, report success, and are quietly wrong. This is a set of field notes on three specific ways a migration goes wrong without ever throwing an error, drawn from patterns I have seen recur across FndMig and DMM projects regardless of module, and what I now build into every migration to catch them before go-live rather than after.
FndMig and DMM validate what they can define a rule for: mandatory fields populated, foreign keys resolving to a record that exists at the moment the load runs, values within a domain the target field accepts. Mandatory-field and foreign-key checks catch errors that are structurally invalid outright, at load time, with a log line pointing at the offending row. What it structurally cannot catch is anything that is syntactically and referentially valid but semantically wrong: a quantity that is a legal number, just computed from the wrong conversion factor; a foreign key that resolves correctly today because the parent happened to load in an earlier batch, even though the two were never meant to be linked; a value hand-patched into a staging spreadsheet under time pressure and never checked against the rule it was meant to satisfy.
None of that trips a validation rule, because none of it is invalid data. It is valid data that means the wrong thing, and the tooling has no way to know what the right thing was supposed to be without someone writing and maintaining that rule deliberately, on top of the standard load, not instead of it.
Unit-of-measure conversion mismatches are the failure I see most often and trust least in any migration I inherit rather than build myself. The legacy system holds a quantity in one unit, the legacy source data was extracted with an assumed conversion factor to the target stocking unit, and that factor was either wrong, out of date, or applied inconsistently across the extract. The load itself is completely happy: it sees a numeric quantity, it sees a valid unit of measure on the part record, it writes the value. Nothing about the transaction is invalid.
What actually happens is that the on-hand balance loaded into IFS is now arithmetically consistent and physically false. It will not surface at go-live, because nobody is comparing the freshly loaded balance against a physical count on day one. It surfaces at the first cycle count, or worse, the first time someone tries to ship an order against that balance and the pick fails or, more dangerously, succeeds against stock that is not really there in that quantity. By the time it surfaces, the legacy system is usually decommissioned, the original extract is gone, and reconstructing the correct conversion factor means going back to the part’s technical specification or, in the worst case, physically recounting everything affected.
The check that catches this before go-live is uncomfortably simple and rarely done under deadline pressure: for a sample of parts across every unit-of-measure pairing in the extract, not just the high-value ones, physically verify the conversion factor against the part specification, independently of whatever factor the extract used. If the legacy system and the target system disagree on the factor for even one pairing, assume every part using that pairing is suspect until proven otherwise, not just the one you happened to sample.
A migration runs in a sequence, dependent objects loading after the parents they reference. The failure mode here is subtler than a broken foreign key rejected at load time. It is a foreign key that resolves successfully, at the moment its record loads, to a parent record that exists in the target system for reasons entirely unrelated to being the correct parent: a batch that loaded slightly out of the intended order, or a mid-project dedup pass that consolidated two legacy IDs into one target record without updating every child reference to match.
The record is not invalid, it just does not point at the thing it was supposed to point at, and load validation, which only checks that a referenced key exists at the moment of the load, has no way to know that. It tends to surface in one of two ways: a report that silently pulls the wrong parent’s attributes for months before anyone notices, or a downstream process that fails in a way that looks unrelated to migration at all, which is what makes it expensive to trace back to its actual cause.
The mitigation I now insist on is a post-load reconciliation pass that is separate from load-time validation: after the full sequence completes, re-walk every parent-child relationship that matters for the modules in scope and confirm each child’s parent is the one the source system actually recorded, by comparing legacy identifiers carried through as cross-reference fields, not by trusting that the target key resolving at all means it resolved correctly. This has to run after the whole sequence, not batch by batch, because the specific failure pattern is a batch ordering issue that a single batch’s own validation cannot see.
Every migration I have worked on has had at least one point where the automated extract could not resolve something cleanly under the schedule available, and someone hand-corrected a batch of rows in a spreadsheet before feeding them into the load. This is not a criticism; it is sometimes the only realistic way to hit a cutover date. The failure is that the patch is applied once, works, and then nobody schedules the work to fold the correction back into the repeatable extract logic, because the project has already moved on to the next milestone.
The specific way this bites later is not usually the patched data itself going wrong; a careful hand-correction is often more accurate than the automated logic it replaced, at the moment it was made. It is that the underlying source data changes after go-live, a new batch of the same record type arrives through the same integration or a delta load, and the extract logic that was never fixed reproduces the original error on the new records, because nobody remembers, months later, that this particular field needed a hand adjustment and why. The knowledge lived in a spreadsheet on someone’s laptop, not in the transform logic, and the spreadsheet is gone or forgotten well before the problem resurfaces.
What I do differently now: every hand-patch gets a one-line entry in a migration decisions log, at the moment it is applied, stating which field, which record population, what the automated logic got wrong, and what the correct rule actually is. That log is the input to a follow-up task, tracked separately from go-live, to either fix the transform logic properly or, at minimum, confirm in writing that the condition causing the original error cannot recur post-cutover. A patch without that entry is indistinguishable, eighteen months later, from a deliberate design decision, and someone will eventually build on top of it assuming it was one.
Four checks catch this class of error after any load I am responsible for: conversion-factor consistency, parent-child cross-reference matching, patch-window edits and an independent-source quantity comparison. They are shown here as generic, PL/SQL-flavoured pseudocode using aliases rather than an assertion about a specific release’s exact schema, because the exact objects involved differ by module and by release:
| Check | What it catches |
|---|---|
| GROUP BY part_no, uom_pair HAVING COUNT(DISTINCT conversion_factor) > 1 | Any part loaded with more than one conversion factor across the extract, a near-certain sign of an inconsistent or wrong factor somewhere in the batch, section 2. |
| child.legacy_parent_ref <> parent.legacy_id (joined via the target-system foreign key, not the legacy reference) | A child record whose resolved parent in the target system does not match the parent its own source data actually recorded, the orphan pattern in section 3. |
| record.last_modified_by = :migration_analyst_user AND record.last_modified_at > :cutover_freeze_date | Records touched by a named individual after the extract was supposed to be frozen, a strong indicator of an undocumented hand-patch, section 4. |
| SUM(qty) OVER (PARTITION BY part_no) compared against an independent legacy-system extract total, per part | A quantity-level sanity check against a second, independent source, catching conversion and rounding errors that a single-source validation cannot see because it only checks itself. |
None of these queries are complicated. What matters is that they run as a separate step after the load, not folded into load-time validation, because the point is to catch things that were valid at load time and wrong in a way that only shows up when compared against something outside the load itself.
Unit-of-measure conversion errors, orphaned foreign keys and unlogged hand-patches are semantically wrong but syntactically and referentially valid: a legal number computed from a wrong conversion factor, a foreign key that resolves correctly but to the wrong parent, a hand-patched value that was never checked against the business rule it needed to satisfy. Standard load validation checks mandatory fields, valid domains and key resolution, not whether a valid value means the correct thing.
By independently verifying the conversion factor against the part specification for a sample across every unit-of-measure pairing in the extract, not just high-value parts, and treating any disagreement as reason to check the entire pairing rather than the sampled records alone. A quantity total compared against an independent source, such as the legacy system's own figures, catches what a single-source check cannot.
An orphaned record's foreign key resolves successfully at load time, just to the wrong parent, often because of batch ordering or a mid-project deduplication pass that consolidated legacy IDs without updating every child reference. Standard load validation only confirms a key resolves, not that it resolves to the record the source data actually intended, so a separate post-load reconciliation pass comparing legacy cross-reference fields is required to catch it.
By logging every hand-patch the day it is applied, with the field, the record population and the correct rule stated explicitly, then assigning an owner and a deadline to fold the fix back into the repeatable extract logic. Without that log, the knowledge lives only in a spreadsheet that will not exist by the time the underlying source data changes and reproduces the original error.
Dariusz Myśliwiec: 18 years hands-on with IFS (Apps 7.5–10 and IFS Cloud), including Data Migration Manager, FndMig and Oracle PL/SQL work across those projects. IFS Certified Associate Consultant. PRINCE2® 7. Based in Kraków, delivering remotely across Europe and globally through an independent practice.
Selected clients: Fugro · LGC · BVI Medical · Betafence (PRÆSIDIAD) · Barlinek · NGK Ceramics · Newag · Oleofarm.
IFS is a registered trademark of IFS AB; this practice is not affiliated with IFS AB.
If your cutover is close and you want someone who has chased these three failure modes before to sanity-check the extract and the reconciliation plan, a short scoping conversation is the fastest way to find out what is worth checking before go-live rather than after.
Independent IFS Cloud practice · Expert notes
Key takeaways
Ask a controller how their duplicate invoice check works and the answer is almost always some variant of “it checks the invoice number against what we already have on file.” That check is real, it runs, and it catches almost nothing, because a genuine duplicate rarely arrives with the identical string in the invoice reference field. It arrives re-keyed with a transposed digit by a supplier whose AP clerk typed it twice, or it arrives on two channels, a PDF by email and a paper copy by post, each processed by a different person who never compared notes. Meanwhile a rule loose enough to catch those cases will just as happily flag a credit note followed by a corrected re-invoice, which is not a duplicate at all and which, if blocked, delays a legitimate payment and damages a supplier relationship for no reason. Building a duplicate detector that is actually worth trusting means understanding exactly why exact match fails, what a fuzzy match needs to compare, and how to keep the false-positive rate low enough that AP does not learn to override every hold the system raises.
A standard duplicate check compares the incoming invoice’s supplier reference against references already recorded for that supplier and flags an identical string. It runs at invoice entry or on import, and where it fires it is genuinely useful: it stops the case where the same document, unaltered, is keyed or scanned in twice. The problem is that this is the least common way a real duplicate actually enters the system.
In practice, most real duplicates carry a reference that is close to, but not identical to, the one already on file. A supplier’s AP clerk re-keys the invoice by hand after an EDI feed silently failed, and mistypes one character. The same invoice arrives twice through two different intake channels, an email attachment and a supplier portal upload, and each channel’s OCR or parsing step normalises the reference slightly differently, one keeping a leading zero, the other stripping it. A supplier resubmits after a query, appending “-R” or “REV1” to the original reference to indicate a revision, when in substance nothing about the underlying charge changed. In every one of these cases, a string-exact comparison sees two different values and passes both invoices straight through to payment.
A workable fuzzy match cannot rely on any single signal in isolation. Each dimension on its own either produces overwhelming noise or misses the cases exact match already misses:
The combination matters more than any individual threshold. A pair that scores high on three of the four dimensions and weak on the fourth is a stronger candidate for review than a pair that scores moderately on all four, and a rule that simply sums independent scores without weighting the reference-similarity signal more heavily tends to under-flag the cases that matter most: same supplier, same amount, close date, and a reference that is clearly the same invoice retyped.
The pattern below is illustrated as generic, PL/SQL-flavoured pseudocode using aliases rather than an assertion about a specific release’s exact schema, intended to show the shape of the join and the scoring logic rather than exact field names:
| Signal | What it tells you |
|---|---|
| candidate.supplier_id = existing.supplier_id | The hard filter. Every comparison below only runs within this pairing, keeping the search space small and the false-positive base rate manageable. |
| ABS(candidate.amount - existing.amount) <= :amount_tolerance | A small absolute or percentage tolerance, not exact equality, to catch rounding and minor currency-conversion differences between a retyped invoice and the original. |
| ABS(candidate.invoice_date - existing.invoice_date) <= :date_window_days | Bounds the comparison to a plausible resubmission or duplicate-entry window rather than the supplier’s entire invoice history. |
| EDIT_DISTANCE(NORMALISE(candidate.reference), NORMALISE(existing.reference)) <= :ref_distance_threshold | The normalised-reference similarity score. Normalisation strips separators, leading zeros and known prefix or suffix patterns before the distance function runs, which is what lets a one-character retyping error still score as a near match. |
| candidate.doc_type = existing.doc_type AND SIGN(candidate.amount) = SIGN(existing.amount) | Excludes credit notes and reversal documents from matching against the original invoice they relate to, which is the section 4 trap. |
A pair that satisfies the supplier, amount and date conditions and clears the reference-distance threshold is a hold candidate, not an automatic block. The distinction matters operationally: an automatic block on a fuzzy match, unlike an exact match, will eventually catch a legitimate near-match and stop a real payment, so the rule should route to a review queue with the matched pair shown side by side, not silently reject the second invoice.
A credit-and-rebill pair is the single most common false positive a fuzzy matcher generates once it starts working well enough to catch real duplicates. A supplier issues a credit note against an incorrect invoice and then reissues a corrected invoice for the same or a very similar amount, from the same supplier, usually within days. On supplier, amount and date alone, this pair is indistinguishable from a genuine duplicate. It is only distinguishable because one document is a credit, carrying a negative amount or a distinct document type, and the other is a standard invoice, and because the reference on the credit note typically points back at the original invoice it is correcting rather than resembling the reissued one.
A rule that compares absolute amount without checking sign, or that does not filter by document type before scoring reference similarity, will flag this pair every time, and it will do so for one of the more routine, legitimate exception flows in accounts payable. The fix is not a looser threshold, it is an explicit document-type and sign condition ahead of the fuzzy comparison, as shown in the last row of the table above.
A second, subtler near-match worth excluding deliberately is a recurring service invoice with a genuinely stable amount, a maintenance contract or a subscription billed monthly at an identical rate. Two consecutive months of an identical amount from the same supplier will satisfy the amount and date conditions trivially. What separates it from a duplicate is that the reference itself changes predictably, an incrementing invoice number or a period-coded suffix, and a normalisation step that strips the wrong part of that reference, the incrementing digit rather than a formatting artefact, will accidentally collapse two genuinely different invoices into a false match. Normalisation rules need to be tuned per reference format, not applied as one blanket regular expression across every supplier.
Because a genuine duplicate rarely arrives with the identical reference string already on file. It is usually re-keyed with a small typo, submitted through a second channel that formats the reference differently, or resubmitted with a revision suffix appended. All of these produce a different string, which an exact-match comparison treats as unrelated.
Supplier, an amount within a small tolerance, a bounded date window, and a normalised reference compared by similarity rather than equality. Any one of these used alone either produces overwhelming noise or misses the cases exact match already misses; the combination, weighted toward reference similarity, is what makes the rule usable.
Because they share supplier, a near-identical amount and a tight date window with a genuine duplicate. Only the document type and the sign of the amount distinguish a credit note followed by a corrected reissue from an actual duplicate invoice, so the matching rule needs an explicit document-type and sign condition ahead of the fuzzy comparison, not a looser threshold.
No. Unlike an exact match, a fuzzy match will eventually catch a legitimate near-match, so it should route to a review queue with both documents shown side by side rather than silently blocking payment. Track the override rate by supplier to identify which reference formats still need their own normalisation rule.
Dariusz Myśliwiec: 18 years hands-on with IFS (Apps 7.5–10 and IFS Cloud). IFS Certified Associate Consultant. PRINCE2® 7. Based in Kraków, delivering remotely across Europe and globally through an independent practice.
Selected clients: Fugro · LGC · BVI Medical · Betafence (PRÆSIDIAD) · Barlinek · NGK Ceramics · Newag · Oleofarm.
IFS is a registered trademark of IFS AB; this practice is not affiliated with IFS AB.
If your current check is either missing real duplicates or flagging so many credit-and-rebill pairs that AP overrides it by habit, the scoring logic is usually the fix. A short scoping conversation is enough to tell you which.
Independent IFS Cloud practice · Supply Chain
The customer order looked complete. It had a part, a quantity, a delivery date, and it moved through the warehouse like any other. What it did not have was a price, or it carried a zero one, and no step in the flow refused to ship a line worth nothing. The goods left, the delivery confirmed, and the invoice, when it came, billed for exactly what the line said it was worth: nothing. The unit price sits on the order line in IFS Cloud from the moment it is entered, so a line about to ship at zero is a number you can read before the truck leaves, not after the customer has free goods.
Key takeaways
Most sales exceptions are felt by the customer: a late order, a short line, a wrong item. A zero-priced line is the quiet one, because from the customer’s side everything is perfect, and better than perfect: they received goods and were billed nothing. Nobody on the outside will point it out. The only party losing is you, and the loss stays invisible until someone reconciles shipped value against invoiced value, or a margin report reads strangely and somebody asks why. Reading order lines for a missing price before they ship is far cheaper than clawing revenue back from a customer weeks later.
In IFS Cloud a sales order line takes a price, usually from a price list, an agreement, or a manual entry. Normally that price is present and correct before the line is released. The gap opens when the price resolves to zero or nothing: a new part has no price list entry, an agreement expired and nothing replaced it, a manual line was entered in a hurry, or a configuration returned a zero the person entering the order never noticed.
None of these blocks the order. The line has everything the warehouse needs, so it picks, packs, and ships, and the price, or its absence, is nobody’s job at that point. The order moves to invoicing carrying a value of zero, and unless someone reads the price before the goods leave, the first time the gap is visible is on an invoice that asks the customer for nothing.
The cost is revenue given away, plus the awkward job of asking a customer to pay for something you already told them was free.
A wrong price gets queried by a customer who thinks they were overcharged. A zero price gets queried by no one, because the customer is delighted and you are the only one out of pocket. That is why it lasts until a reconciliation catches it.
Illustrative only: one low-value line shipped at zero is a write-off nobody misses; the same gap recurring on new parts or expired agreements is steady revenue walking out of the door. The threshold that matters is simple: no line worth selling should ship at zero, and that is a rule you can read before dispatch.
The check is already possible with data IFS Cloud exposes. A sales order line carries its unit price and computed value alongside part, quantity, customer, and delivery status. All of it is readable through standard OData projections without writing anything back. Turning that into a watch list is a scheduled read of two things:
This is the same read-and-flag discipline that catches a delivered but not invoiced order: the facts are already in the system, they just need something to read the price on the line and raise the ones that would bill the customer nothing.
A sharp order-desk clerk spots a missing price when they happen to look at the line. The problem is that a zero-priced line looks complete: it has a part and a quantity, it does not error, and it flows. Nothing draws the eye to a price field that is simply blank, and habit does not surface a value that is quietly zero.
| Manual order review | Systematic monitor | |
|---|---|---|
| Trigger | Someone happens to notice, or a margin report queries it | Every open line checked for a missing price each day |
| What surfaces | Zero lines found by luck, often after shipment | Every unpriced line before dispatch, ranked by material value |
| After shipment | Easy to miss a zero line already delivered | Shipped-at-zero lines flagged before an invoice is raised |
| Continuity | Depends on who is on the order desk that day | Runs the same regardless of workload or staffing |
| IFS footprint | None, but nothing checks the price before it ships | Read-only; no object added to IFS Cloud |
Because it is a read-only monitoring pattern, it never writes back to IFS Cloud. It surfaces the lines that would ship or bill at zero and leaves the price fix, the pricing decision, or the customer conversation with the person who owns the account.
It can warn at entry, but a zero price is a valid value, not an error, so the order still releases and ships. The gap is the line that resolved to zero quietly, from an expired agreement or a missing price list entry, and carried on through fulfilment because nothing downstream refuses a value of nothing.
A below-cost order has a real price that is simply too low to cover cost. A missing price has no meaningful price at all: the line bills zero. One is a margin decision to review; the other is revenue that never gets billed unless someone catches the blank before it ships.
The unit price and computed value on the sales order line, with its part, quantity, and delivery status, through standard OData projections. Reading those on a schedule is enough to list every open line priced at zero before dispatch, and every shipped line still to be invoiced at zero, ranked by the value at stake.
No. The pattern reads the price on the order line through standard OData and raises alerts outside IFS. Nothing is written back, so there is no upgrade footprint and no new object inside the client’s system.
Dariusz Myśliwiec: 18 years hands-on with IFS (Apps 7.5–10 and IFS Cloud). IFS Certified Associate Consultant. PRINCE2® 7. Based in Kraków, delivering remotely across Europe and globally as an independent practice, so you talk to the consultant who builds it.
Selected clients: Betafence (PRÆSIDIAD) · Newag · RADPOL · Fugro · NGK Ceramics · ATLAS.
IFS is a registered trademark of IFS AB; this practice is not affiliated with IFS AB.
Tell me where your orders go out carrying a zero price behind them. On a 30-minute fit call I’ll show you how the SCM Automation Pack reads the price on every open line and raises the ones that would bill the customer nothing, with a dry-run period before a single alert reaches the order desk.
Independent IFS Cloud practice · Upgrade readiness
Key takeaways
IFS Cloud moves forward on a fixed cadence, and each R1/R2 release can change the ground your customisations stand on. Teams that treat the upgrade as an event to be managed sail through it. Teams that treat it as something that happens to them pay the upgrade tax: broken flows, emergency hotfixes, a go-live that slips a fortnight. The difference is preparation. This checklist is the ten points to clear before you schedule the next release, so nothing on the far side surprises you.
Because the expensive part of an IFS Cloud upgrade is not the upgrade itself. It is discovering, in the new version, what you should have found beforehand. The IFS Cloud upgrade tax is paid almost entirely in things that were knowable in advance: an extension nobody realised reached into modified core, a report built on a view that changed, an integration wired to an interface IFS never promised to keep.
A checklist converts that risk into a to-do list. Each point below is something you can inspect, decide on and sign off before the release is booked, while you still have time and before the deadline forces rushed decisions.
Work these ten points in order and the pattern is clear: the first two find the risk, the middle six remove it, the last two make sure someone owns the outcome.
The same three points catch most teams, every release. Knowing them in advance is half the battle.
| Blind spot | Why it bites | Checklist point |
|---|---|---|
| Reports on volatile views | A restructured view returns wrong data or errors, and nobody notices until a decision is made on it | Point 4 |
| Silent RBAC drift | New or reshaped permission sets widen access, breaking Segregation of Duties without any error | Point 5 |
| Integration contracts | An interface wired to an internal API stops exchanging messages; the queue backs up unseen | Point 6 |
RBAC drift is the quietest of the three, because it throws no error. Access simply widens. If your SoD model matters for audit or compliance, treat the upgrade as a moment to re-prove it. The mechanics are covered in Permission Sets and Segregation of Duties in IFS Cloud.
A checklist you run once is useful. A checklist you never need to run is better. The durable fix is to stop generating upgrade risk in the first place: keep every extension inside the supported framework so there is nothing on the far side of the line to break.
That is the Clean Core discipline: the same one behind IFS Cloud Clean Core. Apply it to everything you build and the checklist shrinks to a re-validation, release after release.
Before the release is booked, not after. The first two points, inventory and risk classification, take real calendar time, and everything else depends on them. Starting early means remediation and a proper dry run happen without deadline pressure, which is where rushed upgrades go wrong.
Reports on volatile views and silent RBAC drift. Both fail without throwing an obvious error. A report returns wrong data, or access quietly widens and breaks Segregation of Duties. Because there is no error to chase, they are often discovered only after a decision or an audit depends on them.
Yes. A rollback plan is cheap insurance you write once and hope never to use. It defines your backup points, cut-over window and the exact trigger to stop and revert. Without it, a failed validation turns into an unplanned outage while people improvise under pressure.
You can run it yourself if you have a clear view of every extension and how it is built. If that inventory is fuzzy, or nobody owns the older customisations, the Update-Safe Audit does points one and two for you in 10 business days, classifying each extension Safe / Refactor / Rewrite / Retire with a fixed-price roadmap.
Dariusz Myśliwiec: 18 years hands-on with IFS (Apps 7.5–10 and IFS Cloud). IFS Certified Associate Consultant. PRINCE2® 7. Based in Kraków, delivering remotely across Europe and globally through an independent practice. You talk to the consultant who does the work, not a sales layer.
Selected clients: Fugro · LGC · BVI Medical · Betafence (PRÆSIDIAD) · Barlinek · NGK Ceramics · Newag · Oleofarm.
IFS is a registered trademark of IFS AB; this practice is not affiliated with IFS AB.
The first two points of this checklist are the ones that matter most. They are also the ones teams skip. The Update-Safe Audit does them for you in 10 business days: every extension classified, a fixed-price roadmap, and the fee credited against the fix.
Calculate your return on investment