Most bad data stops the trial load, after the consultants are booked. Some loads without an error and is still wrong. The Pre-load Review checks the client's files against your declared rules first, and returns every exception, record by record.
Good migration teams already validate data. The question is where and when. Inside the trial load, an exception is a rejected record and another cycle. Before it, it's a record to fix or a decision to make.
Not sure where you're exposed? Try the Readiness Lab: five questions, and a self-check for every gap.
Pre-load Review · DEMO-INV-RUN-1Synthetic data
suppliers.csv
120
PASS
items.csv
1,501
PASS
stock_on_hand.csv
2,800
PASS
4,421 records · 20 declared rules · 3 cross-field
items.csv delimiter match · intake PASS
stock_on_hand.csv delimiter match · intake PASS
suppliers.csv delimiter match · intake PASS
Delimiter, encoding, header and template columns are checked before any rule runs. A file that fails is returned, not analysed.
6 blocking · 3 would load without an error
item.uom × 5 · UOM is one of the configured units
sup.payment_terms × 2 · PAYMENT_TERMS is one of the configured terms
soh.location × 1 · LOCATION is one of the configured locations
sup.country × 1 · COUNTRY is one of the configured countries
e.g.items.csv:ITEM_CODE=ITM-00018
expected one of: BOX, EA, KG, L, M · foundEach
'Each' reads fine and isn't on the client's unit list, which has EA. Units drive every quantity and conversion after go-live.
3 blocking · 4 would load without an error
soh.lot_needs_number_and_expiry × 3 · LOT_NUMBER and EXPIRY_DATE are present when TRACKING is LOT
item.type_costing × 2 · (ITEM_TYPE, COST_METHOD) is one of the declared combinations
soh.counted_after_received × 2 · LAST_COUNTED_DATE is on or after RECEIVED_DATE
e.g.stock_on_hand.csv:STOCK_LINE_ID=SOH-000621
expected LAST_COUNTED_DATE on or after RECEIVED_DATE · foundLAST_COUNTED_DATE=2026-07-02, RECEIVED_DATE=2026-07-20
Counted on 2 July for goods received on 20 July. Each date is valid; together they're impossible, and the check can't say which is wrong.
6 blocking
item.supplier_exists × 3 · Every item's SUPPLIER_ID exists in the supplier file
soh.item_exists × 3 · Every stock line's ITEM_CODE exists in the item master
e.g.items.csv:ITEM_CODE=ITM-00301
expected a value present in suppliers.csv.SUPPLIER_ID · foundS0999
The item names supplier S0999 and the supplier file has no S0999. The item loads without a valid supplier, or not at all.
5 would load without an error
item.cost_decimal × 2 · STANDARD_COST is a decimal number
soh.received_date × 2 · RECEIVED_DATE is a YYYY-MM-DD date
item.reorder_integer × 1 · REORDER_LEVEL is a whole number
e.g.items.csv:ITEM_CODE=ITM-00141
expected a decimal number · found331,69
'331,69' uses a decimal comma. Read as text, as 33169 or not at all, it becomes a stock valuation error.
2 blocking · 2 would load without an error
item.description_length × 2 · DESCRIPTION fits the target's 40-character field
soh.qty_range × 2 · QTY_ON_HAND is between 0 and 1,000,000
e.g.stock_on_hand.csv:STOCK_LINE_ID=SOH-000401
expected at least 0 · found-30
A negative quantity on hand can't be loaded as opening stock. It usually means a counting or timing problem the client has to explain.
1 blocking · 1 would load without an error
item.key × 1 · ITEM_CODE is unique
sup.probable_duplicate × 1 · Propose supplier pairs sharing a normalised name and tax reference
e.g.items.csv:ITEM_CODE=ITM-00412
expected a key used by exactly one record · foundITM-00412
Two records claim one item code with different descriptions. Which one is right is a business decision, not an import setting.
1 blocking
sup.required.CURRENCY × 1 · CURRENCY must be present
e.g.suppliers.csv:SUPPLIER_ID=S0102
expected a value · found(empty)
Without a currency the target either refuses the supplier or defaults one, and invoices post in the wrong currency.
34Exceptions
19Would stop the load
15Load without an error
By each rule's declared severity: 19 blocking, which fail the load or corrupt balances; 15 that load without an error and are still wrong (14) or lower quality (1). 12 need the client's decision.
Run DEMO-INV-RUN-1 · readiness signal BLOCKING FINDINGS PRESENT · Inspect this run ↓
Synthetic files, real engine output. Every exception count on this page comes from this run or its rerun.
01 The difference
Most bad data fails loudly. One kind doesn't.
An import check rejects what it can see in one record: a required field left empty, a code the target doesn't know, a reference to a record that isn't loaded yet. That catches most problems, at load time. It can't see a record that is valid field by field and wrong next to the others.
Import validation · at the load
Catches the loud ones, late.
Required fields present
Codes on the target's lists
References to records already loaded
items.csv · ITM-00018 UOM = "Each" ✕ would fail the load: not one of BOX, EA, KG, L, M
19 of the 34 exceptions in the synthetic run are like this.
Pre-load Review · before the load
Finds both, while they're still records.
The same checks, against your declared rules
Fields that contradict each other
Two records that are probably one
stock_on_hand.csv · SOH-000621 received 2026-07-20 · counted 2026-07-02 ✓ each date valid: loads without an error ✕ counted 18 days before it was received rule soh.counted_after_received · needs a decision
15 of the 34 load without an error, like this one.
items.csv · ITM-00011 ITEM_TYPE=SERVICE, COST_METHOD=FIFOBoth allowed. Not together.
suppliers.csv · S0012 and S0077 same name and tax reference, different spacing and caseTwo codes. Probably one supplier.
1Client extractsThe client's files, as exported.
2Pre-load ReviewDeclared rules, every record, a register and a note.
3Trial loadImport tools and vendor validation against the real target.
4UAT and reconciliationBalances, totals, business sign-off.
5Go-liveOwned by the implementation team.
What “ready” means here: no open blocking exception against your declared rules, and every decision that remains assigned to the person who owns it. It is not migration sign-off: the Readiness Note lists what wasn't checked and confers no assurance.
Optional Readiness Lab
Not sure where you're exposed?
Five questions, nothing sent. A readiness map built from your answers, and a ten-minute self-check for every area nobody can vouch for yet.Open the Readiness Lab
Your map so far5 areas
Duplicates—
Required fields—
Code mappings—
Cross-file references—
Trial-load history—
Each area takes one state, only from your answer: Known issue, Unchecked, Unknown or Covered. No scores, no benchmarks.
Drop one or two CSV files. The check runs inside this browser tab: no upload, no account, no copy kept.
Try the synthetic example here, or open this page on your computer to check your own files.
Check a sample file
CSV or other delimited text, up to 5 MB each. With two files it also checks the references between them. Excel workbooks: save as CSV UTF-8 first.
No file chosen
No file chosen
Read by your browser, on this device
File contents and file names never leave it
While a file is checked, the page counts this tab's network requests and shows you the number
Closing or reloading the tab discards everything
Afterwards the page sends an anonymous step count, such as “file checked”, with your link's campaign label. No file name and no content: the same as every other step count on this page.
This is a structural check. It doesn't know your target's rules, allowed values or field lengths, so a clean result doesn't mean a file is ready to load. It is not a migration validation.
03 Sample File Check · Pre-load Review
The same two files, record by record.
In items.csv and suppliers.csv the review found 21 exceptions. This is what the free check said about each of those records, run on the same files.
Sample File Check · free
Found directlyA signal on the same column names this record.
8
ITM-00141STANDARD_COST
ITM-00301SUPPLIER_ID
ITM-00999REORDER_LEVEL
ITM-01023STANDARD_COST
ITM-01178SUPPLIER_ID
ITM-00412ITEM_CODE
ITM-01402SUPPLIER_ID
S0102CURRENCY
Hinted atIt flagged a neighbouring record or the column, not this problem.
1
S0012probable duplicate
Listed, not judgedThe value appears in a column's list of distinct values. Only the client's list can say it's wrong.
8
ITM-00018UOM
ITM-00231UOM
ITM-00646UOM
ITM-00904UOM
ITM-01311UOM
S0034PAYMENT_TERMS
S0058COUNTRY
S0089PAYMENT_TERMS
Not visibleNothing points at it: it takes a declared rule, such as a field length or which values may go together.
4
ITM-00011ITEM_TYPE
ITM-00029ITEM_TYPE
ITM-00053DESCRIPTION
ITM-00781DESCRIPTION
Exceptions in the review's register
21
Pre-load Review · £500
What the review adds
Your rules and lists, so a listed value becomes right or wrong
A severity from each rule: 10 of these 21 would stop the load
7 marked as needing the client's decision
The third file, stock_on_hand.csv, and the references into it: 13 more exceptions
A Readiness Note written and signed by a person, and one rerun
04 Proof of work
See exactly what you receive, before you pay for it.
Every artifact here comes from two real runs of the review engine over synthetic files: the first register, and the included rerun after corrections. Inspect them, or download them.
One row per exception, from run DEMO-INV-RUN-1 over 4,421 synthetic records. Open a row to see the rule, its source, why it matters and who resolves it.
34 of 34 exceptions
Record
Severity
Field
Class
Expected
Found
Type
ITM-00011items.csv · ITEM_CODE
HIGH
ITEM_TYPE
CROSS_FIELD_INCONSISTENCY
(ITEM_TYPE, COST_METHOD) one of (STOCK, FIFO), (STOCK, AVERAGE), (STOCK, STANDARD), (NON_STOCK, NONE), (SERVICE, NONE)
ITEM_TYPE=SERVICE, COST_METHOD=FIFO
DECISION
Rule
item.type_costing (ITEM_TYPE, COST_METHOD) is one of the declared combinations
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s9 item type and costing matrix
Why it matters · who resolves
A SERVICE item set to FIFO costing is a combination the target's costing setup doesn't allow; each field is valid on its own.
Client decides the costing method.
ITM-00018items.csv · ITEM_CODE
BLOCKING
UOM
VALUE_NOT_ALLOWED
one of: BOX, EA, KG, L, M
Each
RULE FIX
Rule
item.uom UOM is one of the configured units
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s7 units of measure table
Why it matters · who resolves
'Each' reads fine and isn't on the client's unit list, which has EA. Units drive every quantity and conversion after go-live.
Client confirms the mapping.
ITM-00029items.csv · ITEM_CODE
HIGH
ITEM_TYPE
CROSS_FIELD_INCONSISTENCY
(ITEM_TYPE, COST_METHOD) one of (STOCK, FIFO), (STOCK, AVERAGE), (STOCK, STANDARD), (NON_STOCK, NONE), (SERVICE, NONE)
ITEM_TYPE=SERVICE, COST_METHOD=FIFO
DECISION
Rule
item.type_costing (ITEM_TYPE, COST_METHOD) is one of the declared combinations
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s9 item type and costing matrix
Why it matters · who resolves
A SERVICE item set to FIFO costing is a combination the target's costing setup doesn't allow; each field is valid on its own.
Client decides the costing method.
ITM-00053items.csv · ITEM_CODE
HIGH
DESCRIPTION
MAX_LENGTH_EXCEEDED
at most 40 characters
Heavy duty stainless steel hinge with concealed fixings, 100mm
RULE FIX
Rule
item.description_length DESCRIPTION fits the target's 40-character field
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s6 target field DESCRIPTION is 40 characters
Why it matters · who resolves
The target field holds 40 characters. Longer text is rejected or cut, and a cut description can stop being unique or readable.
Mechanical: shorten, or widen the target field.
ITM-00141items.csv · ITEM_CODE
HIGH
STANDARD_COST
INVALID_FORMAT
a decimal number
331,69
RULE FIX
Rule
item.cost_decimal STANDARD_COST is a decimal number
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s8 costs are decimals with a point
Why it matters · who resolves
'331,69' uses a decimal comma. Read as text, as 33169 or not at all, it becomes a stock valuation error.
Mechanical: decimal point.
ITM-00231items.csv · ITEM_CODE
BLOCKING
UOM
VALUE_NOT_ALLOWED
one of: BOX, EA, KG, L, M
Each
RULE FIX
Rule
item.uom UOM is one of the configured units
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s7 units of measure table
Why it matters · who resolves
'Each' reads fine and isn't on the client's unit list, which has EA. Units drive every quantity and conversion after go-live.
Client confirms the mapping.
ITM-00301items.csv · ITEM_CODE
BLOCKING
SUPPLIER_ID
ORPHAN_REFERENCE
a value present in suppliers.csv.SUPPLIER_ID
S0999
DECISION
Rule
item.supplier_exists Every item's SUPPLIER_ID exists in the supplier file
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s14 'every item's supplier is in the supplier file'
Why it matters · who resolves
The item names supplier S0999 and the supplier file has no S0999. The item loads without a valid supplier, or not at all.
Client supplies the supplier or corrects the reference.
ITM-00646items.csv · ITEM_CODE
BLOCKING
UOM
VALUE_NOT_ALLOWED
one of: BOX, EA, KG, L, M
ea
RULE FIX
Rule
item.uom UOM is one of the configured units
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s7 units of measure table
Why it matters · who resolves
'Each' reads fine and isn't on the client's unit list, which has EA. Units drive every quantity and conversion after go-live.
Client confirms the mapping.
ITM-00781items.csv · ITEM_CODE
HIGH
DESCRIPTION
MAX_LENGTH_EXCEEDED
at most 40 characters
Heavy duty stainless steel hinge with concealed fixings, 100mm
RULE FIX
Rule
item.description_length DESCRIPTION fits the target's 40-character field
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s6 target field DESCRIPTION is 40 characters
Why it matters · who resolves
The target field holds 40 characters. Longer text is rejected or cut, and a cut description can stop being unique or readable.
Mechanical: shorten, or widen the target field.
ITM-00904items.csv · ITEM_CODE
BLOCKING
UOM
VALUE_NOT_ALLOWED
one of: BOX, EA, KG, L, M
Each
RULE FIX
Rule
item.uom UOM is one of the configured units
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s7 units of measure table
Why it matters · who resolves
'Each' reads fine and isn't on the client's unit list, which has EA. Units drive every quantity and conversion after go-live.
Client confirms the mapping.
ITM-00999items.csv · ITEM_CODE
MEDIUM
REORDER_LEVEL
INVALID_TYPE
a whole number
N/A
RULE FIX
Rule
item.reorder_integer REORDER_LEVEL is a whole number
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s8 reorder level is a whole number
Why it matters · who resolves
'N/A' where a whole number is required either fails the load or loads as zero, silently changing replenishment.
Client confirms the intended value.
ITM-01023items.csv · ITEM_CODE
HIGH
STANDARD_COST
INVALID_FORMAT
a decimal number
235,80
RULE FIX
Rule
item.cost_decimal STANDARD_COST is a decimal number
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s8 costs are decimals with a point
Why it matters · who resolves
'331,69' uses a decimal comma. Read as text, as 33169 or not at all, it becomes a stock valuation error.
Mechanical: decimal point.
ITM-01178items.csv · ITEM_CODE
BLOCKING
SUPPLIER_ID
ORPHAN_REFERENCE
a value present in suppliers.csv.SUPPLIER_ID
S0999
DECISION
Rule
item.supplier_exists Every item's SUPPLIER_ID exists in the supplier file
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s14 'every item's supplier is in the supplier file'
Why it matters · who resolves
The item names supplier S0999 and the supplier file has no S0999. The item loads without a valid supplier, or not at all.
Client supplies the supplier or corrects the reference.
ITM-00412items.csv · ITEM_CODE
BLOCKING
ITEM_CODE
DUPLICATE_KEY
a key used by exactly one record
ITM-00412
DECISION
Rule
item.key ITEM_CODE is unique
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s5 'ITEM_CODE identifies an item'
Why it matters · who resolves
Two records claim one item code with different descriptions. Which one is right is a business decision, not an import setting.
Client decides.
ITM-01311items.csv · ITEM_CODE
BLOCKING
UOM
VALUE_NOT_ALLOWED
one of: BOX, EA, KG, L, M
PCS
RULE FIX
Rule
item.uom UOM is one of the configured units
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s7 units of measure table
Why it matters · who resolves
'Each' reads fine and isn't on the client's unit list, which has EA. Units drive every quantity and conversion after go-live.
Client confirms the mapping.
ITM-01402items.csv · ITEM_CODE
BLOCKING
SUPPLIER_ID
ORPHAN_REFERENCE
a value present in suppliers.csv.SUPPLIER_ID
S0999
DECISION
Rule
item.supplier_exists Every item's SUPPLIER_ID exists in the supplier file
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s14 'every item's supplier is in the supplier file'
Why it matters · who resolves
The item names supplier S0999 and the supplier file has no S0999. The item loads without a valid supplier, or not at all.
Client supplies the supplier or corrects the reference.
SOH-000028stock_on_hand.csv · STOCK_LINE_ID
BLOCKING
LOT_NUMBER
CROSS_FIELD_INCONSISTENCY
LOT_NUMBER present when TRACKING is LOT
TRACKING=LOT, LOT_NUMBER is empty
RULE FIX
Rule
soh.lot_needs_number_and_expiry LOT_NUMBER and EXPIRY_DATE are present when TRACKING is LOT
Declared by · source
Demo client: operations manager DEMO-INV-SPEC-2 s3 'lot-tracked stock carries its lot and expiry'
Why it matters · who resolves
The client's own rule: lot-tracked stock carries its lot number and expiry. Without them, traceability and expiry control start broken.
Client supplies the lot details.
SOH-000037stock_on_hand.csv · STOCK_LINE_ID
BLOCKING
LOT_NUMBER
CROSS_FIELD_INCONSISTENCY
LOT_NUMBER present when TRACKING is LOT
TRACKING=LOT, LOT_NUMBER is empty
RULE FIX
Rule
soh.lot_needs_number_and_expiry LOT_NUMBER and EXPIRY_DATE are present when TRACKING is LOT
Declared by · source
Demo client: operations manager DEMO-INV-SPEC-2 s3 'lot-tracked stock carries its lot and expiry'
Why it matters · who resolves
The client's own rule: lot-tracked stock carries its lot number and expiry. Without them, traceability and expiry control start broken.
Client supplies the lot details.
SOH-000041stock_on_hand.csv · STOCK_LINE_ID
BLOCKING
LOT_NUMBER
CROSS_FIELD_INCONSISTENCY
LOT_NUMBER present when TRACKING is LOT
TRACKING=LOT, LOT_NUMBER is empty
RULE FIX
Rule
soh.lot_needs_number_and_expiry LOT_NUMBER and EXPIRY_DATE are present when TRACKING is LOT
Declared by · source
Demo client: operations manager DEMO-INV-SPEC-2 s3 'lot-tracked stock carries its lot and expiry'
Why it matters · who resolves
The client's own rule: lot-tracked stock carries its lot number and expiry. Without them, traceability and expiry control start broken.
Client supplies the lot details.
SOH-000096stock_on_hand.csv · STOCK_LINE_ID
HIGH
RECEIVED_DATE
INVALID_FORMAT
a date written as YYYY-MM-DD
14/05/2026
RULE FIX
Rule
soh.received_date RECEIVED_DATE is a YYYY-MM-DD date
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s12 dates are YYYY-MM-DD
Why it matters · who resolves
14/05/2026 is a real date in the wrong format; parsed month-first it becomes invalid or a different day, which moves stock ageing.
Mechanical: YYYY-MM-DD.
SOH-000151stock_on_hand.csv · STOCK_LINE_ID
BLOCKING
ITEM_CODE
ORPHAN_REFERENCE
a value present in items.csv.ITEM_CODE
ITM-09999
DECISION
Rule
soh.item_exists Every stock line's ITEM_CODE exists in the item master
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s14 'every stock line is for an item in the item master'
Why it matters · who resolves
Stock can only load against an item that exists. 'itm-00123' is typed in lower case and matches nothing; ITM-09999 isn't in the item master at all.
Client corrects the code or says where the stock belongs.
SOH-000401stock_on_hand.csv · STOCK_LINE_ID
BLOCKING
QTY_ON_HAND
OUT_OF_RANGE
at least 0
-30
RULE FIX
Rule
soh.qty_range QTY_ON_HAND is between 0 and 1,000,000
Declared by · source
Demo partner: implementation lead DEMO-INV-SPEC-1 s13 on-hand quantity cannot be negative
Why it matters · who resolves
A negative quantity on hand can't be loaded as opening stock. It usually means a counting or timing problem the client has to explain.
Sections 1–6 are generated from the run and refused by the pre-issue check if they differ from it. Section 5 says what was not checked. Sections 7–8 are written and signed by a person.
Run DEMO-INV-RUN-1 · 30 September 2026contract d59ac448345e4a26rule set 1ec5c1f6dc0b67c2result 9ffd444a190e82e1
Readiness Note · Pre-load Review
Synthetic demonstration data. No real organisation, person or record. Sections 1–6 are generated by the engine from the run; sections 7–8 are the reviewer's, written here as an example for this synthetic run.
1 · Scope
One client's import files, checked before the first trial load against the partner's template rules and the client's own lists. Read-only: no system access, and nothing was loaded or changed.
2 · Files and intake
File
Records
SHA-256
Intake
suppliers.csv
120
0ae95d36a2a849da
PASS
items.csv
1,501
797af48ae0fdb679
PASS
stock_on_hand.csv
2,800
8a5d26ba0651a9ca
PASS
3 · Rules applied
20 declarations: 14 from the partner's template rules, 4 using this client's own lists, 2 added for this client. 3 cross-field rules. One operator-configured rule (sup.probable_duplicate) is marked as such.
4 · Exceptions found
Severity
Exceptions
BLOCKING
19
HIGH
14
MEDIUM
1
Total
34
Class
Count
VALUE_NOT_ALLOWED
9
CROSS_FIELD_INCONSISTENCY
7
ORPHAN_REFERENCE
6
INVALID_FORMAT
4
MAX_LENGTH_EXCEEDED
2
OUT_OF_RANGE
2
DUPLICATE_KEY
1
INVALID_TYPE
1
MISSING_REQUIRED
1
PROBABLE_DUPLICATE
1
5 · Not checked
Cross-dataset value agreement: not performed.
Any comparison against the target system: not performed.
Totals across rows (for example journals that must balance): not performed.
Multiplication checks (for example quantity x rate = amount): not performed.
Excel workbook intake: not performed.
References between files are checked for existence only; values are not compared between files.
This note is not a sign-off and confers no assurance on the migration.
6 · Register
exception_register.csv: 34 rows, one per exception: record, rule, expected, found, severity and who declared the rule.
7 · Readiness interpretation · example, for the synthetic run
Not ready for a trial load as sent. The 19 blocking exceptions would stop records loading, or load them against the wrong unit, supplier or item: resolve those first. For 22 exceptions the declared rule states what is expected (units, date and decimal formats, a location code, lot numbers, and two negative stock quantities to recount). 12 need the client's decision, above all the duplicate item ITM-00412, supplier S0999 and the two stock lines counted before they were received.
8 · Remediation priorities · example
1. Decide the 12 decision items with the owners named in the register. 2. Correct the other 22, recounting the two negative quantities. 3. Send corrected files for the included rerun within 14 days of delivery; its register shows what remains.
20 declarations, each tracing to who declared it and a written source. Severity is supplied by the rule, never inferred by the engine.
Rule
Severity
Kind
Field
What it requires · declared by · source
sup.key
BLOCKING
primary key
SUPPLIER_ID
SUPPLIER_ID is unique Demo partner: implementation lead · DEMO-INV-SPEC-1 s2 'SUPPLIER_ID identifies a supplier'
sup.required.SUPPLIER_NAME
BLOCKING
required
SUPPLIER_NAME
SUPPLIER_NAME must be present Demo partner: implementation lead · DEMO-INV-SPEC-1 s3 mandatory fields
sup.required.CURRENCY
BLOCKING
required
CURRENCY
CURRENCY must be present Demo partner: implementation lead · DEMO-INV-SPEC-1 s3 mandatory fields
sup.payment_terms
HIGH
vocabulary
PAYMENT_TERMS
PAYMENT_TERMS is one of the configured terms Demo partner: implementation lead · DEMO-INV-SPEC-1 s4 payment terms table
sup.country
HIGH
vocabulary
COUNTRY
COUNTRY is one of the configured countries Demo partner: implementation lead · DEMO-INV-SPEC-1 s4 country table
sup.probable_duplicate
HIGH
duplicate
Propose supplier pairs sharing a normalised name and tax reference Bernardo Lorijola · operator: same normalised name and tax reference is the standard duplicate-supplier signal
item.key
BLOCKING
primary key
ITEM_CODE
ITEM_CODE is unique Demo partner: implementation lead · DEMO-INV-SPEC-1 s5 'ITEM_CODE identifies an item'
item.description_length
HIGH
max length
DESCRIPTION
DESCRIPTION fits the target's 40-character field Demo partner: implementation lead · DEMO-INV-SPEC-1 s6 target field DESCRIPTION is 40 characters
item.uom
BLOCKING
vocabulary
UOM
UOM is one of the configured units Demo partner: implementation lead · DEMO-INV-SPEC-1 s7 units of measure table
item.cost_decimal
HIGH
decimal
STANDARD_COST
STANDARD_COST is a decimal number Demo partner: implementation lead · DEMO-INV-SPEC-1 s8 costs are decimals with a point
item.reorder_integer
MEDIUM
integer
REORDER_LEVEL
REORDER_LEVEL is a whole number Demo partner: implementation lead · DEMO-INV-SPEC-1 s8 reorder level is a whole number
item.type_costing
HIGH
allowed combination
(ITEM_TYPE, COST_METHOD) is one of the declared combinations Demo partner: implementation lead · DEMO-INV-SPEC-1 s9 item type and costing matrix
soh.key
BLOCKING
primary key
STOCK_LINE_ID
STOCK_LINE_ID is unique Demo partner: implementation lead · DEMO-INV-SPEC-1 s10 'one row per stock line'
soh.location
BLOCKING
vocabulary
LOCATION
LOCATION is one of the configured locations Demo partner: implementation lead · DEMO-INV-SPEC-1 s11 locations table
soh.received_date
HIGH
iso date
RECEIVED_DATE
RECEIVED_DATE is a YYYY-MM-DD date Demo partner: implementation lead · DEMO-INV-SPEC-1 s12 dates are YYYY-MM-DD
soh.qty_range
BLOCKING
range
QTY_ON_HAND
QTY_ON_HAND is between 0 and 1,000,000 Demo partner: implementation lead · DEMO-INV-SPEC-1 s13 on-hand quantity cannot be negative
soh.lot_needs_number_and_expiry
BLOCKING
conditional required
LOT_NUMBER and EXPIRY_DATE are present when TRACKING is LOT Demo client: operations manager · DEMO-INV-SPEC-2 s3 'lot-tracked stock carries its lot and expiry'
soh.counted_after_received
HIGH
date order
LAST_COUNTED_DATE is on or after RECEIVED_DATE Demo client: operations manager · DEMO-INV-SPEC-2 s4 'a line cannot be counted before it was received'
item.supplier_exists
BLOCKING
relationship
SUPPLIER_ID
Every item's SUPPLIER_ID exists in the supplier file Demo partner: implementation lead · DEMO-INV-SPEC-1 s14 'every item's supplier is in the supplier file'
soh.item_exists
BLOCKING
relationship
ITEM_CODE
Every stock line's ITEM_CODE exists in the item master Demo partner: implementation lead · DEMO-INV-SPEC-1 s14 'every stock line is for an item in the item master'
£500 ÷ your hourly rate = the hours the review has to save. Enter your rate. Nothing is sent.
On a fixed-fee project, every extra correction cycle comes out of your margin, not the client's budget.
Calculated from your inputs. This is not a guaranteed saving or ROI claim.
06 Price
£500. One migration. Everything listed.
You probably don't need another consultancy engagement. You need a bounded answer before the next load.
Pre-load Review£500
Fixed. Paid in advance once the written scope is agreed; the review starts when payment has cleared. Nothing is payable if the migration doesn't fit.
Why £500: the checking runs on a deterministic engine, so you pay for declaring the rules with you and for a person's written reading, not for hours of manual checking.
One-page Readiness Notewritten and signed by a person
08
One rerun within 14 daysa refreshed register after corrections
09
Delivery within 2 UK working daysof agreed files and rules
10
No target-system accessread-only; nothing loaded or changed
Not included
ERP implementation or configuration
Loading, fixing or remediation
Reconciliation, migration sign-off or go-live assurance
Open-ended data cleaning
Access to the target system
Special-category personal data
You may not need the review if
your process already checks declared rules, cross-field logic and references before the load
a sample comes back clean from the Sample File Check and you trust your rules
the migration is bigger than 6 files or 50,000 rows: you'd hear so first, and nothing is payable
If no exceptions are found within the declared scope, you'll hear that too. A short register is a useful answer.
Who you're dealing with
One person
Bernardo Lorijola, an independent individual based in São Paulo, Brazil. No client history yet: that is why every example on this page is synthetic, and why the price, scope, outputs and limits are fixed and shown in full.
Bernardo Lorijola Rodrigues is the independent operator behind Lorijola, based in São Paulo, Brazil. He leads the design and operation of Lorijola’s deterministic Pre-load Review workflow, including its synthetic proof sets, Exception Registers, Readiness Notes and rerun process.
Payment
£500, paid in advance. Once you accept the written scope you receive a payment request, which can quote your PO number; the review starts when the payment has cleared.
Your client's files
Before any file moves, who may share it, the permitted columns, any personal data, the transfer route, retention and deletion are agreed in writing. Files are only read, then deleted at the agreed point, and the deletion is confirmed to you.
The review runs through whoever requests it. The written scope, the file transfer, the questions about rules and the outputs all go to you. Who else sees them is yours to decide.
By default I don't contact your client directly; that only happens if you authorise it in writing.
Why wouldn't our developers script this?
They can, and for one set of rules it may be the right call. The review is that script already built and tested: declared rules, each with a source and a severity; a record-level register in a fixed format; a person's written reading; and a rerun. Fixed at £500, and nobody is taken off the migration to write it.
Can't our ERP consultant do this?
Probably. The question is whether their hours are better spent inside the migration. The review hands them a bounded exception set before the load. It isn't always cheaper: the break-even above uses your own rate.
We already have validation tooling.
Good. If it already checks your declared rules, cross-field logic and references across files before the load, you may not need this. Where you don't have it, the review adds a rule-by-rule register and a person's reading of it.
What does “ready” mean here?
No open blocking exception against your declared rules, and every decision that remains assigned to the person who owns it. That is what the Readiness Note weighs. It is not migration sign-off: the note lists what wasn't checked, such as the target system itself, totals across rows and value agreement between files, and it confers no assurance.
What if you find nothing?
Then the register says “No exceptions found within the declared scope.” That is a completed review, paid for the same way: you're buying the review and its evidence, not a number of findings. The note still lists what wasn't checked, and it certifies nothing.
What about security and our client's data?
Agreed in writing before any file moves: who may share the files, the permitted columns, whether personal data is included, the transfer route, retention and deletion. Special-category data is never accepted. Files are only read: nothing is loaded into, or connected to, any system, and no credentials are ever requested.
Why someone outside the implementation team?
Because of where and when. The review runs before the trial load, against the rules you declare, by someone who isn't also responsible for the load. Your team gets a list to work through instead of a rejected load to investigate.
How is it paid? Can we raise a PO?
In advance, at £500, once the written scope is agreed. You can raise a PO against the written scope; after you accept it you receive a payment request, which can quote your PO number. The review starts when the payment has cleared, and nothing is payable before you accept the scope.
What happens after I send the request?
A fit answer first. If it fits: a fixed written scope, which you accept by reply or raise a PO against; a payment request follows, and the review starts once the payment has cleared; the transfer route is agreed and the files move; the Exception Register and Readiness Note follow within 2 UK working days of agreed files and rules; one rerun within 14 days.
We aim to respond within one UK business day.
7 more questions: whose name goes on the output, your team, fixed-fee projects, AI, target systems, effort, other approaches
Whose name goes on the output?
The reviewer's, on the Readiness Note. The note is written and signed by the person who reviewed the files. The Exception Register is a plain CSV with no branding, so it can go into your own workpapers as it is.
Delivery is Lorijola-branded by default. If you need it unbranded or co-branded, ask: that is agreed case by case, in writing, before work starts.
Does it replace our team?
No. No loading, fixing, configuration or sign-off. It sits before the trial load and hands your team a bounded list; the migration stays theirs.
How does it fit a fixed-fee project?
As a fixed line, not an open estimate: £500 for one client migration, against a written scope, paid in advance and able to quote your PO. On a fixed fee, an extra correction cycle comes out of your margin; the break-even above shows how many hours the review has to save.
Is this AI?
No. Every exception comes from a declared rule applied to a record, and the same files give the same register, byte for byte. A person reads the result and writes the interpretation.
Does it work with our target system?
If the target loads from CSV or delimited import templates, yes. The rules come from its templates and your lists, not from a connector, so the review doesn't depend on the target's version or hosting.
How much work is this for us?
Files you already have, and a few rules in plain words. Send the files, the import templates and allowed-value lists you already use, and up to 5 cross-field rules in plain words. The written scope lists exactly what's needed, and the rules are written up as the declared rule set for you to confirm before anything runs.
How does it compare with other approaches?
Dimension
Manual spreadsheet review
ERP / vendor import validation
Full migration consultancy
Lorijola Pre-load Review
Purpose
Spot-check files by eye or formula
Confirm the target accepts each record
Plan and deliver the whole migration
Find file exceptions against declared rules before the load
Timing
Any time; depth varies
At load, inside the target
Throughout the project
Before the first, or next, trial load
Business-rule checks
What the reviewer knows to look for
The rules configured in the target
Yes, as part of the work
Your declared rules, lists and templates, with up to 5 cross-field rules
Cross-file checks
Hard at volume
References the target can resolve, often once parent records are loaded
Yes
Existence of references across up to 6 files
Output
Ad hoc notes
Import log or error report
Varies by firm
Record-level Exception Register and a one-page Readiness Note
Knows the target's live configuration
Only what the reviewer knows
Yes: it is the target
Yes
No: only what you declare
Every approach has a place, and most migrations use several. The table is about where each one looks, not which is best.
Find the exceptions before your next trial load does.
What happens next
A fit answer by email from bernardo@lorijola.com. We aim to respond within one UK business day. If the migration doesn't fit the fixed scope, you hear that first and nothing is payable.
A fixed written scope. Accept it by reply, or raise a purchase order against it.
Payment in advance. A payment request follows your acceptance; the review starts when the payment has cleared.
Files and rules. The transfer route, permitted columns and retention are agreed in writing first; then the files and declared rules are sent.
Delivery within 2 UK working days of agreed files and rules: the Exception Register and the Readiness Note.
One rerun within 14 days, after corrections.
Nothing to prepare yet. Later: the files as exported, the import templates and allowed-value lists you already use, and up to 5 cross-field rules in plain words.
Nothing is payable now. No payment details are asked for on this site.