Skip to main content
Version: Current

Import bank statements

The Bank Statement Import Wizard separates source preparation, parsing, preview, operator decisions and commit. This separation is essential: a file can be readable without being safe to commit, and a successful commit can still require reconciliation.

The verified import contract supports parser types csv, xlsx and pdf, source-specific mapping profiles, row diagnostics, ignored rows, a commit decision for warning rows and an idempotency key. Each committed row can retain a file identifier, download reference, file checksum, parser version, mapping profile ID, original row index and row hash.

Audience: treasury preparers, accountants, implementers, support analysts and auditors
Learning time: 55 minutes
Navigation: Finance → Bank statements → Import statement
Control objective: make every committed bank line reproducible from a retained source row without creating duplicate imports or silently accepting invalid data.

Learning outcomes

You will be able to:

  • prepare a controlled source package before upload;
  • choose a parser and mapping profile without guessing;
  • explain parse, preview and commit as separate operations;
  • interpret accepted, warning, error and ignored row outcomes;
  • verify normalized dates, amounts, currencies, directions and references;
  • decide whether warning rows may be included;
  • use idempotency and provenance to prevent duplicate economic evidence;
  • reconcile commit summaries to the source file;
  • collect support evidence when a parser or mapping fails.

Exact definition and boundaries

A parser reads the source representation. A mapping profile maps source keys or columns to Makronexus target fields. A preview validates and normalizes rows but does not necessarily commit them. A commit creates the import and accepted transaction records under an idempotency key.

StageInputOutputMutation?
Source preparationbank file and statement metadataapproved source packageno Makronexus mutation
Parseraw rows, parser type, mapping profilemapped row candidates and diagnosticsno committed transaction
Previewimport draft and candidate rowsnormalized rows, confidence, warnings/errorsno committed transaction
Operator decisionpreview resultinclude, correct or ignore decisionno committed transaction
Commitimport draft, approved rows and optionsimport ID and commit summarycreates persistent evidence
Reconciliationcommitted transactions and internal recordsmatches, discrepancies and review evidenceseparate workflow

Do not describe PDF support as universal OCR capability. The contract accepts pdf as a parser type, but actual layouts, mapping profiles and extraction quality remain source-specific.

Provenance model

Provenance fieldWhy it matters
file_idstable storage identity for the retained statement
download_urlcontrolled retrieval reference; access must remain protected
checksumdetects source-file changes and duplicate submissions
parser_versionexplains changes in extraction behaviour
mapping_profile_ididentifies the mapping rules used
row_hashsupports row-level duplicate and re-performance checks
original_row_indexlinks normalized data to the original source position

A file name is not a checksum, and a visual row number is not a stable row hash.

Mapping profiles

A mapping profile contains a source system, parser type, name, default flag, version and mappings from source keys to target fields.

Target fieldRequired meaning
Transaction datebooking date recognized by the source
Value dateoptional clearing/effective date
Amountnumeric amount represented by the row
Currencyexplicit row or statement currency
Transaction typenormalized credit/debit direction or preserved source code
Referencesource reference useful for matching
Descriptionsource narrative
Metadataadditional source-specific evidence

Before using a profile, confirm that its source system and parser type match the current file. A default profile is a convenience, not proof that the bank has not changed its export layout.

Parse, preview and commit sequence

Row outcome model

OutcomeMeaningCommit rule
acceptedrow passes required normalization and validationeligible for commit
warningrow is usable but requires operator reviewcommitted only when warning inclusion is authorised
errorrow is invalid or unsafemust not be committed as a valid transaction
ignoredrow is intentionally excludedretain reason/provenance but do not create a transaction

The preview summary exposes total, accepted, warning, error and ignored counts. The commit summary exposes committed and skipped counts in addition to warning/error/ignored totals. These numbers must be reconciled, not merely displayed.

Prerequisites

RequirementWhy it matters
Approved source institution and bank accountprevents a valid file being attached to the wrong school account
Correct school selectedimport draft is school-scoped
Exact statement reference and dateforms the statement identity
Confirmed opening and closing balancesprovides import control totals
Confirmed currency designprevents accidental cross-currency normalization
Retained source file and checksumsupports duplicate prevention and audit re-performance
Supported parser and tested mapping profilemakes transformation repeatable
Importer with bank_statement_import:createrequired for final creation
Reviewer with read/list abilitiesindependently verifies commit evidence
Incident path for parser failuresprevents unsafe manual workarounds

Roles and exact permissions

ActionExact abilityControl
List mapping/import results in the workspacebank_statement_import:listscope to the selected school
Inspect a committed importbank_statement_import:readprotect file access
Commit a new importbank_statement_import:createuse a stable idempotency key
Correct import lifecycle statusbank_statement_import:updatereason and reviewer evidence required
List committed linesbank_statement_transaction:listreconcile counts and totals
Read one committed linebank_statement_transaction:readinspect row provenance and status
Append approved linesbank_statement_transaction:createnot allowed after archival
Correct line status or payment linkbank_statement_transaction:updatedo not use to bypass matching controls
Review bank-account configurationschool_bank_setting:readprove the destination account
List bank accounts/providersschool_bank_setting:listchoose only active approved configuration
Update source configurationschool_bank_setting:updateconfiguration change is separate from import repair

Prepare the source package

Before upload, create a source-control record containing:

  1. school and bank account;
  2. source system or export channel;
  3. statement period and reference;
  4. file name, size, format and checksum;
  5. opening and closing balances;
  6. currency and any multi-currency caveat;
  7. received timestamp and person;
  8. expected row count;
  9. whether headers, footers, balances or summary rows are included;
  10. approved mapping profile and version.

Do not edit the original file to “make it work.” When transformation is required, preserve the original and retain a controlled transformed copy with a reason.

Guided procedure

1. Search before importing

Open Bank statements and search the statement reference, source system and date.

Expected result: no authoritative completed or processing import exists for the same source package.
Control: if an import exists, investigate it before retrying.

2. Start the wizard

Choose Import statement with bank_statement_import:create. Select or enter the bank/source identity and parser type.

Expected result: the wizard displays the import draft and parser configuration.
Control: do not choose CSV merely because the file can be opened as text.

3. Select a mapping profile

Use the approved source-specific mapping profile. Confirm profile version and inspect mapped target fields.

Expected result: transaction date, amount, reference and other required fields map to the correct source columns.
Control: a changed bank header name can map the wrong data without producing a file-read failure.

4. Parse the source

Submit raw rows for parsing.

Expected result: mapped candidates and diagnostics appear.
System effect: no persistent transaction has been created.

5. Review preview diagnostics

For every row, inspect status, confidence, warnings, errors, normalized values and original row index.

Expected result: totals by status equal the source row population.
Control: confidence is decision support, not approval.

6. Correct or ignore safely

Correct the mapping or source interpretation for errors. Mark non-transaction rows such as approved headers as ignored. Document every manual decision.

Expected result: no unexplained error row remains in the commit population.

7. Reconcile normalized totals

Compare normalized row count, credit/debit or signed totals, currency and date range to the statement. Test:

opening balance + net statement movement = closing balance

Use the bank’s sign and direction rules. Do not force the formula to balance by changing an unexplained row.

8. Decide on warning rows

Set include_warning_rows only when an authorised reviewer has determined that each warning row is valid and traceable.

Expected result: warning inclusion is explicit, not accidental.

9. Commit with idempotency

Use a stable idempotency key derived from the controlled import request—not a random value generated for every retry.

Expected result: the response returns the import identity and summary.
Control: changing the idempotency key to overcome an uncertain timeout can create duplicate evidence.

10. Reconcile the commit summary

Verify:

  • total rows;
  • committed rows;
  • skipped rows;
  • warning rows;
  • error rows;
  • ignored rows;
  • import ID, tenant, school, source and status;
  • committed transaction totals.

11. Retain an evidence pack

Store the source checksum, parser version, mapping profile, preview summary, operator decisions, commit request identity, response summary and request ID.

Import field reference

FieldMeaningRequiredValidation/control
Schoolowner of the importyesmatch selected context
Source systembank/export identityyesuse controlled code
Statement referenceexternal statement identityyesduplicate-check
Statement datestatement header datecontract-specificvalidate date semantics
Opening/closing balancestatement control totalsoptional in APIrequired by school policy where available
Currencystatement currencyyesuse approved three-letter code
File URLretained source referencecontrolledprotect access and expiry
Parser typecsv, xlsx or pdfyes for wizardconfirm layout support
Mapping profileversioned source-to-target rulessource-dependentdo not silently default
Idempotency keycommit request identityyes in commit optionsstable across exact retries

Worked scenario: Mupfure Learning Academy

Mupfure receives an XLSX statement from its primary bank. The source package contains 212 visible rows, including one title row, one opening-balance row and one closing-balance row. The approved mapping profile expects columns named Booking Date, Value Date, Narrative, Reference, Debit, Credit and Currency.

The bank changed Booking Date to Transaction Date. The old profile maps no date and produces 209 error rows. The implementer does not edit the original statement. They create and test a new profile version, rerun preview, and obtain 207 accepted transaction rows, two warnings for blank references and three ignored non-transaction rows.

The reviewer confirms the two warning rows using amount, value date and narrative. The commit includes warning rows under one stable idempotency key. The returned committed count is 209 and skipped count is three. The team retains both profile versions and the preview evidence because the mapping change explains why the first preview failed.

Failure modes

SymptomLikely causeEvidence to inspectSafe actionEscalate when
Most rows have missing dateschanged column header or profileraw keys and mapping versioncorrect/test mapping profilesource layout is ambiguous
Amounts are inverteddebit/credit mapping or sign conventionsource columns and normalized directioncorrect mapping; rerun previewcommitted rows already affected
PDF rows merge or splitlayout not supported by parserparser diagnostics and original pageuse approved alternate source exportno reproducible extraction exists
Duplicate commit after timeoutnew idempotency key used on retryrequest keys and import searchstop; identify authoritative importduplicate rows reached reconciliation/accounting
Warning rows committed unintentionallyinclude option enabled without reviewcommit options and warning diagnosticsquarantine affected import and reviewwrong amounts/dates were stored
Row totals do not equal sourceignored headers misunderstood or rows omittedoriginal indexes and summaryreconcile every row classificationuntraceable difference remains
File URL no longer workssigned link expiredstorage file ID and retention evidenceregenerate controlled accessoriginal file is unavailable
Currency normalization is wrongstatement or row currency mappingimport draft and normalized rowscorrect before commitmulti-currency source cannot be represented
Commit rejectederrors remain or required identity missingpreview rows and API error detailscorrect request; reuse exact retry identityservice returns inconsistent diagnostics

Verification checklist

  • Source file is preserved unchanged.
  • File checksum and file ID are recorded.
  • School, bank account, source system and statement reference are correct.
  • Parser type matches the actual source.
  • Mapping profile and version are approved.
  • Every source row has an accepted, warning, error or ignored outcome.
  • No error row is included in the commit.
  • Every warning row has a documented inclusion decision.
  • Normalized dates, amounts, currencies, directions and references are sampled.
  • Opening/closing movement and row totals are reconciled.
  • Stable idempotency is used for exact retries.
  • Commit summary equals the approved population.
  • Provenance is retained for every committed row.
  • Reviewer can reproduce the result from the evidence pack.

Practice and knowledge check

Guided practice: create a twelve-row CSV with one title row, one invalid date and one missing reference. Build a mapping, preview it, classify every row and commit only the approved population.

Independent scenario: a PDF preview has 98% confidence but the total amount differs from the statement by USD 500. Decide whether to commit and list the evidence required.

  1. Why are parse and preview separate from commit?
  2. What does a mapping profile version explain?
  3. What is the difference between a warning and an error?
  4. Why is confidence not approval?
  5. What does a row hash support?
  6. When may warning rows be committed?
  7. Why must the same idempotency key be reused for an exact retry?
  8. What must be reconciled after commit?

Answer guide: the early stages are non-committing validation; profile versions explain transformation rules; warnings are reviewable while errors are unsafe; confidence cannot replace control totals; row hashes support provenance/duplicate checks; warnings require authorised evidence; stable retry identity prevents duplicates; counts, totals, scope, import identity and every skipped row must be verified.

Next lesson

Continue to Match and reconcile.