Skip to content
Contact

Case studies / Tigg Accounting · Design before Jun 2026; build Jun – Sep 2026

Repair supported import errors in Tigg, before posting

Tigg's old importer listed errors by row number and offered one way forward: fix the file in Excel and upload it again. I designed a replacement where people map their own columns with the gaps shown, then fix, filter and bulk-edit rows in a grid before anything is posted.

Design onlyData entryError recoveryDesign handoff · Before Jun 2026Tagged release · Jul – Aug 2026Branch only · Sep 2026In use (first-party report)

Role

UI/UX design only (sole designer): research, flows, every state in Figma

Timeline

Design before Jun 2026; build Jun – Sep 2026

Team

CEO, senior frontend engineer, backend team, QA

Platform

Accounting web

Not mine

The whole frontend was built by the senior frontend engineer; the backend team built the service behind it

Measured outcome

None measured

the key decision

Block Next on the unmapped field itself, then repair typed cells in a grid, so supported errors are fixed in Tigg instead of back in Excel.

how deep do you want to go?

Design only
Diagram from the case study. Product screenshots are being added.
That's the brief. Switch to Story for the full argument, or Deep for states, iterations and implementation.
Chapter 01

Row 14, somewhere in Excel

A distributor sends a sheet of 42 delivery lines. Someone at the shop has to turn it into delivery notes in Tigg. With the old importer, they downloaded a template, copied the data into it, uploaded it and waited. The screen then said something like 38 records validated, 4 records have errors, and printed a list:

Row: 14 Rate must be a number

Row: 22 Warehouse not found

The only ways forward were Confirm Upload and Reupload New File. To fix row 22, you left Tigg, opened the file, found the row, guessed what "not found" meant, saved, uploaded the whole file again, and had every row checked again.

Import / Export Configuration Delivery Note import deliveries-shrawan.csvValidating Records… done 38 records validated 4 records have errors Hide ▴ Row: 14 Rate must be a numberRow: 22 Warehouse not foundRow: 23 Warehouse not foundRow: 31 Quantity is required Confirm Upload Reupload New File 1 Headers must match the template exactly. No mapping step, so "Godown" or "Qty" breaks it. 2 Errors are a list, keyed by row number. No link from "Row: 22" to the value that is wrong. 3 The only repair path leaves Tigg. Fix in Excel, save, re-upload, re-validate everything.
Reconstruction, fictional dataThe old validation screen, redrawn. The labels and the row-message format are the real ones; the file name, counts and messages are fictional.

The bad part wasn't the error messages. The file was the only place anything could be fixed. So the question I worked on was where repair should happen, not how to word the errors better. My answer was a workspace inside Tigg: upload once, map your own columns with the gaps shown, then fix, filter and bulk-edit the rows in a grid before anything is posted.

Before: the re-upload loop After: one upload, repair in place Download template Fill or fix it in Excel Upload the whole file Server validates every row Read the "Row: 14 Rate …" list Confirm Upload repeatfor everyerror dashed = work done outside Tigg Upload .xlsx once Map columns (auto-suggested) Review gridfix cells · filter errors · bulk edit Server revalidates edited rows All clean → Post Entries Transactions created loopstaysin Tigg
DiagramThe two loops. Before: every correction goes through Excel and a full re-upload (dashed = outside Tigg). After: the file is uploaded once and supported errors are fixed inside Tigg.
Chapter 02

My part, and the part I didn't build

This is a design-only case. I'm the only UI/UX designer at Tigg (BIC Technology). For bulk import I did the market research, ideation and interaction design, and drew every state on two Figma pages in the file "Tigg New Features":

  • 🟢 Bulk Import: the final design, marked Ready for dev.
  • 🔴 Bulk Import: an archive of ideas I explored and kept because they might be useful later.

Both pages were finished before the build began on 2 June 2026.

The senior frontend engineer built the whole frontend: the upload drawer, the mapping page, the editable grid, and how an import stays alive between edits. The backend team built the service behind it; the CEO owns the product; QA tests releases. Wherever this case says "the build", it means the senior frontend engineer's work, and decisions my frames didn't cover are credited to them.

  1. Jun 2025Additions to the old importerAs an intern I added a few import types to the older importer: my only code in this area.
  2. Before 2 Jun 2026Design: 🟢 final page and 🔴 archive
  3. 2 Jun 2026Build begins (senior frontend engineer)
  4. 20 Jul 2026Tagged releaseDelivery Note and Goods Received Note import.
  5. 4 Aug 2026Tagged releaseInventory Adjustment import, on the same pages.
  6. Sep 2026Product/Service import on UATBuilt on the same pattern. Not in a release tag yet.
Chapter 03

What I knew, and how

The research was small and practical.

  • Inside the old importer. In June 2025 I added Product Category, Account Group and opening-balance import to it. Looking back, every template I added was another fixed header contract, and every error another line in a Row: N list.
  • Problem signals from QA, support and the CEO, which is how user problems mostly reach me at Tigg. Second-hand, and not logged as import tickets.
  • Market research and ideation. This is where editing in a spreadsheet-like grid came from. I didn't keep a record of the products I looked at then, so I don't name them here.

I didn't run interviews or usability tests, and there was no data on import failures. The comparison below was done later, in September 2026, from public help-centre documentation, to place the design in its market. It is not what I studied at the time.

TemplatedownloadColumnmappingAuto-suggestSavedmappingsIn-app cellrepairFilterby errorBulk editor fillResumablesessionZoho Books / InventoryQuickBooks OnlineXeroOdoo 19TallyPrimeERPNextFlatfileTigg, old importerTigg, my redesigndocumentedpartial (one module only, or limited)not found in public documentation
ChartImport patterns compared (2026, public documentation only, not hands-on). The accounting suites all map columns. Most send you back to the file to fix values. Of the accounting suites, only QuickBooks Online documents fixing invalid cells in its review grid; filtering by error and bulk fixes are documented by a dedicated import tool. A dash means not found in public documentation, not proven absent.

Mapping columns is standard. Repairing values inside the product is rare in accounting software; it's mostly dedicated import tools that let you edit a cell, see it re-checked and fix many rows at once.

Chapter 04

Where an import actually fails

"Bad UX" was my own summary of the old importer. Looked at closely, it had five separate causes, and each needed a different fix.

CauseWhat it did to peopleWhat the design had to do
Fixed header contractA sheet headed "Item", "Qty" or "Godown" failed, or had to be reworked to match the template firstMap their columns to Tigg's fields, and suggest matches
Errors cut off from the dataA list keyed by row number; the value itself was in another programPut each error on its cell
No partial progressNothing survived between attemptsAn import you can leave and come back to
No repair toolsOne wrong warehouse across 40 rows meant 40 edits in ExcelSelect, filter and change many rows at once
Hidden, settings-dependent rulesWhether location or warehouse was required depended on the organisation's settings, which a fixed template can't showShow what is required for this organisation, while mapping

Two facts about the data shaped everything else.

  1. The required fields are not fixed. Billing locations, warehouses and automatic product codes switch fields on and off per organisation. The same template can be complete for one business and incomplete for another. So the mapping page, not the template, has to say what is missing.
  2. One document spans several rows. A delivery note with three items is three lines in the sheet but one document in the books. Posting has to treat the document as the unit.

Local vocabulary matters too: businesses in Nepal say "Godown" for a warehouse, and "VAT Applicable" is a required field on delivery notes.

Proto-personas, assumption-based and not research participants: an accountant onboarding a client's item list, and an operations clerk posting a distributor's sheet of deliveries.
Chapter 05

Explorations, and the page I kept for them

I don't delete ideas that lose; I move them to a second page. The 🔴 Bulk Import page holds:

  • a top-bar summary of total, valid and error rows, with Import, Selected and Filter actions;
  • one table with a Pending, Ready and Imported lifecycle, where imported rows stay visible next to rows that aren't posted yet;
  • a separate Fields Selected state and an alternative default screen;
  • earlier versions of the input, dropdown and date editors, and of the filter states.
Archived exploration, not builtTwo archived directions from the 🔴 page. Neither became the final page as drawn.

In retrospect, the lifecycle table put posted and unposted rows side by side. Posting creates real accounting transactions that can't be undone, so that mix is risky. The final page focuses on the rows that still need attention before posting.

Top-bar import summaryTotal, valid and error row counts withImport, Selected and Filter actions.The built grid has a Total / Valid / Errors filterPending / Ready / Imported lifecycleOne table in which imported rows stayvisible next to unposted ones.The built review screen hides imported rowsFields Selected, alternative Default ScreenAn alternative default screen and aseparate Fields Selected state.Not carried into the final pageEarlier editor and filter variantsFirst versions of the input, dropdown anddate editors, and of the filter states.Refined into the final page's editors
Archived exploration, not builtWhat became of each archived idea. The right-hand notes describe the built product, not a claim that the build reused the archive. The Total / Valid / Errors filter and the hiding of imported rows are in the senior frontend engineer's build.

One honest detail: a frame on the final page is labelled "Supposed to be DN GRN Screen but is Invoice screen for now". I drew the pattern over an invoice screen while designing for delivery notes. The design was a pattern first.

Chapter 06

Mapping: show the gap where it is

After upload comes the Map Fields page, with two panels. Mapped shows each Tigg field, the Excel column chosen for it and a sample of the sheet's values, so a match can be checked by content, not just by heading. Unmapped shows what's left. Both carry a count. A required field that is still unmapped is amber.

Import Statement / Map Fieldsdn-shrawan.xlsx · Delivery NoteNextMapped6TIGG FIELDSEXCEL COLUMNSYOUR SHEET DATADN No.*DN No▾×DN-101, DN-102, …Date*Date▾×2026-07-02, 2026-…Customer*Customer Name▾×Himal Traders, Sagarm…Product*Product▾×Basmati 25 kg, Sunflo…Warehouse Name*Godown▾×Main Godown, Main Go…RateRate▾×3450, 295, 180, 140Unmapped13TIGG FIELDSEXCEL COLUMNSQuantity*Select column▾VAT Applicable*Select column▾LocationSelect column▾DiscountSelect column▾UnitSelect column▾RemarksSelect column▾+ 7 more optional fields123Nothing MappedRequired still unmapped but clicked nextMapped0No fields mapped yetUnmapped19DN No. *Select▾Date *Select▾Customer *Select▾Product *Select▾Please map required fields: Quantity, VAT ApplicableQuantity*Select column▾VAT Applicable*Select column▾The select turns red in place; Next stays blocked.4
Reconstruction, fictional dataThe mapping page, redrawn with fictional data. Top: Some Mapped, with sample values beside each match. Below: Nothing Mapped, and the state after Next with required fields still unmapped. Panel labels and empty-state texts follow the product.

The first-time state arrives with matches suggested, so "Godown" lands on Warehouse Name without anyone typing. A column can be used only once.

Figma designThe failure state users reach: the gap is named on the field and in the message, and Next stays blocked.
Figma designNothing Mapped: 'No fields mapped yet'; every required field in amber.
Figma designSome Mapped: matches with sample values; the rest still counted.
Chapter 07

Repair in the grid, not in the file

Once mapping passes, the rows open in a full-width grid: the Excel like Editing frame. For the errors it supports, this replaces the trip back to Excel.

Import Statementdn-shrawan.xlsx · Delivery NotePost EntriesSearch rows…OnlineTotal rows 42Valid 36Errors 6↻×DN No.DateCustomerProductWarehouse NameQtyRate (NPR)DN-1012026-07-02Himal TradersBasmati 25 kgMain Godown123,450.00▾DN-1012026-07-02Himal TradersSunflower oil 1 LMain Godown48295.00DN-1012026-07-02Himal TradersMasoor dal 1 kgMain Godam30180.00DN-1022026-07-03Sagarmatha StoreBasmati 25 kgMain Godown63,450.00DN-1022026-07-03Sagarmatha StoreChiura 1 kgMain Godown—140.00DN-1032026-07-04Pokhara MartWai Wai noodlesMain Godown12020.00Checkbox 1: select the whole document (DN-101). Checkbox 2: select one row.42 rows‹ 1 2 3 ›EDITORS, SHOWN AS INSETSJuly 2026‹ ›123456789101112131415161718192021HimalHimal TradersHimal Hardware+ Add new · creates a contactWarehouse NameNo active warehouse named “Main Godam”shown on hover over the red cell (see accessibility note)1234234
Reconstruction, fictional dataThe review grid, redrawn with fictional data. Two checkbox columns separate 'select this document' from 'select this row'. Each cell edits by type: text inline, dates with a picker, references with a searchable list that can add a missing record. The error sits on its cell.

Four ideas carry the grid:

  • Every cell has a type: text, number, date, or a dropdown for customer, product or warehouse. Free text is where import errors come from; a typed editor prevents an error instead of reporting it.
  • Errors belong to cells. The wrong value is tinted and carries its own message (shown on hover in the build), not a line in a list at the bottom.
  • Find the bad rows fast. One control counts and filters at once: Total rows, Valid, Errors. Under the headers, a filter row narrows further, including "errors in this column" (Filter, Filter Selected).
  • Fix many rows once. Select rows and a bar appears: Bulk edit (8 rows): column, value, Apply (Rows Selected, Bulk Update). The bar states its scope first, and the value input takes the column's type. Auto fill empty carries one value to other rows.
Before · filter “errors in Warehouse Name”, all selectedTotal 42 · Valid 34 · Errors 8Bulk edit (8 rows):Warehouse Name▾Main Godown▾ApplyDN No.ProductWarehouse NameQtyRate (NPR)DN-101Basmati 25 kg—123,450.00DN-101Sunflower oil 1 L—48295.00DN-101Masoor dal 1 kg—30180.00DN-105Chiura 1 kg—25140.00+ 4 more selected rowsAfter Apply · rows revalidatedTotal 42 · Valid 42 · Errors 0DN No.ProductWarehouse NameQtyRate (NPR)DN-101Basmati 25 kgMain Godown123,450.00DN-101Sunflower oil 1 LMain Godown48295.00DN-101Masoor dal 1 kgMain Godown30180.00DN-105Chiura 1 kgMain Godown25140.00123Scope first:“Bulk edit (8 rows)”Value input typed tothe chosen columnCopy icon: “Apply toall rows in this group”Counts and row values are fictional.
Reconstruction, fictional dataRows Selected → Bulk Update, with fictional counts. Filter to 'errors in Warehouse Name', select all, set 'Main Godown' once, Apply. The rows are checked again and the error count drops to zero.
Figma designExcel like Editing: the final grid.
Figma designBulk Update: one value set across the selected rows.

When nothing is left to fix, the All Clean frame takes over: valid equals total, and posting is available. Posting asks for confirmation, because it "will create actual transactions and cannot be undone".

Chapter 08

One import, step by step

Here is one fictional import from a distributor's sheet: upload, a blocked Next, repair in the grid, and posting. Step through it with the buttons or the arrow keys.

Import a delivery sheet, step by step

Step 1 / 8

Upload

One file, dropped once

The upload drawer takes an Excel file, with a template download beside the drop zone for anyone who wants it. The file is read and its headings go to mapping.

File
himal-deliveries.xlsx
Rows read
42
Template
Available
Interactive reconstruction, fictional dataOne fictional import of 42 delivery lines. Field names, messages and states follow the final design and the built product; the file, names and counts are made up.
All steps as a table
#StateWhat happens
1UploadOne file, dropped once. The upload drawer takes an Excel file, with a template download beside the drop zone for anyone who wants it. The file is read and its headings go to mapping.
2Some MappedMatches suggested, gaps counted. Most columns are matched on arrival: 'Godown' lands on Warehouse Name. Two required fields have no match because the sheet calls them 'Qty' and 'VAT?'. They are amber.
3Blocked at mappingNext is pressed with gaps. The two selects turn red in place and the message names them. Nothing reaches the grid yet, so one missing mapping never becomes 42 row errors.
4Required mappedTwo choices, and Next opens. The user picks 'Qty' for Quantity and 'VAT?' for VAT Applicable. Only an optional field is left, which is allowed.
5Has errorsRows open in the grid, errors on their cells. Eight rows name a warehouse that doesn't exist: 'Main Godam'. Each wrong cell is tinted with its message. The count control shows the scale at once.
6Rows selectedFilter, select, set once. Filter to errors in Warehouse Name, select all eight, and set 'Main Godown' in the bulk bar. The rows are checked again.
7All CleanNothing left to fix. Valid equals total. Posting is available, with a confirmation, because it creates real transactions.
8CompletedPosted as whole documents. The 42 lines are posted as delivery notes and the user is back on the list page. The import now shows as completed in recent imports.
Figma designAll Clean: the state that allows posting.
Chapter 09

Handoff, and what the build decided

I handed the 🟢 page over marked Ready for dev, with every state described in this case drawn as its own frame. The senior frontend engineer built it, starting on 2 June 2026, and QA tested it as part of the release. I have no record of specific review comments on these pages, so I don't claim any.

Several decisions in the build came from the senior frontend engineer, not from my frames. They're good decisions, and they are theirs:

  • Imports survive leaving the page. Work in the grid is saved as a draft on the way out. An unfinished import comes back in Recent imports, where only sessions still in progress can be opened. My list of recent uploads frame gave the list a place; the build made the resume work.
  • Edits are checked when you leave a cell, not on every keystroke. The cell's error clears as soon as you change it, and it comes back only if the new value is also wrong.
  • Documents post whole. If only some rows of one delivery note are selected, posting stops and names the document: select all its rows first. Half a document in the books is worse than none.
  • Clear limits at upload. Excel files only, first sheet only, under 2 MB. A column that has data but no heading is rejected with "Missing header for specific column", instead of being dropped without a word.
  • An online/offline indicator in the grid, and a message if the connection drops.

The same mapping and repair pages now serve Delivery Notes, Goods Received Notes and Inventory Adjustment in tagged releases, and Product/Service import on UAT. Only the fields change.

Chapter 10

Status and evidence

WhatWhere it stands
Design🟢 page Ready for dev, finished before the build began on 2 June 2026
Tagged releaseDelivery Note and Goods Received Note import, 20 July 2026; Inventory Adjustment import, 4 August 2026. Built by the senior frontend engineer
UAT onlyProduct/Service import (September 2026), not in a release tag yet
First-party signalUsers reach the "required still unmapped" state in real use, relayed through QA, support and the CEO
Measured outcomeNone

Nothing about this importer is measured: no import count, success rate, time to import or support trend. My own summary, "before: bad UX; now better", is a judgement, not a result.

The claim is deliberately narrow. The grid removes the trip back to Excel for the errors it supports: typed values, references, required cells, repeated fixes. Some problems still start in the file. Supported errors are repaired in Tigg before posting; the Excel round trip isn't gone for everything.

First I'd measure where imports stall (started, mapped, posted), then whether a round trip still happens: the same file uploaded again within a day.

What I learned

  • Give the failure its own frame. "Required still unmapped but clicked next" is the most useful frame on the page because it's the state people reach. Drawing it as a state set the logic for the whole mapping page: counts on both panels, amber before red, and a Next button that says why it won't move.
  • Design the pattern, not the screen. The states were defined by what people need, not by one document's fields, so the same pages took on more document types.
  • A design-only handoff needs to carry behaviour, not just looks. Frames show states well. Behaviour such as moving between cells with the keyboard, or pasting a block of values, is easy to leave implicit. "Excel-like" in the build means typed in-cell editing and bulk changes; arrow-key movement and paste aren't there yet. Next time I'd add a short interaction spec: a keyboard map, focus order, and what Enter and Tab do.
Deep dive 11

The import's states, and the difficult ones

An import is a session with a lifecycle, not a file transfer. Every blocked transition keeps the user where they are and says why.

List page ▸ Import Recent imports[list of recent uploads] Upload drawer[upload or download template] Upload Parse error (stay) file over 2 MB · not Exceldata column without a header reject Mapping[First time Mapping] Nothing Some All auto-map on arrival; manual select or unlink parsed Mapping error required still unmappedor column used twice Next fix Review[Excel like Editing] Loading Offline Has errors Clean self-loops: edit cell (blur → validate) apply to group · bulk edit · filter revalidate · delete rows · page (auto-save) Next ok · create session Partial document warningstay; select whole document Post Completedtransactions created → list confirm Draftsaved as a draft leave later resume [brackets] = the state's name on the final Figma page. Red = blocked transition; the user stays and sees why.
DiagramThe import session as a state diagram. Names in brackets are the frames on the 🟢 page. Red arrows are blocked transitions: the user stays and sees the cause. Derived from the final design and the built product's behaviour.

Mapping sub-states

StateMapped panelUnmapped panelNext
Nothing Mapped"No fields mapped yet"Every field; required ones amberBlocked: red selects and a named message
Some MappedMatches with a sample of the sheet's valuesRemaining fieldsBlocked while any required field is unmapped
All required mappedRequired fields and samplesOptional fields onlyAllowed
All mappedEvery field"All fields are mapped"Allowed
Column used twiceBoth fields red–Blocked: "Each Excel column can only be mapped to one field."

Difficult states

KindWhat happens
Empty"No import history" in recent imports; "No fields mapped yet"; "No records found" in a filtered grid
Blank vs zeroA blank required cell is an error. In the build, blank quantity, rate and discount are read as 0. For an accounting document I'd treat that as a design question: a silent zero on a delivery note is a wrong document
Rejected fileNot Excel, or over 2 MB: an inline error in the upload drawer, never a dead-end page
Headerless column"Missing header for specific column"; empty columns are simply ignored
Heading goneA mapping that points to a heading no longer in the file shows an amber warning
Settings changeTurning on billing locations or warehouses makes those fields required; product code is required only when automatic codes are off
Half a documentPosting stops and names the document until all its rows are selected
InterruptedLeaving saves a draft; the import can be resumed from recent imports. A lost connection shows "Connection lost. Please refresh the page."
IrreversibleDeleting an import: "This action cannot be undone." Posting: "This will create actual transactions and cannot be undone."
Deep dive 12

From insight to frame, and the 2026 comparison

Each insight became one requirement, and each requirement one named frame on the 🟢 page. The second insight is first-party. The rest are my reading of the old importer and the data, written after the fact as design reasoning.

INSIGHTREQUIREMENTFINAL FIGMA STATE Customers' headings won't match oursMap columns; suggest matchesFirst time MappingUsers press Next with gaps(first-party observation)Keep required gaps visible;block with a named errorRequired still unmappedbut clicked nextErrors belong to cells, not to a listShow errors on the cell;typed editorsExcel like Editing ·input / date / dropdown editThe same fix repeats across many rowsSelect rows, set a column onceRows Selected · Bulk UpdateValues repeat within one documentFill a value across the groupAuto fill emptyUsers need to find the bad rowsFilter by validity and by columnFilter · Filter SelectedImports are often left unfinishedResumable recent uploadslist of recent uploadsTemplates still helpTemplate download beside uploadupload or download template
DiagramInsights carried into requirements and into the final page's frame names. A retrospective map: the frame names are real; the arrows are my reconstruction of the reasoning.

Import flows compared (September 2026, public documentation)

ProductMappingFixing errorsWorth noting
Zoho Books / InventoryAuto-map, with an option to save the selectionsPreview counts (ready, skipped, unmapped); fix the file and re-importSkip or overwrite duplicates by a chosen key
QuickBooks OnlineDropdown per field; "No Match"Invalid cells highlighted in red in the review, fixed there1,000 rows at a time; an import can't be undone
XeroAssign columns (bank statements), remembered for next timeReview, then completeName is the identity key for contacts
Odoo 19Suggested from the first lines, manual overrideA Test step lists errors; fix the fileProduct imports run in batches
TallyPrimeSaved mapping templatesAn exceptions report to review and correctMasters must exist before vouchers
Flatfile (import tool)Suggested column matchesEdit any cell; filter by error; find and replace, including filling blanksWarning and error levels are separate
Tigg, final designSuggested matches, counts, gaps shown on the fieldTyped cells, filter by error and column, bulk update, auto fillPosting is by whole document, confirmed

Two things Tigg's design doesn't do yet, and the comparison suggests: remembered mappings for repeat imports (Zoho, Xero, Tally), and a warning level separate from errors, so a note like "this category will be created" doesn't read as a failure.

Sources: vendor help centres read in September 2026. No competitor product was used hands-on. A feature not listed may exist without public documentation.
Deep dive 13

From frames to the built product

For this case I traced each frame on the 🟢 page to its counterpart in the product. The build is the senior frontend engineer's. The mapping between the two is my reconstruction.

Frame on the 🟢 pageIn the built product
Entry Point"Import" in the menu of each supported list page
list of recent uploadsA Recent imports drawer; imports still in progress can be reopened
upload or download templateAn upload drawer with the template download beside the drop zone
First time MappingMatches suggested on arrival, using field names and common aliases
Nothing Mapped, Some MappedMapped and Unmapped panels with counts and empty states
Required still unmapped but clicked nextNext checks required fields; red selects and a message naming them
Excel like Editing, with input, date and dropdown editThe review grid with typed cells
Auto fill empty"Apply to all rows in this group": the closest match, and a loose one. It copies a value across one document rather than filling blanks
Rows Selected, Bulk UpdateThe bulk edit bar
Filter, Filter SelectedColumn filters, an "errors in this column" toggle and a clear control
All CleanValid equals total; posting available
Figma designlist of recent uploads: statuses in words; unfinished imports can be reopened.
Figma designupload or download template: the template sits beside the drop zone.
Figma designFirst time Mapping: the page arrives with matches already suggested.
Figma designFilter Selected: an active filter, highlighted with a clear control.
Figma designAuto fill empty. Its built counterpart copies a value across one document, a loose match.
Figma designRows Selected: selecting rows reveals the bulk edit bar.

Gaps between the idea and the build

None of these is a criticism of the build. They're the next steps I'd propose.

GapWhy it mattersWhat I'd propose
Errors show on hoverA tint plus a hover message fails keyboard users and anyone who can't see the tintA visible icon in the cell, the message on focus too, and a count per row
No keyboard movement or paste"Excel-like" today means typed editing and bulk changesArrow keys, Enter and Tab between cells; paste a block of values
Blank numbers read as 0A silent zero on a delivery note is a wrong documentBlank quantity and rate should be errors
Excel only, first sheet onlyA CSV, or data on sheet two, surprises peopleSay so in the drop zone; name the sheet being read on the mapping page
Duplicates found lateProduct import must not create duplicate codes or namesShow duplicate errors in the grid, before posting (an open follow-up)
Mapping every timeRepeat imports of the same sheet start from suggestions againRemember a mapping per organisation, keyed by the sheet's headings
Posting scope"Post Entries" doesn't preview what it will createA one-line summary: "42 rows → 9 delivery notes"
Deep dive 14

How I would validate it

Nothing here has been run. It's the plan, in the order I'd do it.

Instrument what already exists

Every stage is already a state in the product, so measuring it needs logging, not new screens.

QuestionMeasureWhat it would decide
Where do imports stall?Imports started → mapped → posted; drop-off at each stageWhich surface to improve first
Are suggested matches good enough?Share of fields correctly matched on arrival; manual changes per importWhether to add aliases or remembered mappings
How much repair is left?Errors per 100 rows at first check vs at postingWhether templates or missing master data cause most errors
Is bulk edit used?Fixes made by bulk edit vs one cell at a timeWhether to invest in keyboard movement and paste
Is the round trip gone?The same file name uploaded again within 24 hoursThe proxy for this case's main claim

A small usability test

  • Who: 5 people per proto-persona: accountants who onboard clients, and operations clerks who post deliveries.
  • Material: a fictional 60-row delivery sheet with its own headings ("Item", "Qty", "Godown") and planted errors: an inactive warehouse, a misspelled customer, a blank rate, a text quantity, and a document split across a selection.
  • Tasks: import and post; recover from the blocked Next; fix one warehouse across many rows.
  • Watch for: errors found without help, errors found only by hovering, time to All Clean, and whether anyone tries to leave for Excel.
  • Accessibility pass: find every error with the keyboard only; list every state that relies on colour alone.
Deep dive 15

Notes on sources

  • Design: Figma file "Tigg New Features", pages 🟢 Bulk Import (final, Ready for dev) and 🔴 Bulk Import (archive). Frame names in this case are the page's layer names. Both pages were drawn before the build began on 2 June 2026 (my own account).
  • Built behaviour and microcopy: the product as built by the senior frontend engineer. Release dates are the dates of the tagged releases that include each collection. Product/Service import was on UAT only at the time of writing.
  • First-party: my statements that the frontend was built by the senior frontend engineer, that the grid idea came from market research and ideation, and that users reach the unmapped-required state.
  • Comparison: public vendor documentation read in September 2026, after the design. Not hands-on.
  • Figures: screens are redrawn reconstructions with fictional data (business names, file names, counts) until the Figma exports are added. Diagrams are mine, drawn from the final design and the built product.
  • Not available: usage, adoption or support data; import-specific QA records; the server's validation rules, which I describe only through the messages people see.
Deep chapters (states, iterations, implementation) are hidden in Story mode. Switch to Deep at the top to read them.