How to extract recent transactions from a large transaction csv
- Step 1Export the full transaction history — Download the complete CSV from Stripe (Payments → Export), PayPal (Activity → Download), or your store/bank. Note which column holds the transaction date and what format it uses.
- Step 2Sort by date descending first — Run csv-sorter on the date column in descending order so the most recent transactions sit at the top of the file. The Row Limiter has no date awareness, so this step is what makes 'recent' meaningful.
- Step 3Drop the sorted file onto the Row Limiter — It reads locally; nothing uploads. Free accepts files up to 2 MB, Pro up to 100 MB. A larger file is blocked at drop.
- Step 4Set the Row limit to the count you need — Enter the number of recent rows to keep (minimum
1). If a typical month is ~300 transactions, a limit of 400 gives headroom. Free caps the output at 500 rows. - Step 5Use Row offset for an earlier window — Leave offset 0 for the most recent block. To grab the prior period, set offset to the count you already pulled — e.g. offset 400, limit 400 for the month before.
- Step 6Download and reconcile — The file downloads as
<name>.rows-<start>-<end>.csv. Open it in your accounting tool. Always confirm the date span of the slice before reconciling.
Sort-then-slice recipes for transaction periods
The Row Limiter is count-based, so 'recent' depends on sorting by date descending first. Counts are data rows; the header is kept automatically.
| Goal (after sorting date DESC) | Row limit | Row offset | Result |
|---|---|---|---|
| Most recent ~month (≈300 txns) | 400 | 0 | Top 400 rows — the newest transactions |
| Previous month | 400 | 400 | Rows 401–800 — the period before, no overlap |
| Most recent 50 for a spot check | 50 | 0 | The 50 newest transactions |
| Oldest 100 (sort ASC instead) | 100 | 0 | With an ascending sort, the top is the oldest — the same slice flips meaning |
Count-based vs date-based: pick the right tool
The Row Limiter cannot select by date. For precise date-range work, use a filter instead.
| What you want | Right approach | Why |
|---|---|---|
| Top N most recent rows | Sort DESC → csv-row-limiter | Limiter takes a contiguous count from the top |
| All rows in a date range (e.g. May 2026) | csv-column-filter | Filter matches date values; the limiter can't compare dates |
| Recent rows but exact count varies by month | Filter by month, then limiter as a safety cap | Filter gets the right rows; limiter enforces a max count |
| Two adjacent periods | Sort DESC → limiter with offset 0, then offset = period size | Offset carves the second window without re-sorting |
Tier limits for transaction trimming
Row Limiter is a Pro tool with a free allowance. The free cap applies to OUTPUT rows. From lib/tier-limits.ts.
| Tier | Max input file | Max output rows | Note |
|---|---|---|---|
| Free | 2 MB | 500 rows | A small monthly slice fits, but a full multi-year export usually exceeds 2 MB and is blocked at drop |
| Pro | 100 MB | 100,000 rows | Handles large multi-year Stripe/PayPal exports |
Cookbook
Reconciliation slices using a date-sorted export. Each block shows the sort assumption, the limit/offset, and the result. Amounts are illustrative.
Most recent transactions after a descending date sort
ExampleSort by date descending first so the newest rows are at the top, then take the count you need. This is the canonical 'recent transactions' workflow.
Step 1 — csv-sorter: sort 'created' DESC Sorted top (newest first): created,amount,currency,status 2026-06-09,42.00,usd,paid 2026-06-09,18.50,usd,paid 2026-06-08,99.00,usd,paid ... (older below) Step 2 — csv-row-limiter: Row limit 3, Row offset 0 Output (payments.rows-1-3.csv): the 3 newest rows + header
Previous month via offset
ExampleAfter pulling the most recent block, set the offset to that block's size to grab the period immediately before it — no second sort required.
Sorted DESC, ~400 txns/month. This month: Row limit 400, Row offset 0 → rows 1-400 Previous month: Row limit 400, Row offset 400 → rows 401-800 The two slices are adjacent and non-overlapping in date order.
Date range instead of count — use the filter
ExampleWhen you need exactly May 2026 (not 'about 400 rows'), the Row Limiter is the wrong tool. Filter by the date value; the limiter can't compare dates.
Goal: all transactions dated 2026-05-* csv-column-filter: created starts-with '2026-05' → returns every May row regardless of count. (Row Limiter would only give a fixed count, possibly cutting mid-month or including April rows.)
Wrong order without the sort
ExampleMost exports are ascending (oldest first). Skipping the sort means the Row Limiter trims to the oldest rows, not the recent ones — a common reconciliation mistake.
Export as-downloaded (oldest first): created,amount 2024-01-02,... ← row 1 2024-01-03,... ... Row limit 400, offset 0 → the OLDEST 400 rows, not recent. Fix: sort 'created' DESC before limiting.
Trim then reconcile in a spreadsheet
ExampleThe point of the slice is to get a file small enough to open without Excel hanging. Confirm the date span of the output before reconciling.
Source: stripe_payments_2026.csv (180,000 rows, Pro tier) Sorted DESC, Row limit 500, Row offset 0 → stripe_payments_2026.rows-1-500.csv Open in Excel: 500 recent rows load instantly. Check top and bottom dates to confirm the window.
Errors and edge cases
Real errors and silent failures sourced from each platform's own documentation. Match the wording to the row, fix what the row says to fix.
Full-year export exceeds the file-size cap
Blocked at dropMulti-year Stripe/PayPal exports routinely exceed 2 MB, so on free they're blocked at drop before parsing. Upgrade to Pro (100 MB), or split the export with csv-row-splitter into monthly chunks and limit one chunk.
More than 500 recent rows on free tier
Pro requiredFree caps the OUTPUT at 500 rows. A high-volume month over 500 transactions can't be pulled in one free run — the run is blocked with a Pro prompt after processing. Use Pro, or filter to a tighter date range first so the output stays under 500.
File not sorted by date
Wrong rowsThe Row Limiter has no date awareness — it slices by file position. If the export is in its default (often ascending) order and you don't sort, you'll trim to the oldest rows. Always sort with csv-sorter descending first when you want recent transactions.
Mixed or ambiguous date formats
Sort riskIf the date column mixes MM/DD/YYYY and YYYY-MM-DD, a text sort can order them wrong, putting non-recent rows at the top. Normalize the date format (e.g. via [csv-find-replace] is not the tool — instead clean with csv-cleaner) before sorting, and verify the top/bottom dates of the slice.
Header row gets sliced as data
First row treated as headerThe Row Limiter always keeps row 0 as the header. If your accounting export has a leading metadata or title line above the real header, that line is treated as the header and your column names land in the first data row. Strip the leading line before slicing.
Amounts re-quoted on output
PreservedValues that contain commas (e.g. a description "refund, partial") are kept as single quoted cells, so the amount and currency columns stay aligned. Numeric amounts are passed through as text exactly as parsed; the tool does no rounding or reformatting.
Offset larger than the transaction count
Empty resultAsking for 'the previous month' with an offset bigger than the available rows yields a header-only file (Rows out 0). Check Total rows in against your offset before reconciling an empty slice.
Blank separator rows inside the export
Counted as rowsSome bank exports insert blank lines between sections. With skipEmptyLines: false, those count as data rows and shift your slice math. Remove them first with csv-empty-row-remover.
Need an exact date range, not a count
Use the filterIf 'recent' really means 'a specific period', the count-based slice can cut mid-month or spill into the wrong month. Use csv-column-filter on the date column for an exact range; reserve the Row Limiter for top-N-by-position needs.
Frequently asked questions
Will the top rows really be the most recent transactions?
Only if you sort by date descending first. The Row Limiter takes the first N rows of whatever order the file is in. Run csv-sorter on the date column descending, then the top N are the newest.
Can I filter by an exact date range instead of a row count?
Not in this tool. Use csv-column-filter to select rows by date value (e.g. dates starting with 2026-05). The Row Limiter is count-based and has no date awareness.
How do I get the previous month after pulling the latest one?
Use the offset. If the latest period was limit 400 / offset 0, the previous period is limit 400 / offset 400 — adjacent rows in the sorted file, no re-sort needed.
Why did I get the oldest transactions instead of the newest?
The export was probably in ascending (oldest-first) order and you didn't sort. The limiter trimmed by file position. Sort descending by date first, then slice.
Is my financial data uploaded?
No. Parsing and slicing run entirely in your browser via PapaParse. Transaction data never reaches a JAD Apps server; only an anonymous run counter is recorded for signed-in stats.
My full export won't load on free — why?
Free caps the input file at 2 MB, and multi-month transaction exports usually exceed that, so they're blocked at drop. Upgrade to Pro (100 MB) or split the file into smaller chunks with csv-row-splitter first.
Does the header (column names) come through?
Yes, always. Row 0 is kept as the header and isn't counted by the limit or offset, so your reconciliation template's column mapping still works.
Does it change amounts, currency, or date formatting?
No. It only selects rows. Cell values pass through exactly as parsed — no rounding, no reformatting, no currency conversion. Fields with commas are re-quoted so columns stay aligned.
How many recent rows can I pull at once?
Up to 500 on free and up to 100,000 on Pro (output-row caps). If a month exceeds 500 transactions, either upgrade or filter to a tighter range so the output fits.
What if the export has a title line above the header?
Remove it first. The tool treats the very first line as the header, so a metadata or title row would be mistaken for column names. Strip leading non-header lines before slicing.
Can I combine date filtering with a count cap?
Yes — filter by month with csv-column-filter to get the right rows, then run the Row Limiter as a safety cap if you also want to enforce a maximum count.
What does the output file get named?
<name>.rows-<start>-<end>.csv, with the range reflecting your offset. The most-recent block from payments.csv downloads as payments.rows-1-400.csv.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.