Import sessions
Import sessions are vestl’s safe, review-first path from spreadsheet data to live records. Upload and preview never change live records; only the final Commit session action writes reviewed rows.
Use Imports when you need to start from a CSV or Excel workbook. vestl saves the file details and staged rows, suggests a column map, validates the mapped records, and keeps every issue visible before final confirmation.
Import/export parity
For master data that can be exported and imported, the CSV contract follows the same operator-owned fields and labels as the record’s create/edit flow. A CSV exported from vestl can therefore be uploaded again without translating vestl’s own headings. Flexible aliases and fuzzy column mapping remain available for files from other systems.
Generated identifiers, approval state, inventory balances, calculated availability, valuation caches, and audit metadata are not round-trip fields because an operator does not author them when creating the record. Operational, audit, and accounting exports may remain report-shaped; those downloads are reports, not import templates, and their documentation must say so.
What an import session is
An import session is a saved record of one file upload and its dry-run review state.
Each session stores:
- the original filename and file format
- detected workbook or tab structure
- staged source rows for supported dry-run formats
- source-profile hints such as Wherefour, Kostner, or Generic
- issue counts and diagnostics from intake and dry run
- session events such as received, inspected, dry-run started, previewed, or failed
- resumable state so the same session can be reopened later
An active import session is staged work, not live data. The current release can commit Companies, Products / SKUs, Formulas, BOMs, Inventory on-hand, and Locations. Vendor terms and compliance records are not importable yet.
Every uploaded file, detected sheet, staged row, mapping, issue, and session event belongs to your active organization. Organization ownership comes from your signed-in workspace and cannot be selected in the upload. A session from another organization is treated as nonexistent, including its diagnostics and source rows.
Supported file formats
The new-import upload step accepts these file types:
- CSV (
.csv) - Excel (
.xlsx)
If the file extension is unsupported, vestl rejects the upload and records a structured error on the session.
If the file is malformed, vestl keeps the failed session record and stores the failure details instead of silently dropping the upload.
Both formats support the complete workflow: upload, column mapping, dry-run preview, resolution review, and commit. Apple Numbers files are not offered in the new-import screen because they cannot yet provide rows for column mapping; export them as CSV or Excel first.
What vestl detects during intake
After upload, vestl inspects the file and persists a workbook summary.
For CSV and Excel files, the summary can include:
- sheet or tab name
- sheet order
- detected row count
- detected column count
- whether a usable header row was found
- workbook-level and sheet-level diagnostics
- staged source rows preserved for review screens
Excel workbooks often include instruction pages, printable tags, or other formatted tabs alongside the actual data. If a tab has no usable table header in its opening rows, vestl skips that non-tabular tab with a warning and continues with the usable data tabs. If no tab has a usable header row, the workbook is rejected so no ambiguous rows are staged.
Operational exports may place a report title, date, or blank spacer above the table. vestl scans the first 25 rows for the strongest tabular header, records the detected physical row, and keeps subsequent validation messages aligned to the row numbers operators see in Excel. A worksheet can still contain one imported table; split multiple independent tables into separate tabs before upload.
vestl also runs a source-profile check. Today the shared vocabulary includes:
- Wherefour
- Kostner
- Generic
- Unknown
The source profile is a hint, not a commit. It helps later mapping and review steps start with the right assumptions.
Dry-run preview
The current release previews Companies, Products / SKUs, Formulas, BOMs, Inventory on-hand, and Locations using each record type’s own mapping and validation contract.
The dry-run preview:
- validates selected staged rows row-by-row
- prepares valid rows for review using the selected record type
- marks each staged row as Resolved or Invalid
- replaces prior row issues for the selected rows on rerun
- updates the session to Previewed on success
- records whether the preview started, succeeded, or failed
- never creates or updates live records until the operator commits the session
Ambiguity review
Ambiguity review helps you decide what should happen when vestl cannot safely match a spreadsheet row to one existing company.
Use this step after a successful company dry run when the preview found rows that still need an operator decision before a later approval screen can proceed.
What the ambiguity review step does:
- shows ambiguous matches where vestl found more than one plausible existing company
- shows create-new recommendations when no safe existing match was found
- keeps skip behavior explicit when a row should stay out of the later approval set
- saves the operator choice on the import session instead of writing live company records
- keeps blocker counts visible so you can tell whether the session is ready for a later approval step
- lets you download error rows for any invalid, unresolved, or skipped blockers that still need attention
This step is still review-only. Matching an existing company, choosing create-new intent, or choosing skip behavior does not create, update, or delete a live company.
Resolution actions
Each ambiguous or blocked row can move into one of these operator decisions:
| Resolution action | Meaning |
|---|---|
| Match existing | You picked the correct existing company candidate for this row. |
| Create new | You want this row to create a new live record when you commit the session. |
| Skip | You do not want this row included in the later approval set right now. |
How to review ambiguous matches
- Complete intake, mapping, and the company dry run on the same session.
- Open the Company ambiguity review card.
- Review the candidate list for each blocked row.
- Choose the correct existing company, mark the row as create-new, or use skip behavior if the row should stay out of scope.
- Save the decision.
- Recheck the blocker counts and, if needed, download error rows for anything still invalid, unresolved, or skipped.
What create-new and skip mean
- Create new means the row is allowed to keep moving through the staging workflow. It does not create a live company record yet.
- Skip means the row remains visible as intentionally excluded. Skip behavior is durable and inspectable, but skipped rows still stay out of the later approval set until an operator changes the decision.
- Invalid rows still need source-data fixes. They remain blockers and should appear in the error export.
Download error rows
Use the error-row export when you need to hand unresolved work back to the spreadsheet owner or audit what still blocks the later approval step.
The download error rows action includes rows that are:
- invalid after dry run
- unresolved in the ambiguity review step
- intentionally skipped
The export keeps issue codes and issue messages so you can see why the row is still blocked.
Mapping review
The mapping review workspace helps you confirm which spreadsheet columns feed each target field before you rerun the dry run. Suggestions come from two places:
- Deterministic matching — vestl compares normalized header words against known synonyms, tolerates small spelling mistakes, and checks typed fields against sample values. A number alone is never enough to guess that a column is ABV, cost, quantity, or another numeric field.
- AI assist (when configured) — for columns the deterministic matcher can’t place (abbreviated headers, other languages, unit-embedded names), vestl can ask an AI model to propose a mapping. AI proposals are marked with an ai tag at medium confidence, can only fill unfilled fields with unused columns, and never override a deterministic match. Like every suggestion, they take effect only after you review and rerun the dry run. If the AI service isn’t configured or unavailable, the deterministic suggestions stand on their own.
What the workspace does:
- reads the session’s detected source columns for the selected sheet
- suggests a target company field for each source column
- shows a confidence label for each suggestion
- shows bounded sample values so you can judge whether the suggestion looks right
- shows Source coverage for populated columns that are still being left out, while listing empty template columns separately
- lets you override any suggestion before rerunning the dry run
- saves those overrides on the import session so you can reopen the same session later without re-uploading the file
The mapping review workspace is still part of the no-live-write staging layer. Saving a mapping does not create or update any live company, product, inventory, or compliance records.
What confidence means
Confidence is a review hint, not proof that a mapping is correct.
Use the labels this way:
| Confidence | Meaning |
|---|---|
| High | vestl found a strong header-and-sample match for the target field. Review it, but you usually will not need to change it. |
| Medium | vestl found a plausible match, but the header, values, or both still leave room for operator judgment. Review sample values before keeping it. |
| Low | vestl could not build a strong case for the suggestion. Treat these as draft guesses and expect to override them often. |
A high-confidence suggestion can still be wrong if the source file uses unusual business language. The operator stays responsible for the final mapping.
What sample values mean
Sample values help you spot whether a suggested mapping fits the real data in that column.
Examples:
- a column mapped to company type should show values that look like client or vendor categories
- a column mapped to active status should show values that look like yes/no or true/false flags
- a column mapped to company code should show short identifiers, not free-form notes
The workspace shows only a bounded sample, not every row. Use it to make a fast judgment, then rerun the dry run to validate the full staged set.
How overrides work
Overrides let you replace the suggested target field with the one you want.
Operator flow:
- Open the mapping review workspace for the sheet you want to preview.
- Review the suggested target field, confidence, and sample values for each source column.
- Change any target field that looks wrong or incomplete.
- Save the mapping.
- Rerun the company dry run from the same session.
When you rerun the dry run after saving overrides:
- vestl uses the saved mapping first
- alias fallback is no longer the main driver for the mapped fields you reviewed
- required-field diagnostics reflect the saved mapping you chose
- the same upload session is reused, so you do not need to upload the file again
If the mapping payload is malformed or incomplete, vestl keeps the session, records a mapping failure, and leaves the prior saved mapping untouched.
Current company preview rules
The company dry-run preview looks for flexible headers such as:
Customer Name,Vendor Name, orNameParty CodeorCodeParty TypeorTypeNotesActive
Rows are currently previewed against these company fields:
- Name
- Code
- Type
- Notes
- Active
Types normalize to:
- Client
- Vendor
- Carrier
- Internal
The dry run returns row-level issues when required values are missing or malformed.
Accepted columns for the first company preview
The first company dry run accepts flexible header aliases instead of one rigid template.
| Company field | Accepted column headers |
|---|---|
| Name | Name, Party Name, Customer Name, Vendor Name, Client Name |
| Code | Code, Party Code, Customer Code, Vendor Code |
| Type | Type, Party Type, Customer Type, Vendor Type |
| Notes | Notes, Note, Comments, Comment |
| Active | Active, Enabled, Is Active, Status |
Header matching is case-insensitive and trims extra spacing before validation.
What row status means
After preview, each returned row is labeled as either:
| Row status | Meaning |
|---|---|
| Valid | vestl found no row-level blocking issues. The row is ready for review but remains staged until commit. |
| Invalid | vestl found row-level issues. Fix the row and rerun the preview on the same session. |
What validation issues mean
Dry-run issues are persisted diagnostics, not live-write failures. They help you understand why a row could not move forward.
Common issue patterns include:
- missing name
- missing or malformed company code
- missing or invalid company type
- invalid active true/false values
- empty staged sheets
- unsupported dry-run file formats
Each issue can include:
- severity
- issue code
- human-readable message
- sheet name
- row number
- column key
Numbers behavior in the current release
Numbers uploads are supported for intake metadata only.
What works now:
- vestl accepts
.numbersfiles into an import session - vestl records workbook or table metadata when it can detect it
- vestl preserves failure details if the dry run is attempted
What does not work yet:
- Numbers rows are not staged for the company dry run
- Numbers dry run does not return row-by-row preview rows
- Numbers dry run does not create or update live records
When you run a dry run against a Numbers session, expect a structured failure that explains CSV and XLSX are the currently supported preview formats.
Products import
The products import flow mirrors the company flow — intake, mapping, dry-run preview, ambiguity review — but for finished goods and raw materials. Choose Products / SKUs at intake to send the workbook through the products workflow.
Required workbook columns
The dry-run preview blocks rows that are missing any required field.
| Field | Required | What it is |
|---|---|---|
| Name | yes | Display name of the product. |
| Product Type | yes | Finished good or raw material. Short labels like FG and RM are accepted. |
| Base UOM Code | yes | Symbol of the base unit of measure (EA, L, kg, gal, etc). The UoM must exist in vestl’s units table. |
Optional workbook columns
| Field | What it is |
|---|---|
| Customer SKU | External SKU from the source system. Used as the highest-precedence match key against existing products. |
| Owner Company Code or Name | Required for finished goods and must resolve to an existing client. Raw materials default to HOUSE when this column or cell is blank. |
| Product Line Code or Name | Existing product line associated with the source row. Leave blank for standalone products. |
| Material Kind | Operational class such as ingredient, raw liquid, bottle, can, closure, label, case box, partition, tray, caddy, or shipper. Common subcategory labels are normalized. |
| Compliance Regime | TTB or None. Defaults to None when omitted. |
| Purchase UOM Code | Unit normally used to purchase the item. The base unit remains inventory truth. |
| Target ABV % | Target alcohol-by-volume percentage. |
| TTB Formula No. | TTB formula number for products under the TTB compliance regime. |
| Fill volume per vessel (ml) | Per-vessel fill volume (bottle, can, keg, or pouch). |
| Bottles per Case | Pack count for case BOM derivation. |
| Density (g/mL) | Product-specific bridge for valid weight-to-volume planning conversions. |
| Description | Free-text description carried into the product record. |
| Active | true/false (or yes/no). Defaults to true. |
| Procurement Lead Time | Supplier lead time in whole days. |
| Production Lead Time | Finished-good production duration in whole days. |
| Minimum Order Quantity | Smallest replenishment quantity. |
| Safety Stock | Protected minimum balance. Köstner-style Min Level headers map here. |
| Reorder Point | Projected balance that triggers replenishment review. |
| Standard Cost | Expected unit cost used for planning when no posted inventory valuation is available. Client-owned material cannot carry a standard cost. |
| Shelf Life / Removal Lead / Expiry Alert Lead | Product date policy in whole days. |
| Round Component Quantity | Whether planning rounds component demand to a whole unit. |
| Reference Photo | Reference image URL or path. |
| Production Tags | Comma-, semicolon-, or pipe-separated resource compatibility tags. |
vestl generates SKUs
vestl never accepts a finished SKU from a workbook. SKUs follow a fixed format and are assigned when the approved import is committed. The dry-run preview shows the planned SKU prefix for each row so you can confirm the inferred client, line, and product type before any record is written.
Match strategy
vestl scopes candidate matching to the same owner company — two products with the same name owned by different clients are different products and will not collide. Within that scope, the importer scores candidates by:
- Customer SKU exact — highest precedence. A workbook customerSku that matches an existing product’s customerSku is a strong match.
- Name exact / alias — display-name equality (or alias equality on the candidate).
- Name similarity — token overlap and shared prefix scoring.
- Same brand bonus — when the workbook’s brand matches the candidate’s brand, similarity scores get a small bump.
A SKU match with a different display name is still flagged for review so you can confirm the row before committing.
Dry-run validation
The product dry-run checks each row against the owner company, brand, and base unit records in vestl, then reports per-row issues:
| Issue | Meaning |
|---|---|
| Missing owner company code | A finished-good owner is blank. Raw materials instead default to HOUSE. |
| Owner company not found | The code doesn’t match any company in vestl. Add the company first through import or the company wizard. |
| Owner company inactive | The owner company exists but is inactive. |
| Finished good owner is not a client | The row is a finished good but its Owner Company Code names a vendor or HOUSE. Every finished good belongs to a client — put the owning client’s code in this column. vestl will not guess one. |
| Product line not found | The brand code doesn’t match any brand. |
| Product line owner mismatch | The brand belongs to a different company than the workbook’s owner. vestl shows this as a warning so you can confirm the unusual pairing. |
| Base unit not found | The base unit symbol doesn’t match any unit of measure in vestl. |
| TTB raw material warning | A raw material row was flagged as TTB-regulated. vestl shows this as a warning. |
| Invalid numeric value | Target ABV, bottle volume, or bottles per case did not parse cleanly. |
Lifecycle phases
Every import session carries a lifecycle phase and a broader status.
Phases
| Phase | Meaning |
|---|---|
| Received | The upload was received and the session record was created. |
| Inspected | vestl inspected the workbook or bundle and saved the detected structure. |
| Mapped | The session now carries reviewable source-to-field mappings for a selected sheet. |
| Resolved | Reserved for later work that resolves row- or reference-level issues. |
| Previewed | vestl completed a dry-run preview and saved row-level validation state. |
| Approved | Reserved for the explicit human approval step before any commit. |
| Committed | Reserved for the final write of approved data into live records. |
| Failed | Intake or a later stage failed and the session now carries failure details. |
Status values
| Status | Meaning |
|---|---|
| Active | The session is still in progress or waiting for the next step. |
| Completed | The session was committed — its rows were written to live records. |
| Failed | The session hit a blocking error. |
| Abandoned | The session was intentionally left unfinished. |
Current release boundary
In this release, intake, mapping, dry run, and ambiguity review can move sessions through these practical states:
- Received
- Inspected
- Mapped
- Previewed
- Resolved
- Failed
Committed
- Committed — the terminal state. Pressing Commit session in the Resolve step writes the reviewed rows into live records in one transaction. A committed session can never be edited, re-run, or committed again.
Committing a session
When every ambiguous row has a decision (or your file had none), the Commit session button enables in the Resolve step. Committing:
- creates a live record for each valid row that wasn’t matched or skipped — company records for Companies, product records with server-minted SKUs for Products, and traceable lots for Inventory on-hand
- links rows you matched to existing records instead of creating duplicates
- skips — and records why — invalid rows, rows you chose to skip, rows on sheets that never ran a dry run, and rows whose company code already exists
Nothing partial: all writes happen in one transaction, and the per-row outcome (created / linked / skipped, with the created record’s id) is stored on the session permanently. The success panel shows the counts and links to the created records.
Rules worth knowing:
- Commit covers the whole session. In a multi-sheet workbook, run the dry run on each sheet you want imported first — sheets that never ran a dry run are recorded as not validated and skipped.
- Suggested matches must be decided. A pending suggested match is a question, not an answer — commit refuses until you accept, override, or skip it (bulk-apply handles high-confidence ones quickly).
- A colliding company code skips rather than links. If a row’s code already exists live and you chose create-new, the row is skipped with a note — linking on a bare code match without your confirmation is exactly the mistake the review step exists to prevent.
- Imported products land standalone. A brand column is noted on the row outcome but products are not attached to a brand/line at commit — assign them afterwards from the product page. Packaging columns (fill volume, bottles per case) are likewise noted, not imported; set them on the vessel/case BOM.
- Imported raw materials use the mapped material kind. Recognized Köstner subcategories such as Bottle, Closure/Cap, Label, Box, Partition, Flavor, or Acid are normalized to vestl’s controlled classes. Unknown raw-material classes are called out and use a conservative fallback.
- Imported raw materials start as drafts. Importing is another creation path, not an approval bypass. Each new material needs the same two eligible approvers as a material created from the New material flow before it can be used in a published formula or BOM.
Material CSV round trips
The Export action on the Materials page writes the New material fields in the same order and with the same labels:
Material name, Material type, Subtype, Base unit, Purchase unit, Owner, Density (g/mL), Lead time days, Shelf life (days), Remove from stock (days before expiry), Alert (days before expiry), Minimum order quantity, Safety stock, Reorder point, Standard cost, and Description.
Upload that file through Products / SKUs. vestl recognizes its headings directly, still runs the normal dry run and duplicate review, and creates committed rows as draft materials. Internal SKU, stock on hand, reorder state, and current average cost are deliberately absent because vestl generates or calculates them rather than asking for them in New material.
Inventory on-hand imports
Use Inventory on-hand to adopt opening balances during rollout or migration. Import products first, then locations, and finally on-hand inventory. The importer deliberately resolves existing master records instead of inventing them.
Upload the CSV or XLSX export you already use, then map its columns to vestl’s target fields. Source headers do not need to use vestl names. Keep one physical lot/location balance per row.
Required targets are Item SKU, Lot number, Quantity on hand, Inventory unit, Location, Received / counted date, and Unit cost. Supplier lot, Expiry date, and Notes are optional. Item SKU accepts either a vestl internal SKU or one unique imported customer/source SKU, so a preserved Köstner PKG- or ING- code can identify the newly imported product. A duplicated external SKU is never guessed; the row stays blocked.
When an export repeats the same operational context implicitly, use Fill workbook gaps instead of editing the workbook. A reviewed session can supply a default inventory unit, location, counted date, or unit cost only where mapped cells are blank. It can also generate missing internal lot numbers from the prefix, SKU, counted date, and physical source row. Every filled value appears in preview before posting.
The four operator steps are:
- Intake — inspect the workbook structure without creating inventory.
- Map — confirm which source column supplies each opening-lot field.
- Preview — validate every SKU, unit, location, date, quantity, and cost.
- Review and confirm — exclude unresolved rows, then post the included lots, stock ledger entries, and valuation entries together.
Inventory rules:
- Item SKU, inventory unit, and location must already exist and be active. Unknown values block only that row.
- Missing master records produce direct links to Products, Units, or Locations. Add or import the setup record, reopen the saved session, and rerun preview; inventory rows never invent incomplete master data.
- The imported unit must be the item’s base inventory unit. Convert the source quantity before importing instead of relying on an ambiguous spreadsheet conversion.
- Zero on-hand rows are skipped by default and recorded as no-op outcomes; they do not create empty lots. Turn this off when zeroes should remain blocking source-data errors.
- Every committed row creates an available, traceable lot. If expiry is omitted, vestl derives expiry, removal, and alert dates from the item’s shelf-life policy.
- The lot and its immutable
opening_entrystock-ledger event are written in the same transaction. Weighted-average cost and on-hand value update with the receipt; a failure rolls everything back. - Customer-owned inventory is physically tracked but carries no value on Brella’s books, so vestl forces its imported unit cost to zero.
- A committed session is immutable. If the exact same source file is uploaded again, vestl combines its SHA-256 fingerprint with each sheet-and-row identity and links already-posted rows instead of creating another lot or ledger entry.
Final confirmation is an accounting and inventory event, not merely a file upload. Correct blocked rows before posting; if a committed balance later needs correction, use an auditable inventory adjustment. Re-uploading an identical file is a safe retry, not a correction mechanism.
Importing the Köstner inventory workbook
The Köstner file contains master data and on-hand balances in the same workbook, while vestl keeps product identity and stock movements as separate records. Import it in two reviewed sessions:
- Choose Products / SKUs and select Current Inventory (or Master Data). The mapper recognizes
Item Name,SKU,Category,Subcategory,Client / Brand,UOM,Min Level,Reorder Point, andNotes. Köstner’s SKU is preserved as Customer SKU; vestl still mints the internalORG-RM-NNNNidentity. - Choose Inventory on-hand and select Current Inventory. Map
SKU,Current On Hand,UOM, andNotes; then use Fill workbook gaps for the counted date, location, unit cost, and generated internal lot numbers.
Status = OK is a calculated spreadsheet health label, not product active state or lot inspection status, so it is deliberately left out. Max Level, Zone, Rack, and Supplier are empty template columns in the supplied workbook; Source coverage keeps them visible instead of silently claiming they were imported. The Inventory Log tab can also seed opening balances: Qty IN maps to quantity and Date maps to the posting date. It is not a general historical movement replay—outbound, production-pull, receipt, and adjustment history still belongs in their dedicated document workflows.
Formula imports
Formula workbooks use one row per ingredient or process step. Map Row type to ingredient or step, and repeat Formula name, Batch quantity, Batch unit, proportional Expected loss %, and Fixed loss quantity on every row in the formula. Fixed loss is dead volume lost once per physical batch, expressed in the recipe’s batch unit. Planned losses must leave a positive effective yield: batch quantity minus proportional loss and fixed loss must remain greater than zero. Rows sharing a formula name become one versioned draft. The group is atomic: if any ingredient or step is invalid, linked elsewhere, or intentionally skipped, vestl skips the otherwise-valid siblings and creates no partial formula.
Ingredient rows map an existing ingredient SKU, quantity, quantity mode, and—when the mode is absolute—an existing unit. The SKU must be an active raw material classified as an ingredient or raw liquid; packaging materials cannot be used as formula ingredients. Set Fixed ingredient quantity to yes for minimum doses, starters, or other ingredients used once per recipe run instead of scaling with the number of batches. Step rows map a step name and may map a tank or vessel plus duration. Client code is optional; leaving it blank creates a reusable House formula. Final confirmation creates the draft header, ingredient lines, and process steps together.
BOM imports
BOM workbooks use one row per component. Map BOM level to vessel, case, or pallet; rows sharing a level and BOM name become one versioned draft. The group is atomic: one invalid, linked, or intentionally skipped component prevents that draft from being created, so a partial component list can never become live. The output SKU, component SKU, and component unit must already exist. Each component SKU must be an active raw material whose material classification fits the selected component type—for example, a label row requires a label material and a case-box row requires a case-box material.
- A vessel BOM links to the latest published version of an existing recipe and requires fill volume. A client-owned recipe can only feed an output SKU for that same client; vestl checks this again at final confirmation so a workbook cannot bypass recipe ownership. Its component types include bottle, cap, label, sleeve, closure other, and packaging other.
- A case BOM links to the latest published version of an existing vessel BOM and requires bottles per case. The vessel BOM and new case BOM must produce the same output SKU. Its component types include case box, partition, tray, caddy, shipper, shrink wrap, and case other.
- A pallet BOM links to the latest published version of an existing case BOM and requires cases per pallet. The case BOM and new pallet BOM must produce the same output SKU. Its component types include pallet, dunnage, stretch wrap, top sheet, corner board, strapping, and pallet other.
Final confirmation rechecks every upstream publication, output-SKU binding, and saved resolution decision, then creates each complete draft header with all of its component lines in one transaction. If an upstream BOM changes after preview, or one row in a grouped document is excluded, confirmation stops that group without creating a partial chain.
Location imports
Location workbooks use one row per physical location. Location name and Location type are required. Facility, parent location, capacity, capacity unit, and notes are optional. A parent may already exist in vestl or appear elsewhere in the same workbook; vestl creates same-workbook trees parent-first and rejects circular or unresolved chains. Tanks must remain top-level.
Final confirmation creates active locations available to planning. Import facilities and location types first, then locations, then opening inventory.
Review-before-commit safety
The import flow is deliberately conservative.
Before commit:
- vestl creates an import session
- vestl stores file metadata and workbook summary data
- vestl stages CSV/XLSX rows for review
- vestl records diagnostics and session events
- vestl can preview every supported record type in a dry run
- vestl can persist ambiguity-resolution decisions on the session
- vestl lets you reopen the session later
- no live business records are changed
At commit:
- reviewed company and product rows create or link live records
- reviewed formula and BOM rows create versioned draft headers with their child lines
- reviewed location rows create parent-aware storage trees
- reviewed inventory rows create lots and post opening stock to the ledger
- invalid, unreviewed, and explicitly skipped rows stay visible with an outcome
- all writes are transactional and the session becomes immutable
Vendor terms and compliance records remain outside the import commit boundary.
Redaction and privacy expectations
Source files can contain customer, vendor, or operator data. vestl keeps the broad summary surfaces redacted by design.
Safe summary surfaces show metadata and counts such as:
- filename
- file format
- detected sheet count
- row count
- issue count
- source profile
- last error
- timestamps
Raw staged-row payloads are not exposed in high-level session summaries and should not be copied casually. Row-level payloads are reserved for detail and review surfaces such as the session detail view, the dry-run preview, and the mapping workspace’s sample-value view.
Diagnostics and inspection surfaces
When a dry run succeeds or fails, vestl saves enough state for later inspection.
Use these places in vestl to investigate:
- Session list — redacted session summaries.
- Session detail — staged rows, row issues, resolution issues, and event history.
- Ambiguity review — saved candidate snapshots and operator decisions.
- Error-row export — downloadable rows for remaining blockers.
- Event history — lifecycle and failure events.
Watch for these session details:
- current phase
- row count
- issue count
- last error
Watch for these event types during preview and ambiguity-review work:
- dry run started
- dry run previewed
- dry run failed
- resolution queue built
- resolution saved
- resolution failed
Field reference
Source profile
A best-fit guess about where the file came from. Use it as a starting point for later mapping, not as proof that the file is ready to import.
Tooltip copy: The source system hint vestl detected from the file name, sheet names, and headers. It helps later mapping start faster, but it does not commit data by itself.
Phase
The current lifecycle stage of the import session.
Tooltip copy: The current stage of this session, from file intake through later mapping, dry-run preview, approval, and commit steps.
Dry-run area
The kind of records the current dry-run preview can check.
Tooltip copy: The first dry-run preview checks company rows only. It is a dry run, not a final import.
Staged rows
Rows held in the import session for later review work.
Tooltip copy: Rows preserved inside the import session for review and dry-run validation. They are not live records yet.
Row status
The preview result attached to each staged row after validation.
Tooltip copy: Valid rows passed the company preview. Invalid rows still need fixes before any later approval step.
Issues
Warnings or errors recorded during intake or preview. Issues can be session-wide, file-level, sheet-level, row-level, mapping-related, or resolution-related.
Tooltip copy: Warnings and errors found during intake, dry run, or ambiguity review. Use the count to see whether the session needs attention before it can move forward.
Resolution queue
The review surface for ambiguous matches, create-new recommendations, and skip decisions after a dry run.
Tooltip copy: The ambiguity review queue shows rows that still need an operator decision before a later approval step can proceed.
Candidate match
A possible existing company that might match the staged row.
Tooltip copy: Candidate matches help you choose the correct existing company when vestl cannot safely decide on its own.
Create-new intent
A saved operator decision that keeps the row on the path toward later approval as a new company.
Tooltip copy: Create new keeps the row staged until you commit. Commit then creates the live record and stores the outcome on this session.
Skip behavior
A saved operator decision that intentionally keeps the row out of the later approval set.
Tooltip copy: Skip excludes the row from later approval for now, but leaves the decision visible and reviewable on the session.
Error-row export
A downloadable blocker report for invalid, unresolved, or skipped rows.
Tooltip copy: Download error rows to see which rows still block later approval and why.
Last error
The row-level diagnostics returned by the dry-run preview.
Tooltip copy: Dry-run issues identify the sheet, row, column, code, and message for values that still need correction before a later approval step.
Numbers dry-run support
The current preview limitation for Apple Numbers uploads.
Tooltip copy: Numbers uploads keep workbook metadata and detected table names, but they do not stage row payloads for preview yet.
Mapping review workspace
The review surface that shows suggested source-to-field mappings, confidence, sample values, and saved overrides.
Tooltip copy: Suggested mappings help you review source columns before rerunning the dry run. Confidence is a hint, not approval.
Mapping confidence
How strongly vestl thinks a source column matches a company field.
Tooltip copy: Confidence shows how strong the header-and-sample match looks. High confidence still needs operator review.
Sample values
A bounded set of example values from the source column.
Tooltip copy: Sample values help you judge whether a suggested mapping matches the real data in that column.
Mapping override
An operator-selected target field that replaces the suggested one for this import session.
Tooltip copy: Overrides save your mapping choice on this session and are used the next time you rerun the dry run.
No-live-write-before-commit boundary
The explicit safety limit around intake and preview work.
Tooltip copy: Upload, mapping, preview, and resolution only stage data. Live records change only when an authorized operator commits the session.
Last error
The most recent blocking failure message on the session.
Tooltip copy: The latest blocking error recorded on this session. Failed preview attempts stay available so you can inspect what went wrong.
Operator expectations
Use the Imports page when you want a safe first pass over a spreadsheet. Expect vestl to tell you what kind of file it sees, how many sheets it found, whether rows were staged for preview, whether the mapping suggestions found plausible target fields, whether ambiguous matches still need operator review, and whether intake, mapping, dry run, or ambiguity resolution raised warnings or errors.
Expect the current release to finish reviewed Companies, Products / SKUs, and Inventory on-hand imports. Other record types remain on the roadmap.
Do expect this flow to stay review-first:
- Mapping suggestions are editable, not authoritative
- saved overrides affect the next dry run on the same session
- ambiguous matches require an explicit operator decision
- skip behavior stays visible instead of disappearing silently
- preview remains read-only until an explicit commit
- committed sessions remain immutable and auditable