Bulk Transaction Processing
Import and process multiple financial transactions in a single operation
Overview#
The bulk transaction processing system enables importing multiple financial transactions through a single operation. It is built on top of the universal import system and integrates with the workflow engine for validation, entity resolution, and GL posting.
When to Use Bulk Processing#
| Record Count | Recommended Approach |
|---|---|
| 1-3 transactions | Post individually |
| 4+ transactions | Use bulk import |
The import system is significantly faster for four or more records because it pre-caches reference data (vendors, customers, accounts, dimensions) and performs batch validation. Individual posts process each record from scratch with no caching.
Supported Transaction Types#
All transaction types in the system are supported for bulk import. A single import can contain records of mixed types.
| Type | Party | Description |
|---|---|---|
| AP Invoice | Vendor | Vendor bills |
| AP Credit Memo | Vendor | Vendor credit notes |
| AR Invoice | Customer | Customer invoices |
| AR Credit Memo | Customer | Customer credit notes |
| AP Payment | Vendor | Vendor payments |
| AR Payment | Customer | Customer receipts |
| Journal Entry | Any (optional) | Manual GL entries |
| Expense Report | Employee | Employee expense claims |
| Bank Transfer | -- | Internal bank transfers |
| Depreciation | -- | Asset depreciation |
| Payroll | Employee | Payroll entries |
Entity Resolution#
The importer resolves parties and references using flexible identifiers. Use whichever identifier you have available -- the system will find the matching record.
Vendor Resolution (for AP types)#
| Identifier | Example | Priority |
|---|---|---|
| Internal ID | 45 | Fastest |
| Global vendor ID | "VEND-000123" | High |
| External vendor ID | "QB-VEND-1234" | For migrations |
| Tax ID | "12-3456789" | Unique match |
| Vendor name | "Acme Corp" | Case-insensitive |
Customer Resolution (for AR types)#
| Identifier | Example | Priority |
|---|---|---|
| Internal ID | 30 | Fastest |
| Global customer ID | "CUST-000456" | High |
| External customer ID | "QB-CUST-5678" | For migrations |
| Customer name | "Widget Inc" | Case-insensitive |
Employee Resolution (for expenses and payroll)#
| Identifier | Example | Priority |
|---|---|---|
| Internal ID | 10 | Fastest |
| External employee ID | "QB-EMP-100" | For migrations |
| Employee name | "John Smith" | Case-insensitive |
Line-Level Resolution#
| Identifier | Resolves To |
|---|---|
| Account number | GL account by number (e.g., "6100") |
| External account ID | Account by external ID (for migrations) |
| Item number | Item by item number |
| Item ID | Item by internal ID |
| Tax code | Tax code by code string |
All entity resolution uses pre-cached lookups, so referencing entities by name has minimal performance overhead in bulk imports.
Import Options#
| Option | Default | Description |
|---|---|---|
| On duplicate | Skip | "Skip" ignores duplicates; "Error" fails on duplicate |
| Batch size | 100 | Records per batch (transaction boundary) |
| Stop on error | No | Whether to halt the entire import on the first error |
| Defaults | None | Default values merged into every record |
Duplicate detection uses the combination of transaction type and reference number. Updating existing posted transactions via import is not supported -- posted transactions are immutable financial records.
Defaults let you set values once that apply to every record. For example, setting a default currency or default dimensions avoids repeating the same values on every record.
Preflight Check#
Before importing, run a preflight check to discover the required fields for a specific transaction type. Required fields are company-specific (configured in the workflow definition), so always check before building your records.
The preflight check returns:
- Required header fields
- Required line fields
- Optional header fields
- Optional line fields
Include a sample record to validate it against the full pipeline and get specific error messages before submitting the entire batch.
Synchronous vs. Asynchronous Processing#
Imports are automatically routed based on record count:
| Records | Mode | Behavior |
|---|---|---|
| 1-50 | Synchronous | Full result returned immediately with counts, errors, and created IDs |
| 51+ | Asynchronous | Returns an import ID immediately; processes in background |
Why Asynchronous?#
Each transaction involves extensive validation, entity resolution, and GL posting. For large batches, synchronous processing would exceed timeout limits. Asynchronous mode processes records in batches and reports progress as it goes.
Monitoring Progress#
For asynchronous imports, poll the import status to track progress:
- In progress: Shows percentage complete, processed records, imported count, and error count
- Completed: Shows final counts for imported, skipped, and errored records, plus duration
Concurrency Limit#
Only one large import (over 50 records) per organization runs at a time. Small imports (50 or fewer records) are unaffected and can run in parallel.
Error Handling#
Per-Record Isolation#
Each record is processed independently. One failed record does not block the others. Successfully imported records are not rolled back when other records fail.
Common Errors#
| Error | Cause | Fix |
|---|---|---|
| Vendor not found | Name does not match any vendor | Check spelling or use internal ID |
| Account not found | Invalid account number | Verify account exists for this entity |
| Type not configured | Transaction type not enabled | Check transaction type settings |
| Required field missing | Field required by workflow definition | Add the missing field |
| Invalid date format | Date not in YYYY-MM-DD format | Fix date format |
Recovery from Partial Failures#
When some records fail in a batch:
- Check the error details for specific issues per record
- Fix the problematic records
- Re-submit with "skip duplicates" to skip already-imported records
- Successfully imported records from the first run remain committed
Batch-Level Approval (Optional)#
Organizations can optionally enable batch-level approval for bulk imports:
- User submits import
- Records are stored and a single approval workflow is created for the entire batch
- Approver reviews a summary of the batch
- On approval, all records are processed with batch optimizations
- On rejection, nothing is imported
Approval Configuration#
| Setting | Behavior |
|---|---|
| Off (default) | Imports process immediately -- suitable for migrations and trusted operations |
| Green lane | Approval happens instantly (useful for audit trail without blocking) |
| Yellow/Red lane | Requires manual approval before processing |
When approval is required, the import status progresses through: pending approval, importing, completed.
Common Workflows#
CSV File Import#
- Run a preflight check to discover required fields
- Parse the CSV and map columns to transaction fields
- Determine legal entity, transaction type, and default values
- Build records from each CSV row
- Preview a summary (record count, total amount, date range) before submitting
- Submit the import
- Review results (imported, skipped, errors)
Repetitive Transaction Patterns#
When you describe a batch of similar transactions (such as "12 monthly rent invoices"), the system can generate records programmatically, show you a preview, and submit via the import workflow.
Data Migration from External Systems#
For migrations from systems like QuickBooks or Xero:
- Import master data first -- Vendors, customers, employees, and accounts with external IDs
- Import transactions using external IDs -- Reference entities by their external identifiers
- Use "skip duplicates" -- Allows safe re-runs if the migration is interrupted
Pre-Submit Checklist#
Before submitting a bulk import, verify:
- Legal entity ID is correct for all records
- Required dimensions are included
- Vendors and customers exist for all referenced parties
- Account numbers are valid for the entity
- Tax codes are appropriate
- Dates are in YYYY-MM-DD format
- Reference numbers are unique to avoid duplicates
- Currency is set (defaults to USD if not specified)
- Payment method and terms are included where required
- Preview has been reviewed with totals before submitting
Key Capabilities#
- Mixed transaction types in a single import operation
- Flexible entity resolution by ID, name, external ID, or tax ID
- Pre-cached lookups for fast batch processing
- Preflight validation to discover required fields before importing
- Automatic sync/async routing based on batch size
- Per-record error isolation so one bad record does not block the rest
- Duplicate detection with skip or error behavior
- Optional batch-level approval with configurable risk lanes
- Safe re-runs for interrupted migrations
- Default values to avoid repeating common fields across records
Subscribe to new posts
Get notified when we publish new insights on AI-native finance.