How to strip internal cost & margin columns from a product feed csv
- Step 1Export the full product feed — Pull the complete product CSV (or tab-separated
.txt) from your PIM, ERP, Shopify, or inventory system. Keep this as your internal source of truth — the tool never modifies it. - Step 2Drop the file onto the remover above — PapaParse reads the header row in your browser and lists every column as a checkbox. The feed content is never sent anywhere. The free tier accepts files up to 2 MB and up to 500 data rows; larger catalogues need Pro (see the limits table).
- Step 3Tick every internal column — Select
CostPrice,Margin,MarginPct,LandedCost,SupplierID,SupplierSKU,ReorderPoint,InternalNotes— any column the partner should not see. There is no preset or saved selection: tick them fresh each run. Blank-header columns appear asCol 3,Col 7, etc. so you can still target them. - Step 4Run the removal — The button reads
Remove N columnsand is disabled until at least one column is ticked. The tool drops those column positions from the header and every data row in one operation. - Step 5Verify the result counts — Check the three stat cards — columns removed, columns remaining, data rows — and scan the first-10-row preview to confirm
CostPriceandMarginare gone andTitle/GTINare intact. - Step 6Download and send the sanitised feed — Download saves
<yourfile>.columns-removed.csv(plain UTF-8, comma-delimited, no BOM). Send that file to the marketplace, agency, or channel partner — your cost structure stays behind.
Typical product-feed columns: keep vs. remove
A practical split for a feed destined for a marketplace, comparison-shopping engine, or agency. Column names vary by PIM/ERP; match on what each column means, not the exact label.
| Column (example) | Channel needs it? | Action | Why |
|---|---|---|---|
Title, Description, Brand | Yes | Keep | Core listing content — every channel maps these |
GTIN / EAN / UPC, MPN, SKU | Yes | Keep | Product identifiers; Google Merchant Center and Amazon match on these |
Price, SalePrice, Availability | Yes | Keep | Buyer-facing — the channel publishes them |
CostPrice, LandedCost, BuyPrice | No | Remove | Reveals your supplier cost — never share externally |
Margin, MarginPct, Markup | No | Remove | Lets a partner reverse-engineer your cost from the sale price |
SupplierID, SupplierSKU, SupplierName | No | Remove | Exposes your sourcing chain to a competitor or marketplace |
ReorderPoint, StockOnHand, WarehouseBin | No | Remove | Internal operations data; irrelevant and sensitive |
InternalNotes, BuyerComments | No | Remove | Free-text — may contain prices, names, or candid remarks |
What the remover does and does not change
Removal is purely positional. Verified against removeColumns() and rowsToCsv() in lib/csv-utils.ts.
| Aspect | Behaviour |
|---|---|
| Selection model | Tick columns to remove. There is no inverse 'keep only these' mode — to keep 5 of 40 columns you tick the other 35 |
| Scope of deletion | The ticked column positions are removed from the header row and every data row in one pass — nothing shifts into a neighbouring cell |
| Remaining cell values | Preserved exactly. The tool does not trim, re-case, re-quote unnecessarily, or reformat the columns you keep |
| Delimiter | Auto-detected on input (comma / tab / semicolon / pipe). Output is always comma-delimited |
| Quoting on output | Minimal — only fields containing a comma, quote, or newline get wrapped in quotes (PapaParse quotes: false) |
| BOM / encoding | Output is UTF-8 with no byte-order mark. If your feed needs a BOM for a specific importer, add it downstream |
| Empty rows | Preserved — blank rows are not dropped (use csv-empty-row-remover for that) |
| Free tier limits | 2 MB file size AND 500 data rows. Either over the cap blocks the run until you upgrade |
Cookbook
Before/after slices from real product feeds. Costs and supplier IDs anonymised; column order is positional in every example.
Strip cost, margin, and supplier columns before sending to an agency
ExampleThe PIM export has cost data wedged between buyer-facing columns. Ticking the three internal columns drops exactly those positions and leaves the listing fields aligned.
Input (PIM export): SKU,Title,Price,CostPrice,Margin,SupplierID,GTIN A-100,Wireless Mouse,24.99,9.50,0.62,SUP-44,5012345678900 A-101,USB-C Cable,11.99,3.10,0.74,SUP-12,5012345678917 Ticked to remove: CostPrice, Margin, SupplierID Output (<file>.columns-removed.csv): SKU,Title,Price,GTIN A-100,Wireless Mouse,24.99,5012345678900 A-101,USB-C Cable,11.99,5012345678917
Tab-separated Amazon inventory file (delimiter auto-detected)
ExampleAmazon flat-file inventory uploads are tab-separated .txt. The remover auto-detects the tab delimiter on input; the output is comma-delimited. Validate the structure first with the sibling validator if you are re-uploading.
Input (TAB-separated .txt, shown with → as tab): sku→item-name→price→our-cost→supplier B001→Desk Lamp→39.99→14.20→Acme B002→Lampshade→12.49→4.05→Acme Ticked to remove: our-cost, supplier Output (comma-delimited): sku,item-name,price B001,Desk Lamp,39.99 B002,Lampshade,12.49
Free-text InternalNotes containing a comma stays correctly quoted
ExampleIf a column you keep contains a comma, PapaParse quotes it on output so the feed stays well-formed. Removing the notes column avoids the risk entirely — but kept columns with commas are safe either way.
Input: SKU,Title,InternalNotes,Price A-200,"Stapler, heavy duty","Cheaper from SUP-9, renegotiate",18.00 Ticked to remove: InternalNotes Output (Title keeps its comma, re-quoted automatically): SKU,Title,Price A-200,"Stapler, heavy duty",18.00
Targeting a blank-header column
ExampleSome ERP exports leave an unnamed scratch column. It shows in the picker as Col N (1-based label) so you can still remove it.
Input (4th column has no header): SKU,Title,Price,,GTIN A-300,Notebook,4.99,xx-internal,5012345678931 Picker shows: SKU, Title, Price, Col 4, GTIN Ticked to remove: Col 4 Output: SKU,Title,Price,GTIN A-300,Notebook,4.99,5012345678931
Large catalogue: split before removing on the free tier
ExampleA 20,000-SKU feed exceeds both the 2 MB and 500-row free caps. Split it into chunks first (or use Pro), remove the cost columns from each chunk, then re-combine.
Catalogue: 20,000 rows, 4.5 MB → over free limits (2 MB / 500 rows) Free-tier workflow: 1. csv-row-splitter → 40 chunks of 500 rows each 2. csv-column-remover on each chunk → drop CostPrice, Margin 3. csv-merger → recombine into one sanitised feed Pro workflow: 1. csv-column-remover on the full 4.5 MB file (limits removed)
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.
File over 2 MB on the free tier
Blocked (free limit)The free tier caps CSV files at 2 MB. A full product catalogue often exceeds this. Either upgrade to Pro (removes the size limit) or split the feed with csv-row-splitter, remove columns from each chunk, then recombine with csv-merger.
Feed has more than 500 data rows
Blocked (free row limit)Free handles up to 500 data rows per job — the runner shows '...has N rows. Free handles up to 500 rows per job.' and blocks the download. This is separate from the 2 MB size cap; a small-but-long feed can hit it. Pro removes the row limit.
No 'keep only these columns' mode
By designThe tool removes the columns you tick; there is no inverse selection. To trim a 40-column feed down to 5, you tick the 35 you don't want. If most columns are junk, that is a lot of ticking — but it keeps the behaviour unambiguous (you always see exactly what is being deleted).
Two columns share the same header name
SupportedRemoval is positional, not by name, so duplicate headers (Price, Price) are no problem in the UI — each checkbox is a distinct position. The preview labels them by header text, so duplicates look identical; rely on column order to tell them apart.
Output has no BOM and Excel shows mojibake
EncodingrowsToCsv produces plain UTF-8 with no byte-order mark. If you open the result directly in Excel-on-Windows and accented characters (é, ü) garble, that is Excel guessing Windows-1252. Import via Data → From Text/CSV and pick UTF-8, or run the file through a BOM-adding step before opening.
Removing a channel-required column by mistake
RecoverableIf you accidentally tick GTIN and remove it, the source file is untouched — just re-drop the original and re-run with the correct selection. The output is always a new file (<name>.columns-removed.csv), never an in-place edit.
Ragged rows (some rows have fewer columns than the header)
PositionalRemoval filters by index per row. A short row simply has fewer cells to filter; a row that is missing the cell at a removed index loses nothing extra. Output column count per row mirrors the input minus the removed positions. If your feed has structural inconsistencies, validate it first with csv-validator.
You want to mask costs, not delete the column
Use a different toolThis tool deletes whole columns. If you need to keep the column but overwrite the values (e.g. redact but preserve structure for a downstream schema), use csv-find-replace to blank or mask the cells instead.
Frequently asked questions
Does removing a cost column shift my GTIN or price into the wrong cell?
No. Removal is positional and applied to every row uniformly — the tool deletes the selected column positions from the header and each data row in a single pass. The columns you keep retain their exact original values; nothing slides into a neighbouring cell. The preview shows the first 10 rows so you can confirm before downloading.
Can I remove several internal columns at once?
Yes. Tick CostPrice, Margin, SupplierID, and any others, then click Remove N columns. All ticked positions are dropped in one operation. The button stays disabled until at least one column is selected.
Is there a 'keep only these columns' option instead?
No — you tick the columns to remove, not the ones to keep. To reduce a wide feed to a handful of columns, tick everything except the ones you want. The upside is that you always see exactly which columns are being deleted.
Will my supplier costs be uploaded anywhere?
No. Parsing and removal run entirely in your browser via PapaParse; the feed is never sent to JAD Apps servers. The only thing recorded server-side (when signed in) is a single usage counter with no file content.
My feed is a tab-separated Amazon .txt — will it work?
Yes. The input delimiter (comma, tab, semicolon, or pipe) is auto-detected, so a tab-separated inventory .txt is handled the same as a comma CSV. Note the output is always comma-delimited — if Amazon needs tab-separated, convert it back or remove columns before generating the flat file.
What file name does the download use?
The output is saved as <your-original-name>.columns-removed.csv. Your original file is never modified, so keep it as the internal source of truth.
Can I save my column selection as a preset for next month's feed?
Not currently — there is no saved-selection or preset feature. You tick the internal columns fresh each run. For a repeatable pipeline, use the API/runner: it accepts a fixed columns list you can script (see the automation question below).
How big a feed can the free tier handle?
Free accepts files up to 2 MB and up to 500 data rows — whichever you hit first blocks the run. A typical full catalogue exceeds both. Pro removes both limits. On free, split with csv-row-splitter and recombine with csv-merger.
Does it drop empty rows or trim whitespace while removing columns?
No. This tool only removes the columns you select. Empty rows are preserved and cell whitespace is untouched. For those, use csv-empty-row-remover or csv-whitespace-trimmer as a separate step.
What if a column I keep contains commas (like a product title)?
It is handled correctly. On output, PapaParse wraps any field that contains a comma, quote, or newline in double quotes, so "Stapler, heavy duty" stays a single cell. You do not need to do anything special.
Does the output add a UTF-8 BOM for Excel?
No — the output is plain UTF-8 with no BOM. If you double-click it into Excel-on-Windows and see garbled accents, import via Data → From Text/CSV and choose UTF-8, or run it through a BOM-adding step. Most marketplace and Merchant Center importers accept the no-BOM UTF-8 directly.
Can I automate cost-column removal in a nightly feed pipeline?
Yes. Pair the @jadapps/runner once, then POST your feed to 127.0.0.1:9789/v1/tools/csv-column-remover/run with options.columns set to the column names or indices to drop (names match case-insensitively). It returns the sanitised CSV. Typical pipeline: nightly PIM export → runner removes CostPrice/Margin/SupplierID → push to Google Merchant Center. The runner is on-device, so feed data never leaves your machine.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.