September 2026
New connectors
Workday Financial Management
Workday Financial Management is now available as an ELT source, syncing 2 tables (45 including subtables) covering purchase orders and receipts. Both tables sync incrementally based on last updated date.
2 total changes
| Table/column | Change type | Notes |
|---|---|---|
purchase_order | New table | Incremental. Includes 29 subtables. |
receipt | New table | Incremental. Includes 14 subtables. |
Connections authenticate with OAuth (an API client for integrations) or an integration system user and password.
Storepoint
Storepoint is now available as an ELT source, syncing store locator locations and their custom field definitions.
4 total changes
| Table/column | Change type | Notes |
|---|---|---|
location | New table | |
custom_field | New table | |
location | ||
location_tag | New subtable | |
location_custom_field | New subtable | |
Connections authenticate with an API key from the Storepoint Developer Portal.
Explore Storepoint documentation →
Claimlane
Claimlane is now available as an ELT source, syncing 10 tables (27 including subtables) covering retailers, suppliers, B2B and B2C claim tickets, and raw data exports for warranty and returns management.
5 total changes
| Table/column | Change type | Notes |
|---|---|---|
retailer | New table | Full sync. |
supplier | New table | Full sync, with supplier_brand and supplier_brand_product_identification subtables. |
b2b_ticket | New table | Incremental, synced per supplier so a run that fails partway through doesn't replay the suppliers it already finished. Eight subtables cover claim products and their tags and statuses. |
b2c_ticket | New table | Full sync, since a consumer ticket's status, refunds, and shipping lines keep changing after it is created. Nine subtables cover products, refunds, parts, and shipping lines. |
raw_b2b_product_data, raw_b2b_workload_data, raw_b2c_agent_data, raw_b2c_product_data, raw_b2c_product_part_data, raw_b2c_workload_data | New table | One table per Claimlane raw data export type, keyed on a checksum of the row since raw exports have no id. |
Connections authenticate with an API key. Because most endpoints are scoped to a retailer or supplier organization, the connection settings include an organization picker; leaving it empty syncs every organization the key can see.
Explore Claimlane documentation →
b2b_ticket needs at least one supplier in reach to sync. Connections that
can only see retailers can still use every other table.
Walmart
Walmart Marketplace is now available as an ELT source, syncing 57 tables covering the catalogue, inventory, orders, returns, feed submissions, pricing, payments, shipping settings, WFS inbound shipments, and listing quality.
Connections authenticate with the Client ID and Client Secret from Seller Center's API Key Management page (Walmart's Direct API integration). Weld exchanges them for a short-lived access token on every run, so there is nothing to re-authorize as long as the key pair stays valid.
Catalogue and inventory
5 total changes
| Table/column | Change type | Notes |
|---|---|---|
item | New table | Full sync of the seller's items, including price, publishing status and variant grouping. The shelf column arrives as a JSON-encoded string from Walmart, so it is stored verbatim. |
item_unpublished_reason | New table | |
item_variant_group_attribute | New table | |
inventory | New table | Multi-node inventory for every SKU and ship node, so no per-SKU lookup is needed. |
inventory_node | New table | Ship node quantities land as *_amount / *_unit column pairs. |
Orders and returns
21 total changes
| Table/column | Change type | Notes |
|---|---|---|
order | New table | Incremental on last modified date. |
order_line | New table | |
order_line_charge | New table | |
order_line_status | New table | |
order_line_refund_charge | New table | |
order_line_serial_number | New table | |
order_payment_type | New table | |
return | New table | Incremental on return last modified date. |
return_order_line | New table | |
return_order_line_charge | New table | |
return_order_line_charge_tax | New table | |
return_order_line_charge_reference | New table | |
return_order_line_charge_total | New table | |
return_order_line_tracking_status | New table | |
return_order_line_refund_channel | New table | Carries refund_covered_by, which is what Walmart actually returns for the refund channel. |
return_order_line_tracking_detail | New table | |
return_order_line_tracking_detail_reference | New table | |
return_line_group | New table | |
return_line_group_line | New table | |
return_line_group_label | New table | |
return_line_group_label_carrier | New table |
Walmart only returns orders created in the last 180 days, so a sync configured with a longer lookback still gets 180 days of order history. Returns have no such limit.
Feeds, pricing and payments
7 total changes
| Table/column | Change type | Notes |
|---|---|---|
feed | New table | Catalogue and price feed submissions, incremental on the feed's modified date. |
feed_item | New table | Per-item ingestion status within the feed file. |
feed_item_ingestion_error | New table | |
pricing_insights | New table | Buy Box win rate, competitor and comparison prices, and repricer settings per SKU. |
price_incentive | New table | Both eligible and enrolled incentives. |
payment_statement_report | New table | The current cycle's payment statement. Appended once per sync rather than replaced, since the snapshot carries no key of its own and Walmart does not return earlier cycles. |
recon_report | New table | Settlement reconciliation files, incremental by settlement date rather than run time, so files Walmart publishes days after the period they cover are not skipped. |
Shipping settings and inbound shipments
18 total changes
| Table/column | Change type | Notes |
|---|---|---|
shipping_template | New table | The template list: name, type, rate model and status. |
shipping_template_details | New table | The full template, fetched only for templates whose modified date moved since the last sync. A template Walmart returns without a modified date is always fetched rather than skipped. |
shipping_template_fulfillment_center | New table | |
shipping_template_method | New table | |
shipping_template_configuration | New table | |
shipping_template_address_type | New table | |
shipping_template_tiered_charge | New table | |
shipping_template_region | New table | |
shipping_template_sub_region | New table | |
shipping_template_state | New table | |
shipping_template_state_subregion | New table | Every ancestor key is repeated at each level, so a state subregion row joins straight back to its template. |
shipping_configuration | New table | The seller's shipping profile. |
shipping_configuration_setting | New table | |
shipping_configuration_category | New table | |
shipping_coverage | New table | Ship node coverage. |
shipping_coverage_area | New table | |
inbound_shipment | New table | WFS inbound shipments. Synced in full on every run rather than incrementally, because Walmart filters only on creation date while a shipment keeps changing status for weeks afterwards. |
inbound_shipment_tracking_number | New table |
Listing quality
6 total changes
| Table/column | Change type | Notes |
|---|---|---|
listing_quality_score | New table | The account-wide listing quality score. Walmart only ever returns today's score, so each sync appends a row instead of replacing the last one, making the table a trend line ordered by _weld_synced. |
listing_quality_item | New table | Per-item listing quality, including GMV, conversion rate and post-purchase issues. |
listing_quality_item_score | New table | The component scores behind the item's overall score. |
listing_quality_item_content_issue | New table | Content and discoverability issues on the listing. |
listing_quality_item_trend | New table | |
listing_quality_item_trend_value | New table | A 30-day daily series per item per statistic. |
payment_statement_report and listing_quality_score append rather than
replace, and both are protected from a full refresh: their history cannot be
re-read from Walmart, so a full sync would throw it away.
Explore Walmart documentation →
QRFY
QRFY is now available as an ELT source, syncing QR codes, folders, and scan analytics from the QR code generator platform.
3 total changes
| Table/column | Change type | Notes |
|---|---|---|
qr | New table | Includes subtables for the per-type data (one of 22 QR types, e.g. url, vcard, wifi) and the design style, rather than flattening them onto the qr row. |
folder | New table | |
analytics | New table | Incremental scan report, deduplicated on scan_url, date, and a few dimensions since rows carry no QR id. |
Connections authenticate with an API key.
New features
Filter the Usage by source table chart
The Usage by source table chart on the Usage page now has a Filter source tables… search box. Search across every table's integration and name to narrow the chart down to one integration or a single table, and clear the filter with one click. The filter is client-side, so it applies instantly and survives switching the usage period, staying cleared if the new period has no matching rows.
Usage by source table chart: sub-table rows
The Usage page's "Usage by source table" chart can now show sub-table rows. Turn on Include sub tables in the chart's header to add a grey "Sub tables" segment to each table's bar.
Sub-table rows are not billed and are not included in any other total. The tooltip shows them as a separate "Sub tables · not billed" row, with a dash instead of a count in the active rows column.
Days before September 25, 2026 don't have a per-table breakdown yet, so until the selected period moves past them, the tooltip shows one "Not broken down by table" line for those days instead.
No action required. The toggle is off by default and nothing on the chart changes unless you turn it on.
Read more about monitoring usage →
Custom full sync schedules for incremental tables
Tables that sync incrementally can now run their periodic full sync on a custom schedule, instead of only at midnight. Pick any cron schedule, for example every Sunday or on the first day of each month, and the next run landing at or after that time runs as a full sync instead of an incremental one.
The schedule doesn't add extra runs of its own, so it can't make a table sync more often than its configured sync interval. A schedule set more frequently than that interval turns every run into a full sync.
In the app, a table's options menu replaces the old "Full sync at midnight" checkbox with a schedule picker, the same one used for custom sync schedules. Its badge shows the schedule's frequency, for example "Full sync every day". A table already using "Full sync at midnight" migrates to the equivalent daily schedule the next time it's saved.
Configuring syncs over the Weld Connect API or the MCP server? The setting is full_sync_schedule on a stream. The previous full_sync_at_midnight flag is deprecated: setting it now stores the equivalent 0 0 * * * schedule, and it keeps working exactly as before.
Turning on Capture deletes for a table that syncs incrementally now requires a full sync schedule, since deletes are only reconciled on a full sync. Existing tables are unaffected.
Orchestration overview: sorting, contents, and a disabled filter
The orchestration overview now sorts workflows alphabetically, treating leading numbers numerically so "2. Klaviyo Sync" sorts before "10. Shopify Sync" instead of after it. Each workflow's card also gets a line summarizing what it contains, for example how many models, source tables, reverse ETL syncs, and webhooks it runs. A new toggle lets you hide disabled workflows, and only appears once you have at least one disabled workflow to hide.
Capture deletes (Beta)
This feature is in Beta. A table's full syncs can now keep the rows the source stops returning, instead of the sync silently removing them from your destination table. Turn on Capture deletes in the table's settings menu, just above History tables, and rows the source drops on the next full sync are marked with _weld_deleted_at rather than deleted — so they stay queryable for auditing or point-in-time analysis. A row that comes back is unmarked again. See Capture deletes for the full guide.
Only a small set of tables can capture deletes today. The option needs a full sync that reads a complete snapshot of the source, so it appears on only a handful of the tables Weld offers. We are adding support table by table — Google Ads is the first connector to get it.
Within Google Ads, it is the predefined dimension reports (e.g. campaign, ad_group, ad) and their bidding strategy and criterion substreams that qualify, so a full sync marks the entities the account no longer returns instead of dropping the rows. Time-based reports keep reconciling per report window, and custom reports built from your own query are unaffected.
Your data warehouse has to support it too. Capture deletes works on BigQuery, Snowflake, Redshift, Postgres, MSSQL, and MotherDuck.
Configuring syncs programmatically? The same setting is soft_delete_enabled on a stream over the Weld Connect API and the MCP server, and both capabilities are readable before you turn it on: soft_delete_supported per stream from get_elt_sync_available_streams, and the data warehouse's support from GET /data_warehouse or the MCP get_account tool.
No action required. Capture deletes is off by default and only changes behavior on the tables you explicitly turn it on for.
Error markers in the SQL editor
A failed preview now places an error marker on the line the warehouse blamed, right in the SQL editor, instead of only showing its message in the bottom pane. The marker follows the SQL as you keep editing: changing the line it blamed clears the marker, editing elsewhere repositions it, and undoing back to the failing query brings it back.
The marker spans the whole line rather than a single column, since the warehouse counts columns into the SQL Weld actually sent, after Weld's own {{tag}} references have already been substituted.
The editor can now also validate your SQL against the warehouse while you type, marking the offending line before you ever run the query. Validation is debounced to a typing pause and cached by SQL text, and runs the query as a free dry run or EXPLAIN rather than actually executing it. If the SQL is valid, any leftover marker from an earlier failed run is cleared.
Explanations for quarantined syncs
When a sync stream is quarantined, Weld now generates a plain-language explanation of what happened, instead of showing the raw underlying error. The card also lists suggested next steps as controls you can act on directly, such as re-authenticating a connection, adjusting a sync's incremental settings, reducing its sync frequency, or contacting support with the affected table already noted.
When the cause is on Weld's side rather than something in your setup, the card states that no action is needed instead of suggesting self-serve fixes that would not help.
No action required. This is an explanation and UI improvement; existing quarantine detection and retry behavior are unchanged. If an explanation isn't available for a quarantined stream, the raw error is still shown.
Identifier casing for Snowflake
Snowflake resolves an unquoted identifier to its upper-case form, and Weld quotes every name it writes, so a table created as "orders" could only ever be queried quoted. You can now have Weld create schemas, tables and columns in upper case instead:
select id from hubspot.orders
Turn on Create tables and columns in upper case under Advanced when you connect Snowflake, or later on the Data Warehouse settings page, to set the default for new syncs. Individual syncs can override it next to the destination schema name when you create them. Over the API, send identifier_casing on POST /elt_syncs and read or change the default on /data_warehouse.
The casing is fixed when a sync is created and cannot be changed afterwards, because "orders" and "ORDERS" are two different objects in Snowflake. Changing the warehouse default only affects syncs created after the change.
To move an existing sync to upper case, create a new sync with the setting turned on and repoint your models at it.
No action required. The setting is off by default, and existing syncs keep landing names exactly as the source produces them.
Read more about identifier casing →
Connector updates
Recurly: Transactions, line items and credit payments now sync as dedicated streams
transaction, invoice_line_item and credit_payment were previously only available as arrays embedded in the invoice payload. That meant records that don't belong to any invoice, such as declined transactions and pending line items, were unreachable, and invoice_line_item was capped at 200 items per invoice. These now sync as their own site-level streams, pulled directly from Recurly's /transactions, /line_items and /credit_payments endpoints with full pagination, so the 200-item cap is gone and previously unreachable records are included. A record that appeared under two invoices, for example a credit payment applied to a different invoice than the one it was issued on, is no longer duplicated, and parent_invoice_id is now populated from the record's own original invoice instead of whichever invoice happened to be iterated.
5 total changes
| Table/column | Change type | Notes |
|---|---|---|
transaction | New table | Site-level stream. Previously only reachable via invoice, missing declined and pending transactions. |
invoice_line_item | New table | Site-level stream. No longer capped at 200 items per invoice. |
credit_payment | New table | Site-level stream. No longer duplicated when applied to a different invoice. |
parent_invoice_id | Updated | Now populated from the record's own original invoice instead of the iterated invoice. |
transaction | ||
transaction_subscription | Updated | Moved with its parent stream. |
Existing Recurly syncs are not automatically upgraded. The transaction,
invoice_line_item and credit_payment streams need to be added to a sync
(contact Weld support) before they start syncing. Each stream does a full
initial sync once added, which backfills the previously unreachable records.
Facebook Ads: labeled month-anchored rolling windows
The custom report's rolling window option now correctly labels a 12m value as "Last 12 months (one row per month)" instead of misreading its m suffix as a day count. Day windows (e.g. 7, 14, 28, 30) now sort ahead of month windows in the dropdown, rather than in the backend's alphabetical-ish enum order.
The help text now also covers month windows, including which date each kind is keyed on: a day window is keyed on the window's end date, while a month window is keyed on its start date, since the running month's end date moves until the month closes.
No action required. Existing day-based rolling windows are unaffected.
Shopify: Company locations now include catalogs assigned through a market
The company table's locations.catalogs now includes catalogs assigned through a market and not just those assigned directly to a company location. Previously, a market-assigned catalog was missing entirely from every location it should have covered.
Each catalog now also carries a catalog_type column (COMPANY_LOCATION or MARKET) so you can tell how it was assigned.
This requires the read_markets access scope, so existing Shopify connections need to be re-authenticated once before market catalogs start appearing. Until then, company location catalogs are unaffected.
1 total change
| Table/column | Change type | Notes |
|---|---|---|
company | ||
locations.catalogs.catalog_type | New Column | COMPANY_LOCATION or MARKET, depending on how the catalog was assigned. |
Stripe: New meter_event_summary table
Stripe gains a meter_event_summary table, syncing daily usage for items billed through Billing Meters, which have no legacy usage records that the existing usage_record table can read. Each row pairs a meter with a customer who ever had a subscription, so usage stays available even after a metered item is removed or replaced. Days with zero usage are dropped.
1 total change
| Table/column | Change type | Notes |
|---|---|---|
meter_event_summary | New table | Full sync only. |
TikTok Shop: statement_transaction_report table is now incremental
The statement_transaction_report table now syncs incrementally, instead of re-reading every statement and all of its transactions on every run.
1 total change
| Table/column | Change type | Notes |
|---|---|---|
statement_transaction_report | Updated | Now syncs incrementally. |
Unleashed: Product attributes, plus fixes for several always-null columns
Unleashed product attributes now sync to a new product_attribute subtable, with one row per attribute value on each product, keyed by product_guid and guid.
A handful of columns always synced as null. They've been replaced by correctly populated columns: sell_price_tier1_name through tier10_value on product became sell_price_tier_1_name through tier_10_value, salesperson_* on sales_order, customer, and sales_quote became sales_person_*, credit_number on credit_note became credit_note_number, delivery_street_address2 on sales_order, purchase_order, and sales_shipment became delivery_street_address_2, and total_cost/total_line_cost on bill_of_materials_line became unit_cost/line_total_cost. The old, always-null columns are left in place alongside the corrected ones.
Several fields that were previously missing are now synced too, including due_date and average_landed_price_at_time_of_sale on sales_order_line, line_tax_code on sales_invoice_line, total_cost and audit fields on bill_of_materials, exchange_rate and bc_tax_total on credit_note, currency fields and default_cc on supplier, xero_tax_code on purchase_order, and is_purchase_default/is_sales_default on tax.
Two new tables round this out: assembly_status and sales_order_status, both keyed by name.
No action required. Incremental tables pick up the corrected and added
columns on records changed after this update; full-sync tables, including
product for most accounts, pick them up on their next run.
8 total changes
| Table/column | Change type | New name | Notes |
|---|---|---|---|
product | |||
product_attribute | New subtable | ||
column | New Column | sell_price_tier_1_name … sell_price_tier_10_value | Corrects sell_price_tier1_name … tier10_value, which synced as null; the old columns remain, now unused. |
assembly_status | New table | ||
sales_order_status | New table | ||
sales_order, customer, sales_quote | |||
column | New Column | sales_person_* | Corrects salesperson_*, which synced as null. |
credit_note | |||
column | New Column | credit_note_number | Corrects credit_number, which synced as null. |
sales_order, purchase_order, sales_shipment | |||
column | New Column | delivery_street_address_2 | Corrects delivery_street_address2, which synced as null. |
bill_of_materials_line | |||
column | New Column | unit_cost, line_total_cost | Corrects total_cost and total_line_cost, which synced as null. |
Microsoft Ads: Capture deletes on account, ad, ad_group, budget, campaign, keyword, and label
Microsoft Ads' account, ad, ad_group, budget, campaign, keyword, and label tables can now use Capture deletes.
This also fixes a related Google Ads issue: a run that queried every configured account was treating itself as authoritative for the whole table, so removing an account from the sync could get that account's rows marked deleted on the next full sync even though the source never reported them removed. A run's Capture deletes scope is now always just the accounts it actually queried, on both connectors. See Bug fixes below.
No action required. Capture deletes stays off until you turn it on for a table.
NetSuite: Capture deletes on SuiteQL tables and Deleted record table
NetSuite's SuiteQL tables can now use Capture deletes: transaction, transactionline, transactionaccountingline, entity, item, inventorynumberlocation, accounttype, and accountingperiodfiscalcalendars all mark rows the source stops returning with _weld_deleted_at on their next full sync instead of dropping them.
NetSuite also gains a deletedrecord table, syncing its deletion log incrementally, keyed by recordtypeid and recordid. It records whole deleted records, so a deleted transaction shows up keyed by its id, but it cannot capture deleted transaction lines: NetSuite removes a line outright and never logs it. Since it is already a deletion log, deletedrecord doesn't use Capture deletes.
This also fixes SuiteQL paging for every NetSuite sync, not just ones with Capture deletes turned on. Paging previously fetched pages by offset, so a row modified while a page was being read could move to the end of the sort order, and the next offset-based page then skipped whatever took its place. Paging now resumes after the last row read instead of by offset.
1 total change
| Table/column | Change type | Notes |
|---|---|---|
deletedrecord | New table | NetSuite's deletion log. Cannot capture deleted transaction lines, which NetSuite removes without logging. |
Recurly: Invoice line item discount subtable
Recurly's invoice_line_item table gains an invoice_line_item_discount subtable, carrying the amount each coupon redemption discounted on that line item.
1 total change
| Table/column | Change type | Notes |
|---|---|---|
invoice_line_item | ||
invoice_line_item_discount | New subtable | |
Recurly: New discount column on invoices
Recurly's invoice table gains a discount column, alongside the existing discounted column.
1 total change
| Table/column | Change type | New name | Notes |
|---|---|---|---|
invoice | |||
column | New Column | discount | |
Recurly: Coupon redemption table
Recurly gains a coupon_redemption table. Since there is no site-level endpoint for redemptions, it is fetched per account and covers both account-level and subscription-level redemptions. A new invoice_coupon_redemption subtable on invoice links each redemption to the invoices it discounted.
2 total changes
| Table/column | Change type | Notes |
|---|---|---|
coupon_redemption | New table | |
invoice | ||
invoice_coupon_redemption | New subtable | Carries the discounted amount for that invoice. |
NetSuite: Five new SuiteAnalytics tables
NetSuite gains five tables from its SuiteQL / SuiteAnalytics schema, which have no REST record behind them. transactionaccountingline carries the GL account and debit/credit per transaction line, which is what a trial balance, P&L, or balance sheet is built from. entity and item are the union tables behind the per-type records (customer, vendor, inventory item, and the rest). accounttype and accountingperiodfiscalcalendars are small reference tables with no modified date, so they sync in full on every run.
5 total changes
| Table/column | Change type | Notes |
|---|---|---|
transactionaccountingline | New table | The GL account and debit/credit per transaction line, needed for a trial balance, P&L, or balance sheet. |
entity | New table | |
item | New table | |
accounttype | New table | Reference table, synced in full on every run. |
accountingperiodfiscalcalendars | New table | Reference table, synced in full on every run. |
QuickBooks: Bill enrichment, linked transactions, and expense line fixes
QuickBooks's bill table now carries its doc_number, private_note, home_balance, exchange_rate, vendor address, and last-modified-by and sales term references. A new bill_linked_txn table syncs the transactions linked to a bill, such as its payment, and both expense line subtables gain their own linked transaction subtable for the same purpose at the line level.
Expense lines also gain a project_ref column, and bill_account_based_expense_line rows now include their amount, which the line's schema previously left out.
13 total changes
| Table/column | Change type | New name | Notes |
|---|---|---|---|
bill | |||
column | New Column | doc_number | |
column | New Column | private_note | |
column | New Column | home_balance | |
column | New Column | exchange_rate | |
column | New Column | vendor_addr | Vendor address fields. |
column | New Column | meta_data_last_modified_by_ref | |
column | New Column | sales_term_ref | |
bill_linked_txn | New table | The transactions linked to a bill, such as its payment. | |
bill_account_based_expense_line | |||
bill_account_based_expense_line_linked_txn | New subtable | ||
column | New Column | amount | |
column | New Column | project_ref | |
bill_item_based_expense_line | |||
bill_item_based_expense_line_linked_txn | New subtable | ||
column | New Column | project_ref | |
QuickBooks: Vendor credit table
QuickBooks now has a vendor_credit table, syncing vendor credits with their account details, tax details, and metadata. Line items sync into vendor_credit_account_based_expense_line and vendor_credit_item_based_expense_line subtables, matching how expense lines are already split for other QuickBooks transaction tables.
3 total changes
| Table/column | Change type | Notes |
|---|---|---|
vendor_credit | New table | |
vendor_credit | ||
vendor_credit_account_based_expense_line | New subtable | Expense lines coded directly to an account. |
vendor_credit_item_based_expense_line | New subtable | Expense lines coded to a product or service item. |
Criteo: Ad sets, campaign IDs on statistics reports, and a wider primary key
Criteo now has an adset table. Ad sets sit between campaigns and ads.
The adset_statistics_daily_report table is new, and the existing ad_statistics_daily_report table now also carries adset_id and campaign_id on every row, so ads, ad sets, and campaigns can all be connected without a join. Requesting these id columns also brings back their names, so all three statistics reports now expose readable campaign, adset, and ad name columns alongside the ids.
5 total changes • 1 possible breaking change
| Table/column | Change type | Notes |
|---|---|---|
adset | New table | Includes a subtable for scheduled budgets. |
adset_statistics_daily_report | New table | |
ad_statistics_daily_report | ||
adset_id, campaign_id, campaign, adset, ad | New Column | Adds the ad set and campaign hierarchy, plus readable names, to each row. |
primary key | Updated | Now ad_id, adset_id, campaign_id, date (previously ad_id, date). |
campaign_statistics_daily_report | ||
campaign | New Column | Readable campaign name alongside campaign_id. |
Traede: Delivery and invoice addresses on orders
The order stream now syncs the delivery and invoice addresses as delivery_* and shop_* columns (12 fields each: name, attention line, address lines, zip, city, region, country, email, telephone, VAT, and EAN). shop is Traede's include name for the invoice address; Weld surfaces it as shop_* to stay true to the API rather than colliding with a real invoice include if Traede ever adds one.
These addresses were previously unavailable: the earlier attempt used include names (addresses, delivery_address) that Traede's supported v10 API rejects with a 422. All fields are nullable, since not every order carries a full address.
2 total changes
| Table/column | Change type | Notes |
|---|---|---|
order | ||
delivery_name, delivery_att, delivery_address, delivery_address_2, delivery_zip, delivery_city, delivery_region, delivery_country, delivery_email, delivery_telephone, delivery_vat, delivery_ean | New Column | Delivery address fields. |
shop_name, shop_att, shop_address, shop_address_2, shop_zip, shop_city, shop_region, shop_country, shop_email, shop_telephone, shop_vat, shop_ean | New Column | Invoice address fields (Traede's shop include). |
No action required. Existing syncs pick up the new columns automatically.
HiBob: Employment history stream, richer employee data, and custom fields
HiBob now has an employee_employment_history stream, syncing every employment change (contract, working pattern, salary type, and similar terms) with its own effective date, instead of only the employee's current employment terms.
The employee stream itself now syncs many more fields: employment terms (contract, type, FTE, weekly hours, salary pay type, FLSA code, working pattern), lifecycle status and termination details, work address, salary, and personal fields such as pronouns and nationality, each alongside HiBob's human-readable version of the value where one exists.
Custom fields, whose ids are tenant-specific (e.g. about.custom.field_1724744461985), now sync as dedicated employee_custom_fields and employee_payroll_custom_column tables keyed by field name instead of being dropped. Employment history entries carry their own custom columns the same way, via employee_employment_history_custom_field.
5 total changes
| Table/column | Change type | Notes |
|---|---|---|
employee_employment_history | New table | One row per employment change, including contract, working pattern, and salary type. |
employee | Updated | Syncs many more fields: employment terms, lifecycle, work address, salary, and personal fields. |
employee_employment_history | ||
employee_employment_history_custom_field | New table | |
employee | ||
employee_custom_fields | New table | |
employee_payroll_custom_column | New table | |
The time_off stream now also requests up to two years into the future and includes pending requests, so upcoming and pending time off show up alongside approved past and current entries.
Fortnox: Vouchers stream is now incremental
The vouchers stream now syncs incrementally based on each voucher's last modified date, instead of doing a full resync of all financial years on every run. Updates to existing vouchers are picked up without re-reading the full history each time.
1 total change
| Table/column | Change type | Notes |
|---|---|---|
vouchers | Updated | Now syncs incrementally based on last modified date. |
Cargoson: Bookings stream
Cargoson now supports a bookings stream. Instead of paginating Cargoson's booking API, the stream reads the booking references you already hold in a table or view in your data warehouse and resolves each distinct reference against the Cargoson API, including its packages, containers, package units, and ADR (dangerous goods) rows.
5 total changes
| Table/column | Change type | Notes |
|---|---|---|
bookings | New table | Reads booking references from a warehouse table or view you select in the connection settings. |
bookings | ||
booking_rows | New table | Packages on the booking. |
booking_containers | New table | Containers on the booking. |
booking_package_units | New table | Package units (e.g. SSCC) on the booking. |
booking_rows | ||
booking_row_adr_rows | New table | ADR (dangerous goods) rows on a package. |
Select the table or view holding your booking references, and the column with the booking id, in the connection settings. Only distinct, non-empty values are looked up.
No action required. The bookings stream is opt-in and existing
services and parcel_machines syncs are unaffected.
Platform
Redshift: Multiple data integrity and reliability fixes
A round of fixes for issues that only surface once a Redshift destination handles a real workload:
- Text columns are now created as
varchar(max)instead ofvarchar(256), so loading a longer value no longer fails theCOPY. - Incremental syncs on a table without a unique primary key no longer fail with a
MERGEerror. - Column and table names that are reserved words (like
orderorgroup) are now quoted correctly in generated SQL. - Column names longer than Redshift's identifier limit no longer load as
NULL; the loader now matches the truncated name Redshift actually stores. - Schema comparisons are now case-insensitive, so a mixed-case column is no longer re-added on every sync.
- Models built on Redshift late-binding views now read their columns correctly instead of appearing column-less.
This work also fixed a shared bug in the code used by PostgreSQL destinations, which reported every column as non-nullable regardless of its actual schema.
No action required. These fixes apply automatically to existing Redshift and PostgreSQL destinations.
Weld Connect API and MCP server: tables now report if they've been retired
GET /elt_syncs/{id}/available_source_streams (and get_elt_sync_available_streams) now flag a retired table that's already part of the sync with retired: true and retirement_details, matching what the app already shows. A retired table that isn't part of the sync is still left out of the list.
Every table on an ELT sync (source_streams on the sync response) now carries the same retired and retirement_details fields, across REST, MCP, and the back-office MCP.
No action required. The new fields are additive and existing integrations are unaffected.
Weld Connect API and MCP server: primary key columns can no longer be excluded
The Weld Connect API and MCP server now reject any stream whose excluded_columns includes one of its primary key columns, the same way the app already does.
GET /elt_syncs/{id}/available_source_streams (and get_elt_sync_available_streams) now also return a primary_keys field so you can see which columns to avoid excluding before adding a stream.
History tables now seed from existing data when enabled
Turning on the history table for a stream that was already syncing previously only captured changes from that point forward. Any row whose last change predated enabling history had no entry in __history at all, and stayed missing until it happened to change again, so a slow-moving table could leave most of its rows absent from history.
__history is now seeded from the current main table the first time it's created, so the full existing dataset is captured immediately instead of waiting on future changes. This also repairs a __history table that was deleted after being created. Supported for BigQuery, Snowflake, Postgres, Redshift, MSSQL, ClickHouse and MotherDuck destinations.
No action required. Seeding happens automatically the next time history is
enabled on a stream, or on a run where the __history table is missing.
ClickHouse: Incremental schema changes
Schema changes on a ClickHouse destination no longer force a full resync of the table. Weld now applies the same schema changes incrementally as it does for other destinations: adding a subschema, adding or removing a field (nullable or required), and changing a field's nullability in either direction.
Type changes still require a full resync, since ClickHouse can only convert between compatible column types and doing so rewrites the whole table.
No action required. Existing syncs pick up incremental schema changes automatically.
Bug fixes
- Fixed Facebook Ads custom reports with a weekly, bi-weekly, or monthly aggregation writing duplicate, overlapping partial-period rows alongside the full ones after a backfill, which double counted metrics on any full-table
SUM. New and refreshed syncs no longer produce these overlapping rows, and previously affected tables have been refreshed. - Fixed Facebook Pages syncs crashing with a generic error when a page was no longer accessible (unshared, deleted, or the authorizing user lost admin access). Affected tables now pause with a plain-language message explaining what happened and a link to reconnect.
- Shopify custom report validation now shows a
Validating...loading state on the Validate button and disables it until the result comes back, matching the pattern used by Reddit, Facebook, and GA4 custom reports. Previously a slow validation gave no feedback, so customers would click again and pile up extra requests against Shopify'sShopifyQLrate limit. - Fixed tooltips on the usage charts getting clipped by the chart's scroll container, and a tooltip staying visible after the cursor left the chart quickly. Fixed total labels sometimes missing from bars that include a History segment. The Destination objects chart now uses the same color as the Reverse ETL segment on other usage charts.
- Fixed a hang in the query error panel: resolving which raw views a failed query depends on could take a very long time on workspaces with heavily shared model lineage, freezing the tab.
- Fixed Klaviyo, Cargoson's
bookingstable, and TikTok Shop'sstatement_transaction_reporttable always running a full lookback sync instead of alternating with lighter incremental runs as scheduled, which cuts billed rows and sync time on the weeks between full lookbacks. - Fixed Google Ads Capture deletes marking a removed account's rows as deleted on the next complete sync. A run's scope is now always the accounts it actually queried, never the whole table, so an account you've dropped from the sync keeps the history it already has.
- Fixed Google Drive syncs configured via the API or MCP server (rather than the Weld app's connection form) failing to resolve their folder, which caused
get_elt_sync_available_streamsandadd_elt_sync_source_streamsto return500errors instead of listing or adding streams. The folder is now resolved consistently across stream listing, streaming, and schema generation, and the settings API now offers a list of real Google Drive folders to choose from instead of requiring a folder ID.