Lorijola

Pre-load Review · ERP, inventory and finance migrations

Can import ≠ ready to migrate.

Synthetic run · 4,421 records · real engine output34exceptions19stop the load15load silently↓

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.

  • £500 fixed scope
  • 2 UK working days
  • No ERP credentials
  • One rerun included

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.csv120PASS
items.csv1,501PASS
stock_on_hand.csv2,800PASS

4,421 records · 20 declared rules · 3 cross-field

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=FIFO
    Both allowed.
    Not together.
  • suppliers.csv · S0012 and S0077
    same name and tax reference, different spacing and case
    Two 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

02 Sample File Check

Your sample file stays on this device.

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.

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 register21

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.

The Exception Register

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
RecordSeverityFieldClassExpectedFoundType
ITM-00011items.csv · ITEM_CODEHIGH ITEM_TYPECROSS_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
ITM-00018items.csv · ITEM_CODEBLOCKING UOMVALUE_NOT_ALLOWEDone of: BOX, EA, KG, L, MEach RULE FIX
ITM-00029items.csv · ITEM_CODEHIGH ITEM_TYPECROSS_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
ITM-00053items.csv · ITEM_CODEHIGH DESCRIPTIONMAX_LENGTH_EXCEEDEDat most 40 charactersHeavy duty stainless steel hinge with concealed fixings, 100mm RULE FIX
ITM-00141items.csv · ITEM_CODEHIGH STANDARD_COSTINVALID_FORMATa decimal number331,69 RULE FIX
ITM-00231items.csv · ITEM_CODEBLOCKING UOMVALUE_NOT_ALLOWEDone of: BOX, EA, KG, L, MEach RULE FIX
ITM-00301items.csv · ITEM_CODEBLOCKING SUPPLIER_IDORPHAN_REFERENCEa value present in suppliers.csv.SUPPLIER_IDS0999 DECISION
ITM-00646items.csv · ITEM_CODEBLOCKING UOMVALUE_NOT_ALLOWEDone of: BOX, EA, KG, L, Mea RULE FIX
ITM-00781items.csv · ITEM_CODEHIGH DESCRIPTIONMAX_LENGTH_EXCEEDEDat most 40 charactersHeavy duty stainless steel hinge with concealed fixings, 100mm RULE FIX
ITM-00904items.csv · ITEM_CODEBLOCKING UOMVALUE_NOT_ALLOWEDone of: BOX, EA, KG, L, MEach RULE FIX
ITM-00999items.csv · ITEM_CODEMEDIUM REORDER_LEVELINVALID_TYPEa whole numberN/A RULE FIX
ITM-01023items.csv · ITEM_CODEHIGH STANDARD_COSTINVALID_FORMATa decimal number235,80 RULE FIX
ITM-01178items.csv · ITEM_CODEBLOCKING SUPPLIER_IDORPHAN_REFERENCEa value present in suppliers.csv.SUPPLIER_IDS0999 DECISION
ITM-00412items.csv · ITEM_CODEBLOCKING ITEM_CODEDUPLICATE_KEYa key used by exactly one recordITM-00412 DECISION
ITM-01311items.csv · ITEM_CODEBLOCKING UOMVALUE_NOT_ALLOWEDone of: BOX, EA, KG, L, MPCS RULE FIX
ITM-01402items.csv · ITEM_CODEBLOCKING SUPPLIER_IDORPHAN_REFERENCEa value present in suppliers.csv.SUPPLIER_IDS0999 DECISION
SOH-000028stock_on_hand.csv · STOCK_LINE_IDBLOCKING LOT_NUMBERCROSS_FIELD_INCONSISTENCYLOT_NUMBER present when TRACKING is LOTTRACKING=LOT, LOT_NUMBER is empty RULE FIX
SOH-000037stock_on_hand.csv · STOCK_LINE_IDBLOCKING LOT_NUMBERCROSS_FIELD_INCONSISTENCYLOT_NUMBER present when TRACKING is LOTTRACKING=LOT, LOT_NUMBER is empty RULE FIX
SOH-000041stock_on_hand.csv · STOCK_LINE_IDBLOCKING LOT_NUMBERCROSS_FIELD_INCONSISTENCYLOT_NUMBER present when TRACKING is LOTTRACKING=LOT, LOT_NUMBER is empty RULE FIX
SOH-000096stock_on_hand.csv · STOCK_LINE_IDHIGH RECEIVED_DATEINVALID_FORMATa date written as YYYY-MM-DD14/05/2026 RULE FIX
SOH-000151stock_on_hand.csv · STOCK_LINE_IDBLOCKING ITEM_CODEORPHAN_REFERENCEa value present in items.csv.ITEM_CODEITM-09999 DECISION
SOH-000401stock_on_hand.csv · STOCK_LINE_IDBLOCKING QTY_ON_HANDOUT_OF_RANGEat least 0-30 RULE FIX
SOH-000621stock_on_hand.csv · STOCK_LINE_IDHIGH LAST_COUNTED_DATECROSS_FIELD_INCONSISTENCYLAST_COUNTED_DATE on or after RECEIVED_DATELAST_COUNTED_DATE=2026-07-02, RECEIVED_DATE=2026-07-20 DECISION
SOH-001481stock_on_hand.csv · STOCK_LINE_IDBLOCKING ITEM_CODEORPHAN_REFERENCEa value present in items.csv.ITEM_CODEitm-00123 DECISION
SOH-001734stock_on_hand.csv · STOCK_LINE_IDBLOCKING QTY_ON_HANDOUT_OF_RANGEat least 0-17 RULE FIX
SOH-001861stock_on_hand.csv · STOCK_LINE_IDHIGH RECEIVED_DATEINVALID_FORMATa date written as YYYY-MM-DD26/07/2026 RULE FIX
SOH-002005stock_on_hand.csv · STOCK_LINE_IDHIGH LAST_COUNTED_DATECROSS_FIELD_INCONSISTENCYLAST_COUNTED_DATE on or after RECEIVED_DATELAST_COUNTED_DATE=2026-07-02, RECEIVED_DATE=2026-07-20 DECISION
SOH-002211stock_on_hand.csv · STOCK_LINE_IDBLOCKING ITEM_CODEORPHAN_REFERENCEa value present in items.csv.ITEM_CODEITM-09999 DECISION
SOH-002501stock_on_hand.csv · STOCK_LINE_IDBLOCKING LOCATIONVALUE_NOT_ALLOWEDone of: SHOP, WH1, WH2WH 1 RULE FIX
S0012suppliers.csv · SUPPLIER_IDHIGH (record)PROBABLE_DUPLICATEone record per real-world thing, if these are one thingtwo records agree on SUPPLIER_NAME, VAT_REF after normalisation DECISION
S0034suppliers.csv · SUPPLIER_IDHIGH PAYMENT_TERMSVALUE_NOT_ALLOWEDone of: EOM, NET30, NET6030 days RULE FIX
S0058suppliers.csv · SUPPLIER_IDHIGH COUNTRYVALUE_NOT_ALLOWEDone of: DE, FR, GB, IE, NLUK RULE FIX
S0089suppliers.csv · SUPPLIER_IDHIGH PAYMENT_TERMSVALUE_NOT_ALLOWEDone of: EOM, NET30, NET6030 days RULE FIX
S0102suppliers.csv · SUPPLIER_IDBLOCKING CURRENCYMISSING_REQUIREDa value(empty) RULE FIX

Download the register (CSV, 34 rows)

The one-page Readiness Note

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
FileRecordsSHA-256Intake
suppliers.csv1200ae95d36a2a849daPASS
items.csv1,501797af48ae0fdb679PASS
stock_on_hand.csv2,8008a5d26ba0651a9caPASS
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
SeverityExceptions
BLOCKING19
HIGH14
MEDIUM1
Total34
ClassCount
VALUE_NOT_ALLOWED9
CROSS_FIELD_INCONSISTENCY7
ORPHAN_REFERENCE6
INVALID_FORMAT4
MAX_LENGTH_EXCEEDED2
OUT_OF_RANGE2
DUPLICATE_KEY1
INVALID_TYPE1
MISSING_REQUIRED1
PROBABLE_DUPLICATE1
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.

Bernardo Lorijola · Pre-load Review

Download the note (PDF)

The included rerun

The client corrected the files and made some decisions; the rerun ran the same contract and is linked to the first run.

First register34

exceptions in 3 files

→
Client's changes23

20 corrections and 3 decisions (synthetic), each listed in the CSV below

→
Rerun11

23 resolved · 0 new · 9 decisions and 2 recounts left

  • items.csv:ITEM_CODE=ITM-00301 · orphan reference · Client supplies the supplier or corrects the reference.
  • items.csv:ITEM_CODE=ITM-01178 · orphan reference · Client supplies the supplier or corrects the reference.
  • items.csv:ITEM_CODE=ITM-00412 · duplicate key · Client decides.
  • items.csv:ITEM_CODE=ITM-01402 · orphan reference · Client supplies the supplier or corrects the reference.
  • stock_on_hand.csv:STOCK_LINE_ID=SOH-000151 · orphan reference · Client corrects the code or says where the stock belongs.
  • stock_on_hand.csv:STOCK_LINE_ID=SOH-000401 · out of range · Client investigates and recounts.
  • stock_on_hand.csv:STOCK_LINE_ID=SOH-000621 · cross field inconsistency · Client decides which date is right.
  • stock_on_hand.csv:STOCK_LINE_ID=SOH-001734 · out of range · Client investigates and recounts.
  • stock_on_hand.csv:STOCK_LINE_ID=SOH-002005 · cross field inconsistency · Client decides which date is right.
  • stock_on_hand.csv:STOCK_LINE_ID=SOH-002211 · orphan reference · Client corrects the code or says where the stock belongs.
  • suppliers.csv:SUPPLIER_ID=S0012 · probable duplicate · Client decides whether they are one supplier. Proposed by the operator, not a client rule.

The corrections applied (CSV)Rerun register (CSV)Rerun manifest (JSON)

The rules it was checked against

20 declarations, each tracing to who declared it and a written source. Severity is supplied by the rule, never inferred by the engine.

RuleSeverityKindFieldWhat it requires · declared by · source
sup.keyBLOCKINGprimary keySUPPLIER_IDSUPPLIER_ID is unique
Demo partner: implementation lead · DEMO-INV-SPEC-1 s2 'SUPPLIER_ID identifies a supplier'
sup.required.SUPPLIER_NAMEBLOCKINGrequiredSUPPLIER_NAMESUPPLIER_NAME must be present
Demo partner: implementation lead · DEMO-INV-SPEC-1 s3 mandatory fields
sup.required.CURRENCYBLOCKINGrequiredCURRENCYCURRENCY must be present
Demo partner: implementation lead · DEMO-INV-SPEC-1 s3 mandatory fields
sup.payment_termsHIGHvocabularyPAYMENT_TERMSPAYMENT_TERMS is one of the configured terms
Demo partner: implementation lead · DEMO-INV-SPEC-1 s4 payment terms table
sup.countryHIGHvocabularyCOUNTRYCOUNTRY is one of the configured countries
Demo partner: implementation lead · DEMO-INV-SPEC-1 s4 country table
sup.probable_duplicateHIGHduplicatePropose 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.keyBLOCKINGprimary keyITEM_CODEITEM_CODE is unique
Demo partner: implementation lead · DEMO-INV-SPEC-1 s5 'ITEM_CODE identifies an item'
item.description_lengthHIGHmax lengthDESCRIPTIONDESCRIPTION fits the target's 40-character field
Demo partner: implementation lead · DEMO-INV-SPEC-1 s6 target field DESCRIPTION is 40 characters
item.uomBLOCKINGvocabularyUOMUOM is one of the configured units
Demo partner: implementation lead · DEMO-INV-SPEC-1 s7 units of measure table
item.cost_decimalHIGHdecimalSTANDARD_COSTSTANDARD_COST is a decimal number
Demo partner: implementation lead · DEMO-INV-SPEC-1 s8 costs are decimals with a point
item.reorder_integerMEDIUMintegerREORDER_LEVELREORDER_LEVEL is a whole number
Demo partner: implementation lead · DEMO-INV-SPEC-1 s8 reorder level is a whole number
item.type_costingHIGHallowed 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.keyBLOCKINGprimary keySTOCK_LINE_IDSTOCK_LINE_ID is unique
Demo partner: implementation lead · DEMO-INV-SPEC-1 s10 'one row per stock line'
soh.locationBLOCKINGvocabularyLOCATIONLOCATION is one of the configured locations
Demo partner: implementation lead · DEMO-INV-SPEC-1 s11 locations table
soh.received_dateHIGHiso dateRECEIVED_DATERECEIVED_DATE is a YYYY-MM-DD date
Demo partner: implementation lead · DEMO-INV-SPEC-1 s12 dates are YYYY-MM-DD
soh.qty_rangeBLOCKINGrangeQTY_ON_HANDQTY_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_expiryBLOCKINGconditional requiredLOT_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_receivedHIGHdate orderLAST_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_existsBLOCKINGrelationshipSUPPLIER_IDEvery 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_existsBLOCKINGrelationshipITEM_CODEEvery 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'

Download the effective rules contract (TOML)

What the client sent

4,421 records in three files, generated for this example. Every name and code is synthetic.

suppliers.csv

120 records · 7 columns · sha256 0ae95d36a2a8

SUPPLIER_IDSUPPLIER_NAMECOUNTRYCURRENCYPAYMENT_TERMSVAT_REFSTATUS
S0001Synthetic Supplier 001 LtdIEEURNET30SYN-TAX-00001ACTIVE
S0002Synthetic Supplier 002 LtdGBGBPNET30SYN-TAX-00002ACTIVE
S0003Synthetic Supplier 003 LtdDEEURNET60SYN-TAX-00003ACTIVE
S0004Synthetic Supplier 004 LtdNLEURNET60SYN-TAX-00004ACTIVE
S0005Synthetic Supplier 005 LtdNLEURNET60SYN-TAX-00005ACTIVE
items.csv

1,501 records · 9 columns · sha256 797af48ae0fd

ITEM_CODEDESCRIPTIONITEM_TYPEUOMCOST_METHODSTANDARD_COSTSUPPLIER_IDREORDER_LEVELSTATUS
ITM-00001Gasket 40mm stainlessSTOCKMFIFO320.29S0018125ACTIVE
ITM-00002Grommet Small nylonSTOCKMFIFO478.32S0055194ACTIVE
ITM-00003Hinge Large stainlessSTOCKEAAVERAGE195.62S0104121ACTIVE
ITM-00004Filter M12 plainSTOCKBOXSTANDARD16.31S010917ACTIVE
ITM-00005Bearing M8 blackSTOCKMSTANDARD262.23S0009151ACTIVE
stock_on_hand.csv

2,800 records · 11 columns · sha256 8a5d26ba0651

STOCK_LINE_IDLOCATIONITEM_CODEBINTRACKINGLOT_NUMBEREXPIRY_DATERECEIVED_DATELAST_COUNTED_DATEQTY_ON_HANDUNIT_COST
SOH-000001SHOPITM-01087C29-2NONE2026-04-112026-04-1344598.55
SOH-000002SHOPITM-00541A13-5NONE2026-04-222026-05-2225420.58
SOH-000003WH1ITM-01005D09-2NONE2026-03-032026-04-0634350.49
SOH-000004SHOPITM-00819D13-2NONE2026-01-042026-02-0634496.36
SOH-000005WH1ITM-01037E23-3LOTLOT334742027-11-062026-01-072026-01-07253216.00

Reproducible: running the same files and rules again gives the same register, byte for byte. Result fingerprint 9ffd444a190e82e1.

How exceptions are classified

Ten classes in this run. Each exception carries the severity of the rule it breaks.

VALUE_NOT_ALLOWED9

Value not on the declared list

CROSS_FIELD_INCONSISTENCY7

Fields that contradict a declared rule

ORPHAN_REFERENCE6

Reference to a record that isn't there

INVALID_FORMAT4

Value not in the required format

MAX_LENGTH_EXCEEDED2

Longer than the target field

OUT_OF_RANGE2

Outside the permitted range

DUPLICATE_KEY1

Key used by more than one record

INVALID_TYPE1

Not the required type

MISSING_REQUIRED1

Mandatory field empty

PROBABLE_DUPLICATE1

Two records that may be one

BLOCKING

Will fail the load or corrupt balances.

HIGH

Will migrate, and will be wrong.

MEDIUM

Degrades quality, not correctness.

Reproducible

Same files and rules, same register. Each run records file, rule-set and result fingerprints.

Traceable

Every rule names who declared it and the written source, down to the section.

Human gate

A note can't be issued until a person writes the interpretation and confirms six checks, from the right buyer to retention.

Stated limits

Every note lists what was not checked: the target system, totals across rows, value agreement between files.

This is the £500 deliverable, for your files and your rules: the Exception Register, the Readiness Note and the rerun.

05 Break-even

How many hours would it have to save?

Put in your own rate. The page does the arithmetic and nothing else: no benchmarks, nothing sent.

£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.

Need a purchase order? Raise it against the written scope you receive first; the payment request can quote it. How payment works

Not sure it fits? Ask about fit first: platform and timing only, no files.

  • 01
    One client migration
  • 02
    Up to 6 CSV or delimited files
  • 03
    Up to 50,000 aggregate rows
  • 04
    Templates and allowed-value listsused as declared rules
  • 05
    Up to 5 declared cross-field rules
  • 06
    Exception Register (CSV)record, rule, expected, found, severity
  • 07
    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.

Contact

bernardo@lorijola.com. Please don't attach client files.

A fit answer by email from bernardo@lorijola.com. We aim to respond within one UK business day.

07 Questions

The questions worth asking, answered straight.

Will you contact my client?

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?

Compare the Pre-load Review with
DimensionManual spreadsheet reviewERP / vendor import validationFull migration consultancyLorijola Pre-load Review
PurposeSpot-check files by eye or formulaConfirm the target accepts each recordPlan and deliver the whole migrationFind file exceptions against declared rules before the load
TimingAny time; depth variesAt load, inside the targetThroughout the projectBefore the first, or next, trial load
Business-rule checksWhat the reviewer knows to look forThe rules configured in the targetYes, as part of the workYour declared rules, lists and templates, with up to 5 cross-field rules
Cross-file checksHard at volumeReferences the target can resolve, often once parent records are loadedYesExistence of references across up to 6 files
OutputAd hoc notesImport log or error reportVaries by firmRecord-level Exception Register and a one-page Readiness Note
Knows the target's live configurationOnly what the reviewer knowsYes: it is the targetYesNo: 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.

Request the Pre-load Review

Tell me about one migration. This is a request, not an order.

Please don't include client or customer data, and don't attach files.

You get a fit answer and a fixed written scope. No files yet, no payment details.

Not sure it fits?Ask first: platform and timing only, no files
For example: Sage 200 → Sage Intacct · Sage → Business Central · NetSuite · CargoWise · Odoo · Other
Migration timing (optional)
Please don't include client or customer data, and don't attach files.

No client data needed. These details are used only to reply.