Add up stock across all your warehouses.
Feeds list each warehouse on its own. Summarize Data adds them into one number per SKU, so 18 in Reno and 6 in Atlanta become 24.
Stored encrypted and decrypted only while a job is running. Use an IAM user scoped to the bucket below.
Leave empty for a long-lived IAM user key.
Where browsing starts. Leave it empty to start at the top of the bucket. Saved work addresses objects by their full path, so this is a starting point rather than a restriction.
Secure Google OAuth authentication. Your password never reaches DataConverter. Only an encrypted refresh token is stored, and you can revoke access at any time from your Google Account settings.
Opens Google's secure account selection screen
Waiting for Google… Finish signing in using the Google window that just opened.
Closed the Google window?
Reconnect if access was revoked or you need a different account.
Secure Google OAuth authentication. Your password never reaches DataConverter. Only an encrypted refresh token is stored, and you can revoke access at any time from your Google Account settings.
Opens Google's secure account selection screen
Waiting for Google… Finish signing in using the Google window that just opened.
Closed the Google window?
Reconnect if access was revoked or you need a different account.
Watch a supplier's Excel stock feed become a clean JSON with the tools already in Data Prep: one row per SKU, real quantities, and a stock status your store understands.
| # | sku | UPC | Description | Status | code | Qty | NextShipment |
|---|---|---|---|---|---|---|---|
| 1 | KK-1042 | 084213010422 | Cast Iron Skillet, 10 in | In Stock | RNO | 18 | |
| 2 | KK-1042 | 084213010422 | Cast Iron Skillet, 10 in | In Stock | ATL | 6 | |
| 3 | KK-1043 | 084213010439 | Cast Iron Skillet, 12 in | Low Stock | RNO | 2 | |
| 4 | KK-1043 | 084213010439 | Cast Iron Skillet, 12 in | Low Stock | ATL | 0 | |
| 5 | KK-2210 | 084213022104 | French Press, 34 oz | Backorder | RNO | 0 | 2026-11-04 |
| 6 | KK-2210 | 084213022104 | French Press, 34 oz | Backorder | ATL | 0 | 2026-11-04 |
| 7 | KK-3105 | 084213031052 | Chef's Knife, 8 in | In Stock | RNO | 50+ | |
| 8 | KK-3105 | 084213031052 | Chef's Knife, 8 in | In Stock | ATL | 14 | |
| 9 | KK-0877 | 084213008771 | Enamel Dutch Oven, 5.5 qt | Discontinued | RNO | 3 |
| # | sku | UPC | Description | Status | code | Qty | NextShipment | QtyNum |
|---|---|---|---|---|---|---|---|---|
| 1 | KK-1042 | 084213010422 | Cast Iron Skillet, 10 in | In Stock | RNO | 18 | 18 | |
| 2 | KK-1042 | 084213010422 | Cast Iron Skillet, 10 in | In Stock | ATL | 6 | 6 | |
| 3 | KK-1043 | 084213010439 | Cast Iron Skillet, 12 in | Low Stock | RNO | 2 | 2 | |
| 4 | KK-1043 | 084213010439 | Cast Iron Skillet, 12 in | Low Stock | ATL | 0 | 0 | |
| 5 | KK-2210 | 084213022104 | French Press, 34 oz | Backorder | RNO | 0 | 2026-11-04 | 0 |
| 6 | KK-2210 | 084213022104 | French Press, 34 oz | Backorder | ATL | 0 | 2026-11-04 | 0 |
| 7 | KK-3105 | 084213031052 | Chef's Knife, 8 in | In Stock | RNO | 50+ | 50 | |
| 8 | KK-3105 | 084213031052 | Chef's Knife, 8 in | In Stock | ATL | 14 | 14 | |
| 9 | KK-0877 | 084213008771 | Enamel Dutch Oven, 5.5 qt | Discontinued | RNO | 3 | 3 |
| # | sku | UPC | Status | OnHand | NextShipment |
|---|---|---|---|---|---|
| 1 | KK-1042 | 084213010422 | In Stock | 24 | |
| 2 | KK-1043 | 084213010439 | Low Stock | 2 | |
| 3 | KK-2210 | 084213022104 | Backorder | 0 | 2026-11-04 |
| 4 | KK-3105 | 084213031052 | In Stock | 64 | |
| 5 | KK-0877 | 084213008771 | Discontinued | 3 |
| # | sku | UPC | Status | OnHand | NextShipment | Quantity | StockStatus |
|---|---|---|---|---|---|---|---|
| 1 | KK-1042 | 084213010422 | In Stock | 24 | 22 | in_stock | |
| 2 | KK-1043 | 084213010439 | Low Stock | 2 | 0 | out_of_stock | |
| 3 | KK-2210 | 084213022104 | Backorder | 0 | 2026-11-04 | 0 | backorder |
| 4 | KK-3105 | 084213031052 | In Stock | 64 | 62 | in_stock | |
| 5 | KK-0877 | 084213008771 | Discontinued | 3 | 0 | discontinued |
| # | SKU | Barcode | Status | OnHand | RestockDate | Quantity | StockStatus |
|---|---|---|---|---|---|---|---|
| 1 | KK-1042 | 084213010422 | In Stock | 24 | 22 | in_stock | |
| 2 | KK-1043 | 084213010439 | Low Stock | 2 | 0 | out_of_stock | |
| 3 | KK-2210 | 084213022104 | Backorder | 0 | 2026-11-04 | 0 | backorder |
| 4 | KK-3105 | 084213031052 | In Stock | 64 | 62 | in_stock | |
| 5 | KK-0877 | 084213008771 | Discontinued | 3 | 0 | discontinued |
| # | SKU | Barcode | Quantity | StockStatus | RestockDate |
|---|---|---|---|---|---|
| 1 | KK-1042 | 084213010422 | 22 | in_stock | |
| 2 | KK-1043 | 084213010439 | 0 | out_of_stock | |
| 3 | KK-2210 | 084213022104 | 0 | backorder | 2026-11-04 |
| 4 | KK-3105 | 084213031052 | 62 | in_stock | |
| 5 | KK-0877 | 084213008771 | 0 | discontinued |
| Field Name | Type | Value |
|---|---|---|
| QtyNum | Expression | parseInt(replaceString(toString(Qty), "+", "")) |
| Source | Operator | Target | Exclude Nulls |
|---|---|---|---|
| sku | Group By | (Same as Source Field if blank) | |
| UPC | First | (Same as Source Field if blank) | |
| Status | First | (Same as Source Field if blank) | |
| QtyNum | Sum | OnHand | |
| NextShipment | First | (Same as Source Field if blank) |
| Field Name | Type | Value |
|---|---|---|
| Quantity | Expression | iif(Status == "Discontinued", 0, max(0, OnHand - 2)) |
| StockStatus | Expression | iif(Status == "Discontinued", "discontinued", iif(Quantity > 0, "in_stock", iif(Status == "Backorder", "backorder", "out_of_stock"))) |
| # | Field | New Field Name |
|---|---|---|
| 1 | sku | sku |
| 2 | UPC | UPC |
| 3 | Status | Status |
| 4 | OnHand | OnHand |
| 5 | NextShipment | NextShipment |
| 6 | Quantity | Quantity |
| 7 | StockStatus | StockStatus |
UploadOne row per warehouse: 9 rows for 5 items
Add ColumnsQtyNum reads 50+ as 50
Summarize DataSum by sku: one row per SKU
Add ColumnsHold back 2 units and set the stock status
Rename ColumnsUse your store's column names
Select ColumnsKeep five columns, in order
Export JSONstore-inventory.json, ready to import
Supplier feeds split stock across warehouses, label it in words, and leave out restock dates. A normalized feed fixes all of it before your store imports a single row.
Feeds list each warehouse on its own. Summarize Data adds them into one number per SKU, so 18 in Reno and 6 in Atlanta become 24.
Hold back a safety buffer and take discontinued items to zero, so a Low Stock item with 2 left shows as out of stock.
The supplier's next shipment date becomes a restock date your store can show, instead of a plain out of stock.
Export the file your store imports as CSV or Excel, generate SQL insert scripts, or send it straight to Amazon S3. Run the same steps on every feed pull with the API.
Save your transformation steps as a template, post incoming supplier feeds directly to the API, and receive clean JSON files ready for store import.
Explore the APIcurl -X POST "https://dataconverter.io/api/v1/convert/template" \ -H "Authorization: Bearer YOUR_TOKEN_HERE" \ -F "templateId=YOUR_TEMPLATE_ID" \ -F "file=@kestrel-inventory.xlsx" \ --output store-inventory.json✓ 200 OK · store-inventory.json · 1,284 SKUs
Use Summarize Data to Group By SKU and Sum the quantity column. Use First on attributes like status or restock date to keep each item's details.
Use Add Columns expressions. parseInt(replaceString(toString(Qty), "+", "")) reads 50+ as 50, and conditional expressions like iif(...) set stock status directly from counts.
Yes. Save separate templates for each supplier configuration with mapped standard output columns. Every feed converts into a unified catalog structure regardless of supplier formatting differences.
Yes. Barcodes are read as text, so their leading zeros stay.