Ducted

Everything you need to ship a
clean feed, fast

Ducted turns messy product data into platform-ready feeds: map fields, compute values, validate against each channel's spec, and serve always-fresh feed URLs. Here is exactly how, feature by feature.

Your columnsTemplate fields
product_sku100id
product_title100title
short_desc78description
main_image82image_link

Best matches pre-filled

Matching dozens of source columns to each platform's exact field names by hand is slow and easy to get wrong.

Ducted scores every source column against the template and pre-fills the best match, so even a 40-field feed maps in seconds. You just confirm or tweak.

Prebuilt, ready to map
Google ShoppingMeta CatalogChatGPT AdsBing+32 more
Custom templateSaved · reusable
any_fieldyour_namesyour_order+

Every channel has its own spec. The usual routine: dig through docs, guess the field names, submit, then wait for the platform to tell you what is broken.

Start from a prebuilt, ready-to-map template for Google, Meta, ChatGPT, Bing and more. Or build any custom format and save it as your own reusable template. You are never limited to the channels we ship.

Field · sale_discount
{{ MSRP }}-{{ sale_price }}
199.99149.99
50.00

Platforms often want a value you don't store as a column: a discount, a margin, a unit price.

Compute it from the fields you already have with a simple formula. {{ MSRP }} - {{ sale_price }} becomes a clean sale_discount, with currency symbols and EU/US number formats handled for you.

Installment(months:amount:downpayment:credit_type:apr)
{{months}}:{{amount}}USD:{{downpayment}}USD:finance:{{apr}}
36:250.00 USD:1000.00 USD:finance:2.00
MappedHardcoded

Some fields are part fixed format, part data, like a VLA installment string that has to read exactly 36:250.00 USD:1000.00 USD:finance:2.00.

Compose it once by mixing hardcoded literals with mapped tokens. The : separators, the USD units, and the finance credit type stay fixed; the numbers come straight from your data.

Sample · inventory = 0 · restock_date = 2026-08-15
IFinventory > 0in stock
ELIFrestock_date is not emptyComing {{restock_date}}
ELSEotherwiseout of stock

Availability, condition, and labels shouldn't be columns you maintain by hand for every product.

Derive them with if / else rules. If stock is above zero, output 'in stock'; if a restock date exists, 'Coming {{restock_date}}'; otherwise 'out of stock'. First match wins.

Transform pipeline
"  red  T-SHIRT "
normalize_whitespace
title_case
"Red T-Shirt"

Source data is messy: stray whitespace, inconsistent casing, raw numbers where the platform wants currency.

Chain transforms to clean it up. red T-SHIRT becomes Red T-Shirt; 1500.5 becomes €1,500.50. Stack as many steps as you need, applied in order.

Mapping · availabilityRow 3 / 50
stock_statuslowercasein_stock
Accepted values
in_stockout_of_stockpreorder
1 of 4 sample rows outside accepted list

Most feed tools only tell you something is wrong after the platform rejects the whole file, days later.

Ducted resolves your mapping against real sample rows as you edit, shows every transform step, and flags values outside a field's accepted list or format on the spot. Fix it before you ever publish.

1,250records⚠ 3 issues○ 1 recommendation
15 records missing required title
42 records invalid image URL
8 records invalid availability value
Email alert sent · feed health dropped

Live feeds drift. A supplier drops a column, image URLs rot, required fields go missing, and you find out when your ads get disapproved.

Every feed is continuously scored for missing required fields, invalid values, broken URLs, and duplicates. A health badge surfaces issues and email alerts warn you the moment quality drops.

Group 1 · all must match
availability contains "stock"price > 10price < 100
OR
Group 2 · all must match
status = "featured"
1,250740 records

You rarely want your entire catalog in every feed: only in-stock items, a price band, a brand, a category.

Build precise rules with grouped conditions. Conditions inside a group are AND-ed, groups are OR-ed, so you can express 'in stock and 10 to 100, or anything featured' and ship only the records that qualify.

Source 1 · catalog
skutitleprice
Source 2 · costs
skucostsupplier
joined on sku
Merged feed
skutitlepricecostsupplier

The full product picture is usually split up: catalog in one export, costs in another, live stock in a third.

Join them on a shared key into one feed. Match on sku and every record picks up its cost, supplier, and stock, with no spreadsheets or VLOOKUP.

The details that keep feeds clean

Smaller tools that quietly save time once your feeds are live.

Any source format

Upload CSV, TSV, XML/RSS, JSON, or XLSX, or point to a URL. Shopify, WooCommerce, and BigCommerce shapes are detected automatically.

Field fallbacks

When a field is empty, fall back to another field or a default value, so a missing sale price quietly drops to the regular price instead of going blank.

Regex transforms

Flexible, regex-driven find-and-replace for the cases simple transforms cannot reach.

Transform presets

Multi-step transform chains saved as one-click presets for your common formatting tasks.

Project global fields

Reusable values like store code or fulfillment settings, available to every feed in the project.

Live URLs & formats

Permanent feed URLs in CSV, JSON, and XML, ready to plug into any platform or integration.

Scheduled & smart refresh

Refresh on a schedule, and detect source changes by ETag or content hash so feeds stay fresh.

Sold & removed tracking

Products that leave your source are kept in a separate feed, so nothing silently disappears.

Duplicate & rotate

Clone a feed's full setup in one click, and regenerate public tokens whenever you need to.

See it work on your own data

Create a free account, connect a source, and map your first feed in minutes. No payment information required.

Get started free →Compare plans