Skip to main content
CSV Import allows you to manually import transaction data from any financial institution that provides CSV exports. This is ideal for banks not supported by Plaid or SimpleFIN, historical data imports, or one-time account migrations.

What You Can Import

  • Transactions: Date, amount, description, category
  • Account Statements: Bank statements in CSV format
  • Credit Card Statements: Transaction history exports
  • Investment Activity: Trades, dividends (with appropriate column mapping)
  • Historical Data: Bulk import of past transactions
CSV import is a one-time operation. For ongoing syncing, use Plaid, SimpleFIN, SnapTrade, or Coinbase integrations.

Supported File Types

CSV Files

  • Standard CSV: Comma-separated values
  • TSV: Tab-separated values
  • Any Delimiter: Configure custom delimiters during import
  • Character Encodings: Automatic detection (UTF-8, ISO-8859-1, Windows-1252, etc.)
  • Max Size: 5 MB per file
Source: app/controllers/imports_controller.rb:74

PDF Statements (AI-Powered)

  • Bank Statements: Parsed using AI (OpenAI GPT)
  • Credit Card Statements: Extract transactions from PDF
  • Max Size: 10 MB per file
  • Format Validation: Checks for valid PDF headers
Source: app/controllers/imports_controller.rb:134
PDF import requires OpenAI API access and will incur AI processing costs. CSV import is free and faster.

Prerequisites

1

Export from Your Bank

Download a CSV export from your bank’s online portal:
  1. Log into your bank’s website
  2. Navigate to transaction history or statements
  3. Look for “Export” or “Download” button
  4. Select CSV format (if available)
  5. Choose date range for export
2

Prepare the File

Ensure your CSV contains at minimum:
  • Date column: Transaction dates
  • Amount column: Transaction amounts
  • Description column: Transaction descriptions
Optional columns:
  • Category, Account, Balance, Check Number, etc.

Importing a CSV File

1

Navigate to Imports

  1. Go to Settings → Imports
  2. Or navigate directly to /imports/new
2

Choose Import Type

Select the type of import:
  • Transaction Import: Most common (bank/credit card transactions)
  • Other types: May be available depending on configuration
3

Select Account (Optional)

Choose which Sure account to import into:
  • Select an existing account
  • Or create the account first, then import
You can change this later if needed.
4

Upload CSV File

  1. Click “Choose File” or drag and drop
  2. Select your CSV file
  3. Click “Upload”
The file is processed immediately.
5

Configure Column Mappings

Map CSV columns to Sure fields:
  1. Date Column: Which column contains transaction dates
  2. Amount Column: Which column contains amounts
  3. Description Column: Which column contains descriptions
  4. Optional Columns: Map category, account, balance, etc.
  5. Date Format: Specify how dates are formatted (MM/DD/YYYY, DD/MM/YYYY, etc.)
  6. Amount Format: Positive/negative handling, decimal separator
6

Preview and Confirm

Review the preview:
  • First few rows of imported data
  • Mapped fields and transformations
  • Any warnings or errors
Make adjustments if needed, then click “Confirm”
7

Publish Import

Click “Publish” to create transactions:
  • Import runs in the background
  • Progress is shown in real-time
  • You’ll be notified when complete
Source: app/controllers/imports_controller.rb:44

Column Mapping Guide

Required Fields

Sure FieldDescriptionExample CSV Values
DateTransaction date2024-01-15, 01/15/2024, 15-Jan-2024
AmountTransaction amount123.45, -50.00, 1,234.56
DescriptionTransaction descriptionWALMART #5123, Coffee Shop

Optional Fields

Sure FieldDescriptionExample CSV Values
CategoryTransaction categoryGroceries, Dining, Transport
AccountAccount identifierChecking, Savings, *1234
BalanceRunning balance5,432.10
NotesAdditional notesBusiness expense
Check NumberCheck number1001, 1002
TypeTransaction typedebit, credit, withdrawal

Amount Handling

Positive/Negative Convention:
  • Some banks export debits as negative, credits as positive
  • Others export all as positive with a separate Type column
  • Configure during column mapping step
Decimal Separator:
  • , (comma): European format → 1.234,56
  • . (period): US format → 1,234.56
Currency:
  • Stripped during import (e.g., $123.45123.45)
  • Account currency determines final currency

Date Format Detection

Sure attempts to auto-detect date formats, but you can specify:
  • MM/DD/YYYY - US format (e.g., 12/31/2024)
  • DD/MM/YYYY - European format (e.g., 31/12/2024)
  • YYYY-MM-DD - ISO format (e.g., 2024-12-31)
  • DD-MMM-YYYY - Text month (e.g., 31-Dec-2024)
Source: app/controllers/imports_controller.rb:68

Import Templates

Sure can detect and suggest import templates for common banks:
  • Chase Bank: Predefined column mappings
  • Bank of America: Predefined column mappings
  • Wells Fargo: Predefined column mappings
  • Custom Templates: Create your own for reuse
If a template is detected:
  1. You’ll see a “Template Suggested” badge
  2. Click “Apply Template” to auto-configure column mappings
  3. Review and adjust if needed
Source: app/controllers/imports_controller.rb:110

PDF Import (AI-Powered)

Import transactions directly from PDF bank statements using AI:
1

Upload PDF

  1. Navigate to Imports → New
  2. Select your PDF bank statement
  3. Upload (max 10 MB)
2

AI Processing

Sure sends the PDF to OpenAI GPT:
  • Extracts transaction data
  • Parses dates, amounts, descriptions
  • Returns structured data
This can take 30-60 seconds depending on file size.
3

Review Extracted Data

Review AI-extracted transactions:
  • Check for parsing errors
  • Verify amounts and dates
  • Assign to correct account
4

Publish

Click “Publish” to create transactions.
Source: app/controllers/imports_controller.rb:133
AI extraction is not 100% accurate. Always review extracted data before publishing.

Character Encoding

Sure automatically detects file encoding using the rchardet gem:
  • UTF-8 (most common)
  • ISO-8859-1 (Latin-1)
  • Windows-1252 (Windows Western European)
  • UTF-16
  • Others
If your file has encoding issues (garbled characters), try:
  1. Re-exporting from your bank with UTF-8 encoding
  2. Opening the file in Excel and saving as “CSV UTF-8”
  3. Using a text editor to convert encoding
Source: Gemfile:74

Managing Imports

Viewing Import History

All imports are tracked:
  1. Go to Settings → Imports
  2. View list of all imports with:
    • Status (pending, processing, completed, failed)
    • Import date
    • Number of transactions
    • Associated account
Source: app/controllers/imports_controller.rb:30

Reverting an Import

If you imported incorrect data:
1

Find the Import

Navigate to Settings → Imports and locate the import to revert.
2

Revert

  1. Click on the import
  2. Click “Revert Import”
  3. Confirm
3

Background Processing

The revert runs in the background:
  • Deletes all transactions created by this import
  • Restores account balances
  • Marks import as reverted
Source: app/controllers/imports_controller.rb:105
Reverting an import is irreversible. Make sure you want to delete all imported transactions.

Deleting an Import

To permanently delete an import record:
  1. Navigate to the import
  2. Click “Delete”
  3. Confirm deletion
This removes:
  • The import record
  • Associated file uploads
  • Does NOT delete transactions (use Revert first if needed)
Source: app/controllers/imports_controller.rb:118

Troubleshooting

”File Too Large”

Cause: CSV exceeds 5 MB (or PDF exceeds 10 MB). Solution:
  • Split the file into smaller date ranges
  • Import multiple smaller files sequentially
Source: app/controllers/imports_controller.rb:74, 134

”Invalid File Type”

Cause: File is not a valid CSV or PDF. Solution:
  • Ensure file extension is .csv or .pdf
  • Check that CSV uses standard delimiters (comma, tab)
  • Verify PDF is not corrupted
Source: app/controllers/imports_controller.rb:79, 54

”Unable to Parse Dates”

Cause: Date format not recognized. Solution:
  1. Check your date format (MM/DD/YYYY vs DD/MM/YYYY)
  2. Manually specify date format in column mapping
  3. Ensure dates are in a single column (not split across multiple)

“Duplicate Transactions”

Cause: Importing the same data multiple times. Solution:
  • Sure does not auto-detect duplicates for CSV imports
  • Manually mark duplicates in transaction view
  • Or revert the incorrect import first

”Garbled Characters”

Cause: Character encoding mismatch. Solution:
  1. Re-export CSV as UTF-8 from your bank
  2. Open in Excel → Save As → CSV UTF-8
  3. Or use a text editor to convert encoding
Source: Gemfile:74

”Max Row Count Exceeded”

Cause: Import contains too many rows. Solution: Split into multiple smaller imports. Source: app/controllers/imports_controller.rb:26

Best Practices

  1. One Import Per Statement: Import one bank statement at a time
  2. Date Ranges: Don’t overlap date ranges between imports
  3. Review Before Publishing: Always preview data before finalizing
  4. Save Templates: Create templates for banks you import from frequently
  5. UTF-8 Encoding: Always export CSVs as UTF-8 when possible
  6. Backup First: Export existing Sure data before large imports
  7. Test with Small File: Test with a few rows first, then import full file

Alternative: Use Integrations

For ongoing syncing, consider using automated integrations instead:

Plaid

Automated bank syncing for 12,000+ institutions

SimpleFIN

Privacy-focused alternative for US banks
CSV import is best for:
  • One-time historical imports
  • Unsupported banks
  • Manual accounts with occasional data entry
  • Testing and development

API Reference

Creating an Import

# Source: app/controllers/imports_controller.rb:66
import = Current.family.imports.create!(
  type: "TransactionImport",
  account: account,
  date_format: Current.family.date_format
)
import.update!(raw_file_str: file.read)

Publishing an Import

# Source: app/controllers/imports_controller.rb:23
import.publish_later  # Runs in background via Sidekiq

Reverting an Import

# Source: app/controllers/imports_controller.rb:105
import.revert_later  # Runs in background

File Size Limits

# Source: app/controllers/imports_controller.rb
Import::MAX_CSV_SIZE = 5.megabytes   # 5 MB
Import::MAX_PDF_SIZE = 10.megabytes  # 10 MB

Allowed MIME Types

Import::ALLOWED_CSV_MIME_TYPES = [
  "text/csv",
  "text/plain",
  "application/csv",
  "application/vnd.ms-excel"
]

Import::ALLOWED_PDF_MIME_TYPES = [
  "application/pdf"
]
Source: app/controllers/imports_controller.rb:54, 79

Additional Resources

Transaction Management

Learn about managing imported transactions

Account Reconciliation

Reconcile imported transactions with bank statements

Build docs developers (and LLMs) love