EarlySignal documentation
CSV Import Schema
The official reference for importing execution history into EarlySignal. One row per fill supports partial executions, scaling in and out, and positions that are still open.
Last updated: October 16, 2026
Start with an execution ledger
For a broker export, upload the original fills, executions or supported trade-history report. Smart Import detects the layout and validates it. For a custom file, use the canonical column names below. Header order does not matter. Headers are normalized for case, spaces and punctuation; avoid duplicate financial headings.
- Download the blank template and add one row for each actual fill. Include
instrument,currencyand stable execution/account IDs whenever available. - Choose the destination bucket in Smart Import. Check the timezone, date convention, number format and source account label.
- Review executions, remaining quantities, fees, duplicates, currency, exclusions and position evidence. Resolve blocking issues and acknowledge the requested warnings.
- Confirm the current preview. Previewing does not publish trades, but does save a pending import. The signed preview expires after 15 minutes; changing the file, settings or relevant history requires a fresh preview.
Supported files and broker formats
CSV, TSV and delimited TXT are supported, including comma, tab and semicolon delimiters, quoted commas/newlines, statement preambles, repeated headers, labeled sections and Excel sep= directives. Upload decoding handles UTF-8, UTF-16 LE/BE and Windows-1252 fallback. Invalid UTF-16 or binary/control bytes are rejected. XLS/XLSX, PDFs, images and encrypted archives are not supported.
ZIP uploads can contain eligible CSV/TSV/TXT files. Multiple files are treated as complementary evidence and each original document is retained. Limits: 25 MiB ZIP, 25 MiB eligible extracted bytes for archive safety, 20 complementary files, and 5 MiB decoded request content including bundle overhead. Each text file is also limited to 5 MiB.
Recognized source families: EarlySignal / Generic CSV, Schwab / thinkorswim, Fidelity, Webull, Interactive Brokers, Lightspeed, DAS Trader, TradeZero, Moomoo, Robinhood, tastytrade, TradeStation, E*TRADE, Alpaca, TopstepX, Tradier. CenterPoint execution exports use the DAS family. Support depends on the report fields and evidence, rather than the broker name alone.
| Report family | Supported evidence and boundaries |
|---|---|
| Schwab / thinkorswim | Account Trade History execution sections, description-based fills, supported transaction history and qualifying reinvestment inventory rows. Account Order History placement time, requested quantity and price are not execution evidence. |
| Interactive Brokers | Activity Trades sections and Flex trade confirmations with consistent account, instrument, currency and contract facts. |
| DAS / CenterPoint, Lightspeed, TradeZero | Execution/trades windows and blotters, including split date/time and component fees. Time-only DAS files require a supplied trade date. |
| Webull, Moomoo, TradeStation | Filled order/trade reports with observed filled quantity, price and execution time. Partial fills and cumulative snapshots are supported only when their identities and progression can be proved. |
| Alpaca, Robinhood, tastytrade, Tradier | Supported fill/activity/transaction rows; non-fill activity is excluded. Some Tradier reports provide only a date. |
| Fidelity, E*TRADE | Supported transaction-history layouts can retain DATE_ONLY precision. A settlement date or order submission time does not become an observed fill time. |
| TopstepX | Supported fills and closed-trade summaries with contract/multiplier evidence. Summary rows are not equivalent to a complete execution tape. |
| Unfamiliar layouts / round-trip summaries | A validated mapping may select renamed columns, multiple tables, or entry/exit legs. Partial closing quantity must be positive and no larger than opening quantity; blank closing fields can retain an entry-only position. Mapping availability depends on the layout and configured provider or manual recovery; arbitrary exit_price columns are not canonical fields. |
Depending on configuration, an AI provider may propose a mapping for an unfamiliar layout. EarlySignal parses and validates the rows locally; the model does not supply financial truth. A column-selection recovery tool is available in Import. See the Privacy Policy for data-sharing details and the broker export guide for report instructions (sign-in required).
Required canonical columns
These six values must be available for each execution. Canonical side and type are position semantics; BUY/SELL belong to broker-specific or mapped layouts. On narrow screens, scroll tables sideways to read every column.
| Column | Data type | Rules and valid values |
|---|---|---|
| symbol | Text | Required. Instrument symbol, e.g. AAPL. Whitespace is trimmed and letters normalized to uppercase. Use a contract-specific symbol for derivatives. |
| side | Enum | Required. LONG or SHORT. This is the position direction on every row, including exits. |
| type | Enum | Required. ENTRY or EXIT. ENTRY increases the position; EXIT reduces it. |
| executed_at | Timestamp or date | Required (or separate date/time columns). Prefer ISO 8601 with Z or a numeric offset, e.g. 2026-10-01T09:30:00-04:00. A date alone is DATE_ONLY. |
| price | Decimal | Required. Price per quantity unit, before fees. Zero is allowed for STOCK, OPTION, FUTURE and OTHER; negative prices only for FUTURE. FOREX and CRYPTO prices must be positive. |
| quantity | Positive decimal | Required. Actual executed shares, contracts or units, not requested order quantity. Fractional quantities are supported. Use positive magnitudes for both entries and exits. |
Optional and conditionally required columns
Optional does not mean unnecessary for reliable accounting. Contract identity, multiplier, currency or prior history may be required by your instrument and source.
| Column | Data type | Rules and valid values |
|---|---|---|
| instrument | Enum | STOCK, OPTION, FUTURE, FOREX, CRYPTO or OTHER. Explicitly include it in custom files; inference is accepted only with sufficient source evidence. |
| value_multiplier | Positive decimal | Cash value of a one-point price change for one quantity unit. Default is 100 for OPTION and 1 otherwise, but derivatives/FOREX/OTHER require an explicit or independently verified multiplier for reliable financial interpretation. Do not assume the default matches your contract. |
| currency | Currency / quote-asset code | Execution denomination, e.g. USD, CAD, USDT. Use the actual unit. Must agree with qualified price/amount headers, pair and fee currency evidence. |
| account_currency | Currency code | Reporting-currency metadata. Does not convert execution prices or P&L and does not override the destination account settings. |
| fees | Signed decimal | Optional total net cost for this execution; blank means 0. Positive = charge; negative = credit/rebate. Do not repeat a whole-order fee on each partial fill. |
| trade_id | Text identifier | Optional grouping hint within account, currency, instrument and multiplier. Use a different ID for each flat-to-flat lifecycle. Does not let you combine incompatible contracts or reopen a closed lifecycle. |
| execution_id | Text identifier | Stable fill ID. Strongly recommended for overlapping exports. Distinct partial fills need distinct IDs even if their order_id is identical. fill_id is an alias. |
| external_id | Text identifier | Stable source execution identity. Falls back to execution_id, then a transaction ID qualified by trade date. Never reuse an ID for changed financial facts. |
| transaction_id | Text identifier | Source transaction identifier; retained with trade-date context. |
| order_id | Text identifier | Parent order ID. Several executions may share it. An order ID alone does not establish that rows are cumulative snapshots or duplicates. |
| broker_account_id | Text identifier | Source brokerage account ID. Keep stable across files; keep different accounts separate. An accountless file may require account selection before reconciliation. |
| session | Enum | PREMARKET, REGULAR or AFTERHOURS. Aliases PRE/PRE_MARKET, DAY/RTH and AH/AFTER_HOURS are accepted. Blank/unrecognized values may be inferred for supported equity schedules; otherwise unset. |
| timestamp_precision | Enum | EXACT or DATE_ONLY (also DATETIME/DATE_TIME and DATE/DATEONLY). A date without a time stays DATE_ONLY even if marked EXACT. Unrecognized values fall back to parsed precision. |
| setup, notes | Text | Optional trade annotations, selected from the first incoming row when constructing the group. Existing annotations are preserved during reconciliation. |
| execution_note | Text | Optional per-fill note. Quote text containing commas, double quotes or newlines. |
| bucket | Text | Recognized source label only. The Target bucket selected in Smart Import determines where records are written; rows do not create or route to buckets. |
| opening_position_status | Enum | UNKNOWN (default), USER_CONFIRMED_FLAT or PROVEN. A supplied label is a declaration, not independently verified evidence. Use flat confirmation only when the source really starts with zero inventory. |
| source_granularity | Enum | execution (default), order_aggregate, ledger_trade or unknown. Aggregate records retain their analytical limitations; a label cannot turn a summary into observed fills. |
| trade_date | Calendar date | Source trading date. Prefer YYYY-MM-DD. Used for provenance and transaction identity, not a replacement for the execution timestamp. |
| raw_action, source_status, order_type | Text | Source provenance. These columns do not replace canonical side/type or prove an order was filled. |
Partial fills, scaling and open positions
| side | type | Economic action |
|---|---|---|
| LONG | ENTRY | Buy to open / increase |
| LONG | EXIT | Sell to reduce / close |
| SHORT | ENTRY | Sell short to open / increase |
| SHORT | EXIT | Buy to cover / reduce |
Keep partial fills as separate rows. Several fills can share an order_id; each fill should retain its own execution_id. Repeated timestamps and identical prices are possible real fills and are not sufficient grounds for deduplication.
Multiple ENTRY and EXIT rows are supported, including a new scale-in after a partial exit. Running inventory is entries minus exits. A fully reconciled lifecycle stays OPEN while quantity remains and becomes CLOSED at zero. Total closing quantity may be less than total opening quantity; no artificial balancing row is needed.
An entry-only position is valid. Omit closing rows completely until real fills exist. Closing timestamp and average exit price remain empty, and there is no exit realization. Do not add a zero-quantity exit, a zero-price placeholder or a future date to mark an open position.
For a reconciled lifecycle, an exit cannot exceed the inventory available at that point or occur before its entry. If history is missing, supply earlier executions with matching source/account identity. Eligible unresolved executions may instead be preserved with uncertainty, or only the source retained; that does not establish missing basis or make their P&L authoritative.
Without trade_id, grouping separates account, currency, instrument/contract, multiplier and position direction, then splits at flat boundaries. Explicit IDs are scoped grouping hints and cannot override lifecycle checks. For a canonical reversal, use a real EXIT to flat and a separate opposite-side ENTRY for the remaining quantity, with separate lifecycle IDs and correctly allocated fees; supported broker mappings may split a reversal automatically.
Accounting uses chronological moving-average cost, linear valuation and net positions. Each exit realizes only its closed quantity. Entry fees are allocated proportionally as inventory closes; exit fees apply to that exit. Later entries do not change an earlier realization. FIFO/LIFO tax-lot accounting, hedged inventory and nonlinear/inverse payoffs are not supported accounting models. Different currencies remain separate; there is no implied FX conversion.
Downloadable templates and verified examples
All examples below are synthetic stock trades with fictitious account/order/fill IDs. Each assumes zero inventory before its first entry and explicitly declares USER_CONFIRMED_FLAT. This assumption is specific to these examples; use UNKNOWN or the actual evidence for your own file. Replace every demo value and ID before using a template for real history. Import examples only into a separate demo bucket.
Partial fills and scaling in/out
6 fills; 190 opened, 190 closed; CLOSED. Moving-average gross P&L 176.00, fees 1.90, net P&L 174.10 USD.
Download partial-fills-and-scaling.csvView example CSV
trade_id,symbol,instrument,side,type,executed_at,price,quantity,fees,currency,broker_account_id,execution_id,order_id,opening_position_status
DEMO-SCALE,AAPL,STOCK,LONG,ENTRY,2026-10-01T09:30:00-04:00,100,60,0.30,USD,DEMO-ACCOUNT,DEMO-S1,DEMO-ORDER-1,USER_CONFIRMED_FLAT
DEMO-SCALE,AAPL,STOCK,LONG,ENTRY,2026-10-01T09:30:01-04:00,100,40,0.20,USD,DEMO-ACCOUNT,DEMO-S2,DEMO-ORDER-1,USER_CONFIRMED_FLAT
DEMO-SCALE,AAPL,STOCK,LONG,EXIT,2026-10-01T09:35:00-04:00,102,40,0.20,USD,DEMO-ACCOUNT,DEMO-S3,DEMO-ORDER-2,USER_CONFIRMED_FLAT
DEMO-SCALE,AAPL,STOCK,LONG,ENTRY,2026-10-01T09:40:00-04:00,101.80,90,0.45,USD,DEMO-ACCOUNT,DEMO-S4,DEMO-ORDER-3,USER_CONFIRMED_FLAT
DEMO-SCALE,AAPL,STOCK,LONG,EXIT,2026-10-01T09:45:00-04:00,102.08,100,0.50,USD,DEMO-ACCOUNT,DEMO-S5,DEMO-ORDER-4,USER_CONFIRMED_FLAT
DEMO-SCALE,AAPL,STOCK,LONG,EXIT,2026-10-01T09:50:00-04:00,101,50,0.25,USD,DEMO-ACCOUNT,DEMO-S6,DEMO-ORDER-5,USER_CONFIRMED_FLAT
Unequal opening and closing quantities
3 fills; 100 opened, 35 closed, 65 remain; OPEN. Gross realized P&L 70.00, net realized P&L 69.65 USD; remaining entry fees stay with the open inventory.
Download unequal-quantities-open.csvView example CSV
trade_id,symbol,instrument,side,type,executed_at,price,quantity,fees,currency,broker_account_id,execution_id,order_id,opening_position_status
DEMO-PARTIAL,MSFT,STOCK,LONG,ENTRY,2026-10-01T10:00:00-04:00,400,60,0.30,USD,DEMO-ACCOUNT,DEMO-P1,DEMO-ORDER-6,USER_CONFIRMED_FLAT
DEMO-PARTIAL,MSFT,STOCK,LONG,ENTRY,2026-10-01T10:01:00-04:00,400,40,0.20,USD,DEMO-ACCOUNT,DEMO-P2,DEMO-ORDER-7,USER_CONFIRMED_FLAT
DEMO-PARTIAL,MSFT,STOCK,LONG,EXIT,2026-10-01T10:05:00-04:00,402,35,0.175,USD,DEMO-ACCOUNT,DEMO-P3,DEMO-ORDER-8,USER_CONFIRMED_FLAT
Open position without closing executions
2 entry fills; 12.5 opened, 0 closed; OPEN. No exit realization, no closing date and no average exit price.
Download open-position-no-exits.csvView example CSV
trade_id,symbol,instrument,side,type,executed_at,price,quantity,fees,currency,broker_account_id,execution_id,order_id,opening_position_status
DEMO-OPEN,NVDA,STOCK,LONG,ENTRY,2026-10-01T11:00:00-04:00,120,10,0.10,USD,DEMO-ACCOUNT,DEMO-O1,DEMO-ORDER-9,USER_CONFIRMED_FLAT
DEMO-OPEN,NVDA,STOCK,LONG,ENTRY,2026-10-01T11:01:00-04:00,121,2.5,0.025,USD,DEMO-ACCOUNT,DEMO-O2,DEMO-ORDER-10,USER_CONFIRMED_FLAT
Short entry and cover
2 fills; 10 opened and closed; CLOSED. Gross P&L 20.00, fees 0.20, net P&L 19.80 USD.
Download short-position.csvView example CSV
trade_id,symbol,instrument,side,type,executed_at,price,quantity,fees,currency,broker_account_id,execution_id,order_id,opening_position_status
DEMO-SHORT,AMD,STOCK,SHORT,ENTRY,2026-10-01T12:00:00-04:00,150,10,0.10,USD,DEMO-ACCOUNT,DEMO-H1,DEMO-ORDER-11,USER_CONFIRMED_FLAT
DEMO-SHORT,AMD,STOCK,SHORT,EXIT,2026-10-01T12:10:00-04:00,148,10,0.10,USD,DEMO-ACCOUNT,DEMO-H2,DEMO-ORDER-12,USER_CONFIRMED_FLAT
In the scaling example, the first 40-share exit realizes 80 USD gross. After the next entry, 150 shares have an average basis of 101.08. The remaining exits realize 100 and −4 USD gross, respectively. Total 176 gross minus 1.90 fees = 174.10 USD net.
Blank canonical template includes the six required columns plus instrument, multiplier, currency, fees, grouping and source identity. A header-only file is a starting template, not an importable trade.
Advanced fields, aliases and source declarations
Prefer the canonical headings above for new files. Common aliases include ticker for symbol, direction for side, action for type, qty for quantity, account_id/account_number for broker_account_id and currency_code for currency. In the canonical parser, action still means ENTRY/EXIT. Broker-specific synonyms and mapped roles depend on the observed report; there is no universal list of arbitrary broker headers.
Fee aliases include commission_and_fees, commission_fees, commissions_and_fees, commissions_fees, total_fees and commission. The canonical parser selects a total rather than summing arbitrary columns; the signed fees column is the recommended form. Broker adapters use validated charge/rebate and component meanings. Overlapping totals/components or ambiguous linked fees cannot be guessed.
| Column | Data type | Rules and valid values |
|---|---|---|
| executed_date, executed_time | Date + time | Alternative to executed_at; execution_date/filled_date/date and execution_time/filled_time/time are also recognized. date_time/date_and_time alias the combined timestamp. |
| timezone | Zone or offset | Timestamp timezone metadata; time_zone/tz also accepted. Prefer an explicit offset in executed_at. Without one, the selected import timezone applies (normally America/New_York). |
| instrument_type, asset_class, asset_type, asset_category, security_type, product_type | Instrument enum / recognized alias | Alternative asset-type headings. Use instrument in new canonical files. |
| native_symbol, underlying, expiration, strike, option_type, futures_contract | Text; date; positive decimal; enum | Contract identity. expiration: YYYY-MM-DD; strike: positive decimal; option_type: CALL or PUT (C/P aliases). Supply complete option identity and the actual futures contract, not just a root. |
| base_currency, quote_currency, exchange | Text codes | Pair and venue identity. Quantity is in base units and price in quote units after any explicitly declared conversion. |
| conid, security_id, security_id_type, cusip, isin, sedol, figi, underlying_conid | Text identifiers | Optional stable security identifiers, preserved as instrument metadata. |
| instrument_metadata_json | JSON object in a quoted CSV cell | Alternative to individual metadata columns; instrument_metadata is an alias. Recognized keys: nativeSymbol, underlying, expiration, strike, optionType, futuresContract, baseCurrency, quoteCurrency, exchange, identifiers. Use valid JSON with doubled CSV quotes. |
| quantity_unit, lot_size, quantity_scale | Text + positive decimal scale | Explicit linear quantity conversion. LOT/LOTS requires lot_size or quantity_scale; unknown units require quantity_scale. SHARES, UNITS, CONTRACTS, COINS, TOKENS and BASE are already quantity units. quantity_units is an alias. |
| price_unit, price_scale | Text + positive decimal scale | CENTS/CENT, PENCE or MINOR requires explicit price_scale (e.g. 0.01). QUOTE/MAJOR or matching currency is already in major units. price_units is an alias. |
| cost_basis_method, accounting_method | Enum | If declared: MOVING_AVERAGE, AVERAGE_COST, WEIGHTED_AVERAGE, WEIGHTED_AVERAGE_COST or WAC. FIFO/LIFO declarations are incompatible. |
| position_mode, inventory_model | Enum | If declared: NETTING, NET or NET_POSITION. Hedging is not a supported reconstruction model. |
| valuation_model, payoff_model | Enum | If declared: LINEAR or PRICE_TIMES_QUANTITY. Nonlinear/inverse contract accounting is unsupported. |
| execution_gross_pnl, execution_net_pnl, trade_gross_pnl, trade_net_pnl | Signed decimal | Optional reported P&L checks. Execution scope checks an exit realization; trade scope requires a complete closed lifecycle. These values never replace reconstructed P&L. |
| pnl, realized_pnl, pnl_basis, pnl_scope, pnl_currency | Decimal + enums / currency | Generic reported P&L needs pnl_basis=GROSS|NET and pnl_scope=EXECUTION|TRADE to be verified; currency must match the execution. Unknown semantics produce an unverified-report acknowledgement. |
| amount, gross_amount, net_amount | Signed decimal | Optional source notional/cash-flow checks when recognized by the mapping. Must agree with price × quantity × multiplier, gross/net meaning, fees and source rounding. Do not put realized P&L in an amount column. |
| source_row, source_part | Positive integer; enum | Export provenance. source_row falls back to the physical record. source_part: WHOLE, ROUND_TRIP_ENTRY, ROUND_TRIP_EXIT, REVERSAL_CLOSE or REVERSAL_OPEN; must agree with type. Preserve exported values. |
| execution_sequence, execution_order_status | Integer text; enum | Optional source ordering: sequence is 1–30 digits; order status ORDERED or UNORDERED. Equal timestamps need observed sequence or finer precision when order changes accounting. Do not manufacture sequence to resolve uncertainty. |
| source_file_hash, import_source, parser_version, currency_origin | Text | Export provenance and compatibility metadata. Preserve when re-importing an EarlySignal export. User-supplied text does not independently verify source ownership or currency. |
| financial_data_status | Enum | Export status: VERIFIED, NATIVE_CURRENCY, UNKNOWN_CURRENCY, UNVERIFIED_MULTIPLIER or INCOMPLETE_INSTRUMENT. Unsafe facts cannot be repaired by simply replacing this label. |
| opening_inventory_anchor_json | JSON object | Exported inventory evidence (quantity, coverageStart and source context). Preserve only from a real export. It is not a substitute for missing execution cost basis. |
Broker mapping roles (format-dependent)
The following are mapping roles, not extra required canonical headers. A supported adapter or validated mapping must establish their source meaning. Different brokers use different names and codes; opaque codes require documented declarations and validation.
| Column | Data type | Rules and valid values |
|---|---|---|
| action, position_effect, open_close | Action / position codes | BUY or SELL and independently established opening/closing semantics. Native vocabulary can include buy-to-open, sell-to-close, sell-short and buy-to-cover. Plain BUY/SELL alone does not prove the initial inventory. |
| status, row_type, description | Text / declared codes | Used to distinguish executions, orders, fees and ancillary rows. Non-fill order statuses cannot become executions without explicit fill quantity, price and time; unexplained fill-shaped rows cannot be ignored. |
| filled quantity, fill price, fill timestamp | Positive decimal; decimal; timestamp | Actual execution facts. Cumulative order-filled quantities require stable order identity and proven progression before conversion to incremental fills. Requested order quantity/time are metadata, not fill facts. |
| exitQuantity, exitPrice, exitDateTime, exitDate, exitTime | Mapped closing-leg roles | For supported round-trip summary layouts, opening facts use ordinary price/quantity/time roles. The closing leg uses these roles; quantity may default to the shared source quantity only when justified. If all closing facts are absent, the entry may remain open. Incomplete closing facts are invalid. |
| feeCurrency, feeEventId, fees | Currency; stable identifier; decimal components | Mappings can select validated fee components or linked fee rows with proven execution/order linkage. Total-versus-component and charge-versus-credit meaning must be explicit. Stable economic fee identity prevents repeated charges. |
| orderQuantity, orderTimestamp | Decimal; timestamp | Order metadata used to check fill/aggregate semantics. These cannot replace missing execution quantity or execution time. |
Opening inventory and complementary evidence files
A balanced buy/sell excerpt alone does not prove that its opening inventory was zero. A source account label can establish consistent user-scoped lineage across files, but does not prove a position boundary or broker account ownership. Use the same label only for exports from the same actual account.
UNKNOWN is the default opening status. When chronological fills permit it, EarlySignal can show a provisional flat-start reconstruction; missing basis or unreliable ordering can make calculations unavailable. Do not interpret a provisional figure as a verified historical result. The preview discloses which records are excluded or uncertain. Flat-start controls are optional and should be used only with actual knowledge of the starting inventory.
Complementary coverage and position CSVs can establish a boundary when complete and consistent with executions. These are evidence tables, not substitute fills. The importer requires exact ISO timestamps with seconds and Z/offset for these tables.
| Column | Data type | Rules and valid values |
|---|---|---|
| account_id, currency | Text codes; required | Required on coverage and snapshot records (or unambiguous source context). Must match the execution account and currency. |
| period_start, period_end | Exact timestamps; required for coverage | Increasing range; execution coverage is start-inclusive and end-exclusive. |
| execution_coverage, inventory_event_coverage | Enum; required for coverage | Both must say COMPLETE. Declare completeness only when the source actually covers every execution and inventory-changing event. |
| symbol, as_of, position_quantity | Text; exact timestamp; signed decimal | Required snapshot facts. position_quantity allows up to 12 decimal places; negative denotes short inventory. Snapshot must match the covered instrument and inventory conservation. A nonzero snapshot supplies quantity, not cost basis. |
| instrument_type, value_multiplier | Enum; positive decimal | Snapshot defaults are STOCK and multiplier 1 for stock. Other instruments require the actual multiplier and matching contract metadata (native_symbol, underlying, expiration, strike, option_type, futures_contract or pair fields as applicable). |
Assignment, exercise, expiration, cash settlement, splits, reorganizations, spin-offs and security transfers require inventory transformations the execution importer cannot safely invent. They may block financial publication; retaining source documents does not implement those events.
Informational columns in EarlySignal exports
EarlySignal CSV exports contain additional market-data and enrichment fields listed below. The current canonical importer does not restore them into float overrides, market-data approvals, provider observations, snapshot identities or enrichment job statuses. They can remain in an export for reference, but are not writable import fields. Market data is obtained through the normal enrichment workflow.
Other unrecognized columns may be preserved as source cells but do not automatically become tags, reviews, attachments or application fields. CSV is an execution interchange format, not a full account restore.
Formatting, validation and common errors
- Use plain decimal numbers and a dot separator in custom CSVs. Numeric values must be finite, exactly representable through the importer’s numeric path and have no more than 12 decimal places. Execution price/fee magnitudes and quantity/multiplier cannot exceed 1,000,000,000. A larger database decimal capacity does not increase import limits.
- Grouping separators, scientific notation, currency-qualified numbers and decimal-comma reports are supported when unambiguous. Choose the number convention when prompted. Percent values, malformed grouping and conflicting units fail validation. Quote a comma-containing value inside a comma CSV.
- Use ISO dates. Other supported conventions include US month/day, European day/month and compact YYYYMMDD; ambiguous dates require a selected convention. Excel serials require an explicit 1900 or 1904 system. Impossible dates and ambiguous/nonexistent daylight-saving local times require correction or an explicit offset.
- Date-only imports preserve the calendar date using a local-noon carrier; noon is not an observed fill time. Timing, session and holding-duration analytics are limited. Sub-millisecond source timestamps and observed execution sequence are retained for ordering; database DateTime alone does not preserve all source precision.
- Use standard CSV quoting: wrap comma/newline-containing cells in double quotes and double any internal quote. Keep text and IDs as text when editing in spreadsheets. Downloaded examples contain no formulas, credentials or real account records.
| Issue or error | Meaning | How to resolve it |
|---|---|---|
| Missing/invalid symbol, side, type, quantity or executed_at | A required execution fact is missing or invalid. | Use LONG/SHORT, ENTRY/EXIT, a positive quantity and a real execution date/time. Check the chosen mapping and header row. |
| TRADE_DATE / DATE_FORMAT / NUMBER_FORMAT | The source has time-only rows or an ambiguous convention. | Supply the trade date or select the source convention in Import. Do not replace execution time with placed time. |
| MISSING_ENTRY / EXCESS_EXIT_QUANTITY / EXIT_BEFORE_ENTRY | Known inventory does not support the closing rows. | Add matching earlier history, verify account identity and chronology, or use the offered uncertainty/source-retention option. Do not invent an entry or shrink a real fill. |
| Invalid fee / amount contradiction / reported P&L conflict | Amounts, signs, units or reported results disagree with validated executions. | Check multiplier, fee totals versus components, charge/rebate signs, gross/net and execution/trade scope. Financial contradictions cannot be waived with an acknowledgement. |
| Unknown currency / unsafe instrument facts | Currency, contract identity or multiplier is missing or contradictory. | Use evidenced facts and review the execution-currency controls. The current policy may default missing currency from the linked account or destination bucket, with a warning when required; a preference is not proof of the source denomination. |
| Duplicate / correction conflict | Proven existing fills are skipped; the same stable identity with changed financial facts conflicts. | Check preview counts. Distinct identical fills need their genuine separate IDs. Resolve corrections through the supported correction workflow; do not mint new IDs to bypass a conflict. |
| IMPORT_BUCKET_OWNERSHIP / account selection | Matching history belongs to another bucket or the source omits account identity. | Select the owning bucket or the correct account and refresh. Source similarity does not establish ownership. |
| IMPORT_PREVIEW_EXPIRED / STALE / INTEGRITY_MISMATCH | The saved preview expired or no longer matches current inputs/history. | Prepare and review a fresh preview. |
| IMPORT_UNCERTAIN / interrupted confirmation | The client cannot verify whether commit completed. | Check import status and recent imports before retrying. Reusing the same confirmation is receipt-based and idempotent. |
| Unsupported report / unmapped rows / provider unavailable | The report lacks provable fills or a validated mapping. | Choose the broker execution report, use manual column recovery or convert actual fills to the canonical template. Do not discard unexplained fill-shaped rows. |
Operational ceilings: 20,000 physical records and 512 columns per parsed document; 10,000 selected source execution records, 5,000 reconciled trades and 2,500 executions per trade. History loading is bounded to 25,000 executions, with at most 250 existing trade rewrites and 500 calculation-only refreshes per import. Account ceilings are 50,000 trades and 500,000 executions; plan entitlements can impose further limits. Split large histories into source-consistent date ranges and retain stable IDs.
A bad financial row may quarantine its affected symbol ledger, so valid-looking neighboring rows can also be excluded. Review the complete skipped/excluded list. A source-only save retains evidence without publishing executions. Blocking risks remain blocking; acknowledging a warning does not repair a contradiction.
Execution and database model
An import runs as synchronous preview and confirmation requests. Confirmation rechecks the signed plan against current history, then publishes within a serializable database transaction (60-second transaction budget). Trade aggregates, execution records, realization projections and source evidence commit together; a failure rolls the transaction back. Subsequent enrichment is handled separately.
| Record | Storage | Purpose |
|---|---|---|
| Trade | One lifecycle with many executions | Instrument/contract, direction, account/currency, OPEN/CLOSED state and cached quantities, prices, fees and P&L. Closed date is nullable. |
| Execution | One observed fill or explicitly identified expanded leg | ENTRY/EXIT, time/precision, price, quantity, signed fees, note and source IDs/provenance. Financial values use PostgreSQL Decimal(30,12). |
| TradeRealization | Per-exit accounting projection when available | Closed quantity, gross P&L, allocated entry fees, exit fees and net P&L. Rebuilt transactionally; an open remainder does not require a final exit. |
| ImportJob | PENDING → PROCESSING → COMPLETED, or FAILED / ROLLED_BACK | Preview plan, expiring confirmation hash, counts, errors and recoverable receipt metadata. |
| CsvImportAccount / Document / Record / Evidence | Tenant-scoped source evidence | Account declarations, immutable decoded originals, positional cells and append-only outcomes survive eligible import rollback. |
| CsvImportOccurrence / FeeClaim | Active unique source/economic claims | Prevent repeat physical occurrences or identified fees from publishing twice. Rollback releases active claims while retaining evidence. |
| Schema mapping records | Versioned per-user and de-identified shared mappings | Describe columns, not substitute financial facts. Every replay still validates the source locally. |
Database tenant relationships, stable source identity indexes, immutable evidence guards and execution/lifecycle constraints complement application validation. Rollback is guarded and may be unavailable after later edits or related journal data; it is not a general undo for arbitrary history. No schema migration or importer behavior change is required to use this reference.
Open Smart Import
