Summary
This documentation covers the complete Product family of mapping collections that flow product data into Shopware from iPaaS.com. iPaaS.com is the system of record for products in this integration: the flagship Add/Update Shopware Product FROM iPaaS.com collection carries the full product payload — core fields, pricing, stock, categories, sales-channel assignment, images, SEO URLs, and per-channel content — while a network of child and companion collections handles variants, warehouse-scoped inventory, kits, property groups, scale units, and related products. Stock-only refreshes, deletes, and inventory adjustments each have dedicated collections so that a single inventory change does not rebuild the entire product record.
ID Format
Manual Sync ID Format
Products are transferred from iPaaS.com to Shopware when an iPaaS.com product transfer targets this Shopware subscription, either automatically on an outbound trigger or by a Manual Sync. For a Manual Sync, the record is identified by the iPaaS.com product identifier — for example 12345. Variants, inventory, kits, property groups, scale units, and related products are not synced on their own: they ride along with the parent product transfer, so syncing a product also processes its children.
External ID Format
After a successful transfer, the integration stores an external-id link that ties the iPaaS.com record to the Shopware record it created, so later updates and deletes resolve the correct target:
Product: the Shopware product identifier (a 32-character hex value).
Product Variant: the variant identifier paired with its parent product identifier, in the form variantId|productId.
Kit: the kit identifier paired with the product identifier, in the form id|productId.
Property Group / Property Group Value: the Shopware group or option identifier.
Scale Unit / Related Product: the Shopware unit or cross-selling identifier.
These links are established by the Add/Update Shopware Product FROM iPaaS.com and Add/Update Shopware Product Variant FROM iPaaS.com collections and are relied on by every companion collection in the family.
Deleted Record Support
Inbound deletes are supported for products and variants. When an iPaaS.com product or variant is deleted, the integration removes the linked Shopware record using the stored external-id link:
Delete Shopware Product FROM iPaaS.com deletes the linked Shopware product.
Delete Shopware Product Variant FROM iPaaS.com deletes the linked Shopware variant.
Both are delete-by-link collections with no field mappings — the Shopware record is identified entirely from the link established when it was created. If no linked Shopware record is found, there is nothing to delete and an error is recorded in Dashboard / Integration Monitoring / Error Logs. Deletes of the other entities in this family (inventory, kits, property groups, scale units, related products) are not propagated as standalone operations; those records are reconciled through their parent product transfer.
Custom Field Support
Many of the Product family's features are switched on by named iPaaS.com custom fields on the source product or variant. The integration reads each custom field by its exact name using the GetCustomFieldValue helper, so the custom-field name configured in the source must match the name referenced in the mapping exactly. A missing or misnamed custom field simply disables the feature it drives rather than failing the whole transfer, except where a preset makes the value required.
The custom fields that enable features include:
Shopware Tax Name and Shopware Currency Name: resolve the product's Shopware tax and price currency.
Shopware Manufacturer: resolves (and auto-creates) the manufacturer.
Shopware Product Tags, Shopware Warehouse Groups, Shopware Product Sales Channels, Shopware Images: comma-separated lists that drive tags, warehouse groups, sales-channel visibility, and image uploads.
Shopware GTIN and Shopware MPN: carry the EAN and manufacturer number.
Sales-channel/URL custom fields (for example Sales Channel ID Headless / URL Headless): paired fields the SEO URL mapping reads to build per-sales-channel SEO paths.
Sales-channel-specific content fields follow the naming convention {API_Object_Field}{API_ObjectName}{Sales Channel Name OR ID}, where the third segment encodes the sales channel by id or name. With the Product Content Processing preset enabled, the integration parses these keys and groups content per channel. The exact object name to use comes from the custom request created for the subscription.
Mapping Collection Status
All collections in this family are Enabled.
Trigger Events
Products flow into Shopware from iPaaS.com on an iPaaS.com outbound product transfer (automatic) or by Manual Sync.
Variants, kits, property groups, property group values, scale units, inventory, and related products are processed as children of the product (or variant) transfer rather than on independent triggers.
The standalone inventory collections (Add / Update for product and variant) are triggered when an iPaaS.com inventory record is added or changes for a linked product or variant.
The For Stock Updates collections are triggered by secondary, stock-only updates raised from iPaaS.com — including those relayed by the inventory collections' UpdateParent workaround.
Delete collections are triggered when the linked iPaaS.com product or variant is deleted.
Duplicate or Conflicting Mappings
Products flow into Shopware from iPaaS.com, and there is no standalone outbound "To iPaaS.com" Product or Product Variant collection, so there are no opposing collections that overwrite the same records in the other direction. Within the family, the collections that operate on the same Shopware record are deliberately separated so they do not conflict:
Add/Update Shopware Product FROM iPaaS.com (full payload) and Update Shopware Product Stock FROM iPaaS.com (stock only) are split by a secondary-update filter: a given transfer is handled by exactly one of the pair, so a stock-only change updates just stock while a full change rebuilds the whole record. The same split applies to the variant pair.
The inventory collections write only stock; they never overwrite other product data even when they run.
Delete collections only remove the linked record when its iPaaS.com counterpart is deleted.
Subscribers or their MiSP should keep both the full and the For Stock Updates collections enabled so that neither category of transfer is dropped.
Supported Child Collections
The product transfer drives the following children (each linked to the parent product by the product's Shopware identifier):
Shopware Product Related Product (external id: cross-selling identifier): creates cross-sell / related-product links for the product.
Shopware Property Group (external id: group identifier): creates the property groups (option axes) used to describe and vary the product.
Shopware Product Variant (external id: variantId|productId): creates the product's variants and their option assignments.
Shopware Scale Unit (external id: unit identifier): resolves and auto-creates the scale unit used by the product.
Shopware Product Inventory (external id: product identifier): writes warehouse-scoped inventory for the product.
Shopware Product Kit (external id: id|productId): creates the product's kit (bundle or cross-selling group) definition.
The variant transfer in turn drives its own children: Shopware Product Variant Property Group Value, Shopware Product Variant Inventory, and Shopware Variant Related Product. The kit transfer drives Shopware Product Kit Component, the property group transfer drives Shopware Property Group Value, and the For Stock Updates product transfer drives Shopware Product Variant FROM iPaaS For Stock Updates.
Shopware Caveats
Sales channel IDs must be valid. Shopware returns an internal server error if an incorrect sales channel ID is supplied to the sales-channel assignment. Confirm the channel IDs in the Shopware Product Sales Channels custom field are valid for the target store.
Property groups and options are auto-created. A property group or option named on a product or variant that does not yet exist in Shopware is created automatically during the transfer. Confirm the option names supplied are the values intended, because new groups and options are created from them.
Per-channel content requires the Sales Channel Specific Content extension. The custom product-content entity and per-sales-channel content behavior depend on the Sales Channel Specific Content extension (tested with Shopware 6.6.10.4). On stores without it, that behavior does not apply.
Kits require a bundle extension in API-extension mode. Sending kits through the Bundle API extension requires a bundle extension installed on the Shopware instance.
Warehouse-level stock is a premium Shopware feature (Advanced Stock Management / multi-warehouse). Subscribers without it track stock only at the parent product or variant level. See Inventory and the UpdateParent workaround below.
Tax provider override. If a tax provider is active in Shopware, the tax rate resolved by name may be overwritten; check or adjust the actual VAT rates and country assignments in Shopware settings.
Required Shopware records must exist. Tax, currency, categories, warehouse groups, and sales channels are resolved by name or id as they appear in Shopware; where a required lookup (tax, currency, scale unit) finds no match the value resolves to nothing and creation fails. The scale unit and the manufacturer are auto-created when missing; the others must already exist.
iPaaS.com Caveats
iPaaS.com is the system of record for product and variant data in this integration. Define iPaaS.com as the source so that downstream edits made in Shopware are not overwritten unexpectedly on the next transfer.
Many features depend on named iPaaS.com custom fields being present and correctly named on the source product or variant. A missing or misnamed custom field disables the feature it drives rather than failing the transfer, except where a preset makes the value required.
Stock values are computed in iPaaS.com from the product's or variant's inventory at the time of the transfer.
For large product or inventory loads, subscribers or their MiSP should stagger large manual jobs and rely on the configured API throttle limits so that transfers are not submitted faster than the store can absorb them.
Integration-Specific Caveats
Subscription Settings (Presets)
Several subscription presets modify how the family behaves. Subscribers or their MiSP configure these in the subscription settings:
Product Content Processing: when enabled, the integration splits sales-channel-specific content custom fields off the product and writes them to a custom product-content entity named by the CustomProductEntityName mapping, working with the Sales Channel Specific Content extension to support per-channel product content. Off by default; when enabled, the content-entity name must be supplied or transfers error.
Transfer Kits using API Extension: when enabled, kits are sent through the Bundle API extension rather than native cross-selling, and this is the only mode in which a product or variant may carry both related products and a kit. Off by default (kits use cross-selling).
Translations Enabled: when enabled, product, variant, property-group, and category content is processed as multi-language translations. This is a family-wide toggle, off by default.
Index Behavior Header: an indexing-deferral option for bulk loads — when enabled, product and variant writes defer Shopware re-indexing. Stock and inventory writes always bypass this behavior.
Property Group Match Field / Property Group Option Match Field: name the field used to match an existing property group or option instead of name (a custom field, or for groups description). Default is name.
Group Kit Components Using Custom Fields: when set to "true", kit components are grouped into a named cross-selling group or bundle using the value of the KitNameToGroupComponents custom field.
Tax ID / Currency ID: default Shopware tax and currency identifiers used as pricing fallbacks.
Inventory and the UpdateParent workaround
Inventory-only transfers normally write stock at the Shopware warehouse level, which requires the premium Shopware warehouse feature (Advanced Stock Management). Subscribers not using Shopware warehouses track stock only at the parent product or variant level, so a warehouse-level adjustment would never reach their stock until a full product update runs.
The inventory collections expose two control fields for this. Mapping NoWarehouseOverride to "true" (or "y") bypasses the warehouse write and applies stock directly to the product or variant. Mapping UpdateParent to "true" (or "y") — together with NoWarehouseOverride set to "true" — makes the integration look up the iPaaS.com parent product (or variant) by SKU, flag it for a secondary (stock-only) update, and re-transfer it through the For Stock Updates collections. The full Product and Variant collections are filtered to exclude these secondary updates, while the Update Shopware Product Stock FROM iPaaS.com and Update Shopware Product Variant Stock FROM iPaaS.com collections are filtered to pick them up — so the stock lands at the product or variant level. (For variants, the further configurable-parent-product step does not apply to Shopware.)
Setup Requirements
For automatic transfer, the subscription's Outbound Data Flows must be configured so that iPaaS.com product, inventory, and delete events target this Shopware subscription. Before enabling the family, subscribers or their MiSP should:
Confirm the named Shopware records the mappings resolve (tax, currency, categories, warehouse groups, sales channels) exist in the target store, and replace the example names and IDs in the mappings.
Replace the SEO URL language identifier and the example sales-channel/URL custom-field names with values for the target store.
Decide the inventory path (warehouse vs. non-warehouse) and set the NoWarehouseOverride / UpdateParent control fields and the active filter option accordingly.
Set the relevant presets (Product Content Processing, Transfer Kits using API Extension, Translations Enabled, Index Behavior Header, the match-field presets).
Integration Flow
An iPaaS.com product is created, updated, or deleted, or an inventory record changes, and the event targets this Shopware subscription (automatically or by Manual Sync).
The mapping filter on the triggered collection decides whether the record is processed — for the full product, only non-secondary updates pass; for stock updates, only secondary updates pass; for inventory, the warehouse or non-warehouse option determines eligibility.
The integration resolves the Shopware-specific identifiers the product requires (tax, currency, scale unit, manufacturer, categories, warehouse groups, sales channels) from iPaaS.com names and values.
The Shopware product is created, or the matching record is updated when one already exists, and the external-id link is stored.
Child collections run under the product: property groups and option values, variants and their option values, scale units, inventory, kits and components, and related products. Variants run their own children in turn.
Targets that must already exist — related products, kit components — are resolved by SKU / external link; links that cannot resolve are skipped (related products) or fail with an error (kit components, per the provided formula).
Stock-only and inventory changes are applied to the linked record without rebuilding the full product; the UpdateParent workaround relays parent-level stock through the For Stock Updates collections.
Errors surface in Dashboard / Integration Monitoring / Error Logs, where a failed transfer can be retried by triggering a new transfer from iPaaS.com.
Mappings
Add/Update Shopware Product FROM iPaaS.com
Mapping Filter
SecondaryUpdate != true
Filter Description. This collection processes the full product transfer. A record passes the filter only when it is not a secondary (stock-only) update — that is, when SecondaryUpdate is not true. Secondary updates (stock-only refreshes, including those relayed by the inventory UpdateParent workaround) are excluded here and handled instead by the Update Shopware Product Stock FROM iPaaS.com collection, which is filtered to SecondaryUpdate == true. This split prevents the full product payload from being rebuilt on every inventory change. The filter neither rejects records with an exception nor pins any environment-specific value.
Description: Creates or updates the full Shopware product, carrying core fields, pricing, stock, categories, sales-channel assignment, images, SEO URLs, and per-channel content.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Field | Sku | ProductNumber | required — the product number; Shopware requires it to create a product. |
Field | Name | Name | required — the product name; Shopware requires it to create a product. |
Field | Description | Description | optional — the product description. |
Field | Shopware GTIN (custom) | Ean | optional — the product GTIN/EAN. |
Field | Shopware MPN (custom) | ManufacturerNumber | optional — the manufacturer part number. |
Field | Weight | Weight | optional — the product weight. |
Field | Height | Height | optional — the product height. |
Field | Width | Width | optional — the product width. |
Dynamic Formula | Resolve tax by name | TaxId | required — resolves the Shopware tax from Shopware Tax Name, falling back to a default tax name; creation fails if the named tax does not exist. See formula below. |
Dynamic Formula | Sum inventory | Stock | required — sums the product's full iPaaS.com inventory; required for all product types including variant parents. See formula below. |
Dynamic Formula | Resolve/create unit by name | UnitId | required — resolves the scale unit by name and auto-creates it when missing. See formula below. |
Dynamic Formula | Resolve currency by name | Price_CurrencyId | required — resolves the price currency from Shopware Currency Name, falling back to a default. See formula below. |
Dynamic Formula |
| Price_Net | required — the net price (excludes tax/shipping); prefers sale price, falls back to default. |
Dynamic Formula |
| Price_Gross | required — the gross price (includes VAT); prefers sale price, falls back to default. |
Dynamic Formula |
| Price_Linked | required — keeps net and gross linked so changing one recalculates the other. |
Dynamic Formula | Resolve list-price currency | Price_ListPrice_CurrencyId | optional — currency for the pre-discounted reference (list) price; resolved only when a price is present. See formula below. |
Dynamic Formula |
| Price_ListPrice_Net | optional — net list price (such as MSRP); prefers default price, falls back to sale price. |
Dynamic Formula |
| Price_ListPrice_Gross | optional — gross list price (such as MSRP); prefers default price, falls back to sale price. |
Dynamic Formula | Link when price present | Price_ListPrice_Linked | optional — links the list price's net and gross when a price is present. |
Dynamic Formula |
| CategoryIds | optional — resolves the product's linked iPaaS.com categories to Shopware category IDs; unlinked categories are not assigned. |
Dynamic Formula | Assign channels and visibility | Visibilities | optional — assigns the product to sales channels and sets visibility from Shopware Product Sales Channels; reconciles existing assignments. See formula below. |
Dynamic Formula | Tag list from custom field | ProductTags | optional — assigns tags from Shopware Product Tags; tags omitted on a later update are removed. |
Dynamic Formula | Warehouse groups by name | ProductWareHouseGroupIds | optional — links warehouse groups from Shopware Warehouse Groups; required to view warehouse-specific inventory in Shopware. |
Dynamic Formula | Manufacturer by name (create) | ManufacturerId | optional — resolves the manufacturer from Shopware Manufacturer and auto-creates it when missing. |
Dynamic Formula |
| CrossSellingUpdateHandling | optional — when true, removes Shopware cross-sells not present as iPaaS.com related products; false keeps manually maintained cross-sells. See note below. |
Dynamic Formula | Build per-channel SEO URLs | SeoUrls | optional — builds one SEO URL per sales channel from paired sales-channel/URL custom fields. See formula below. |
Dynamic Formula | Image list from custom field | MediaUrl | optional — uploads images from Shopware Images; first public URL becomes the cover; per-image position, alt text, and channel id are supported. |
Static |
| CustomProductEntityName | optional in general, required when Product Content Processing is enabled — names the custom product-content entity for per-channel content. |
Static |
| Custom_Field_Product_Attribute | optional — writes a static value to a product custom field; this is a test value, replace or remove it. |
Dynamic Formula |
| bolo test | optional — template custom-field mapping; review and adjust or remove during implementation. |
Field | test tabinda 8921 bool (custom) | bool_field_product | optional — template custom-field mapping; review and adjust or remove during implementation. |
// TaxId
var value = GetCustomFieldValue(CustomFields, "Shopware Tax Name");
if (!string.IsNullOrEmpty(value)){
return await GetTaxIdByName(value);
}
return await GetTaxIdByName("Standard rate");// Stock
//All inventory
return await SumFullInventoryForProductAsync(Id);//Inventory by location group
//SumProductInventoryQuantityByLocationGroupNameAsync(String type, String groupName, Int64 productId, Boolean allowNegative, String safetyType, Int32 safetyLevel)
return await SumProductInventoryQuantityByLocationGroupNameAsync("available", "Example Warehouse Group", Id, true, "none", 0);// UnitId
//Example 1 - Use the primary stocking unit record name
if (Units != null && Units.count > 0) {
var primaryUnit = Units.find( x => x.Conversion == 1)?.Name;
return await SetUnitIdByUnitName(primaryUnit);
}
//Example 2 - Use the product "unit" field
if (Unit != null && Unit != "") {
return await SetUnitIdByUnitName(Unit);
}
//Example 3 - Use a default of Each
return await SetUnitIdByUnitName("Each");// Price_CurrencyId
var value = GetCustomFieldValue(CustomFields, "Shopware Currency Name");
if (!string.IsNullOrEmpty(value)){
return await GetCurrencyIdByName(value);
}
return await GetCurrencyIdByName("Euro");// Price_ListPrice_CurrencyId
var value = CoalesceToDecimal(DefaultPrice,SalePrice);
if (value > 0 || SalePrice > 0 ){
var value2 = GetCustomFieldValue(CustomFields, "Shopware Currency Name");
if (!string.IsNullOrEmpty(value2)){
return await GetCurrencyIdByName(value2);
}
return await GetCurrencyIdByName("US-Dollar");
}
return null;// Visibilities
var externalProductId = await GetExternalIdAsync(Id, "Product", SpaceportSystemId);
var assignmentValues = GetCustomFieldValue(CustomFields, "Shopware Product Sales Channels");
if (!string.IsNullOrEmpty(assignmentValues)){
return await AssignShopwareProductToChannelIds(externalProductId,assignmentValues);
}
return null;// SeoUrls
string languageId = "7c68b995c3cb4a3b879bda39e6f7f7db";
var seoUrlList = new List<ExpandoObject>();var salesChannelIdHeadless = GetCustomFieldValue(CustomFields, "Sales Channel ID Headless");
var urlHeadless = GetCustomFieldValue(CustomFields, "URL Headless");
if (salesChannelIdHeadless != null && !string.IsNullOrEmpty(salesChannelIdHeadless.ToString()) && urlHeadless != null && !string.IsNullOrEmpty(urlHeadless.ToString())){
dynamic seoUrl = new ExpandoObject();
seoUrl.seoPathInfo = urlHeadless;
seoUrl.salesChannelId = salesChannelIdHeadless;
seoUrl.languageId = languageId;
seoUrl.isCanonical = true;
seoUrl.isModified = true;
seoUrlList.Add(seoUrl);
}var salesChannelIdSnowboardStore = GetCustomFieldValue(CustomFields, "Sales Channel ID Snowboard Store");
var urlSnowboardStore = GetCustomFieldValue(CustomFields, "URL Snowboard Store");
if (salesChannelIdSnowboardStore != null && !string.IsNullOrEmpty(salesChannelIdSnowboardStore.ToString()) && urlSnowboardStore != null && !string.IsNullOrEmpty(urlSnowboardStore.ToString())){
dynamic seoUrl = new ExpandoObject();
seoUrl.seoPathInfo = urlSnowboardStore;
seoUrl.salesChannelId = salesChannelIdSnowboardStore;
seoUrl.languageId = languageId;
seoUrl.isCanonical = true;
seoUrl.isModified = true;
seoUrlList.Add(seoUrl);
}if(seoUrlList != null && seoUrlList.Count > 0)
return seoUrlList;
return null;For TaxId, Placeholder value — replace during implementation: "Standard rate" is an example Shopware tax name; the named tax must exist in Shopware whenever the fallback is reached, or product creation fails. For Price_CurrencyId and Price_ListPrice_CurrencyId, "Euro" and "US-Dollar" are example fallback currency names. For UnitId, "Each" and the example unit sources are template values. For SeoUrls, the language identifier 7c68b995c3cb4a3b879bda39e6f7f7db is environment-specific and the Headless / Snowboard Store custom-field names are examples — replace all of these for the target store.
For Visibilities, each token in Shopware Product Sales Channels pairs a channel id with a visibility level; visibility defaults to 30 (visible everywhere), with 20 hiding the product in listings and search and 10 hiding it in listings. For CrossSellingUpdateHandling, when enabled, cross-sells created by the integration can only be removed by the integration until it is disabled; set it to false to preserve cross-sells that came from a kit.
Delete Shopware Product FROM iPaaS.com
Description: Deletes the linked Shopware product when its iPaaS.com product is deleted. This collection has no field mappings — the Shopware product is identified entirely from the stored external-id link, so there is nothing to configure. If no linked product is found, there is nothing to delete and an error is recorded in Dashboard / Integration Monitoring / Error Logs.
Update Shopware Product Stock FROM iPaaS.com
Mapping Filter
SecondaryUpdate == true
Filter Description. This collection processes only secondary, stock-only refreshes. A record passes the filter only when SecondaryUpdate is true — the mirror of the full product collection's SecondaryUpdate != true filter. The two collections divide the inbound product traffic: a transfer is handled by exactly one of the pair, so a stock-only change updates just the stock while a full change rebuilds the whole record. The secondary-update flag is also what the inventory UpdateParent workaround sets so that a parent-level stock update is routed here. The filter neither throws nor pins an environment-specific value.
Description: Patches only the stock value onto an existing, linked Shopware product, leaving every other attribute untouched.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula | Sum inventory | Stock | required — the only field this collection writes; sums all-locations inventory for the product, applies to all product types including variant parents. See formula below. |
//All inventory
return await SumFullInventoryForProductAsync(Id);//Inventory by location group
//SumProductInventoryQuantityByLocationGroupNameAsync(String type, String groupName, Int64 productId, Boolean allowNegative, String safetyType, Int32 safetyLevel)
return await SumProductInventoryQuantityByLocationGroupNameAsync("available", "Example Warehouse Group", Id, true, "none", 0);Placeholder value — replace during implementation: "Example Warehouse Group" in the commented alternative is an example warehouse-group name; it applies only if the location-group formula is used. Stock and inventory writes bypass the Index Behavior Header.
Add/Update Shopware Product Variant FROM iPaaS.com
Description: Creates or updates the product's variants as a child of the product transfer; most values (tax, currency, unit, name) are read from the parent product, and the variant's defining options and property groups are resolved by name and auto-created when missing.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Field | Sku | ProductNumber | required — the variant product number. |
Dynamic Formula |
| Name | required — defaults the variant name to the parent product name. |
Field | Shopware GTIN (custom) | Ean | optional — the variant GTIN/EAN. |
Field | Shopware MPN (custom) | ManufacturerNumber | optional — the variant manufacturer number. |
Field | Weight | Weight | optional — the variant weight. |
Field | Height | Height | optional — the variant height. |
Field | Width | Width | optional — the variant width. |
Dynamic Formula | Resolve tax by parent's name | TaxId | required — resolves the Shopware tax from the parent product's Shopware Tax Name, falling back to a default; creation fails if the named tax does not exist. See formula below. |
Dynamic Formula | Sum variant inventory | Stock | required — sums the variant's full iPaaS.com inventory. See formula below. |
Dynamic Formula | Resolve/create unit from parent | UnitId | required — resolves the scale unit from the parent product's unit and auto-creates it when missing. See formula below. |
Dynamic Formula | Resolve currency by parent's name | Price_CurrencyId | required — resolves the price currency from the parent's Shopware Currency Name, falling back to a default. |
Dynamic Formula |
| Price_Net | required — the net variant price; prefers sale price, falls back to default. |
Dynamic Formula |
| Price_Gross | required — the gross variant price; prefers sale price, falls back to default. |
Dynamic Formula |
| Price_Linked | required — keeps net and gross linked. |
Dynamic Formula | Resolve list-price currency | Price_ListPrice_CurrencyId | optional — currency for the variant's list price; resolved only when a price is present. |
Dynamic Formula |
| Price_ListPrice_Net | optional — net list price; prefers default price, falls back to sale price. |
Dynamic Formula |
| Price_ListPrice_Gross | optional — gross list price; prefers default price, falls back to sale price. |
Dynamic Formula | Link when price present | Price_ListPrice_Linked | optional — links the list price's net and gross when a price is present. |
Dynamic Formula |
| VariantCategoryIds | optional — resolves the variant's linked iPaaS.com categories to Shopware category IDs. |
Dynamic Formula | Tag list from custom field | VariantTags | optional — assigns tags from the variant's Shopware Product Tags; tags omitted on a later update are removed. |
Dynamic Formula |
| CrossSellingUpdateHandling | optional — when true, removes Shopware cross-sells not present as iPaaS.com related products; false keeps manually maintained cross-sells. |
Dynamic Formula | Build per-channel SEO URLs | SeoUrls | optional — builds one SEO URL per sales channel from the variant's paired sales-channel/URL custom fields. |
Dynamic Formula | Image list from custom field | MediaUrl | optional — uploads images from the variant's Shopware Images; first public URL becomes the cover; per-image position and alt text are supported. |
// TaxId
var value = GetCustomFieldValue(Parent.CustomFields, "Shopware Tax Name");
if (!string.IsNullOrEmpty(value)){
return await GetTaxIdByName(value);
}
return await GetTaxIdByName("Standard rate");// Stock
//All inventory
return await SumFullInventoryForVariantAsync(Id);//Inventory by location group
//SumVariantInventoryQuantityByLocationGroupNameAsync(String type, String groupName, Int64 productId, Boolean allowNegative, String safetyType, Int32 safetyLevel)
return await SumVariantInventoryQuantityByLocationGroupNameAsync("available", "Example Warehouse Group", Id, true, "none", 0)// UnitId
//Example 1 - Use the primary stocking unit record name
if (Parent.Units != null && Parent.Units.count > 0) {
var primaryUnit = Parent.Units.find( x => x.Conversion == 1)?.Name;
return await SetUnitIdByUnitName(primaryUnit);
}
//Example 2 - Use the product "unit" field
if (Parent.Unit != null && Parent.Unit != "") {
return await SetUnitIdByUnitName(Parent.Unit);
}
//Example 3 - Use a default of Each
return await SetUnitIdByUnitName("Each");Placeholder value — replace during implementation: "Standard rate", "Euro", "US-Dollar", "Each", the SEO language identifier 7c68b995c3cb4a3b879bda39e6f7f7db, and the example sales-channel/URL custom-field names are all template values to replace for the target store. The variant's options and property groups are auto-created during variant creation; confirm the option names supplied are the values intended.
Delete Shopware Product Variant FROM iPaaS.com
Description: Deletes the linked Shopware variant when its iPaaS.com product variant is deleted. This collection has no field mappings — the Shopware variant is identified entirely from the stored external-id link. If no linked variant is found, there is nothing to delete and an error is recorded in Dashboard / Integration Monitoring / Error Logs.
Update Shopware Product Variant Stock FROM iPaaS.com
Description: The variant child of the product stock refresh; patches only the variant's stock value as part of the parent product's stock-only update, leaving every other variant attribute untouched.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula | Sum variant inventory | Stock | required — the only field this collection writes; sums all-locations inventory for the variant. See formula below. |
//All inventory
return await SumFullInventoryForVariantAsync(Id);//Inventory by location group
//SumVariantInventoryQuantityByLocationGroupNameAsync(String type, String groupName, Int64 productId, Boolean allowNegative, String safetyType, Int32 safetyLevel)
return await SumVariantInventoryQuantityByLocationGroupNameAsync("available", "Example Warehouse Group", Id, true, "none", 0)Placeholder value — replace during implementation: "Example Warehouse Group" in the commented alternative is an example warehouse-group name; it applies only if the location-group formula is used. This collection runs as the variant child of the parent stock refresh, so the parent collection's SecondaryUpdate == true filter governs which transfers reach it. Stock writes bypass the Index Behavior Header.
Add Shopware Product Inventory FROM iPaaS.com
Mapping Filter
//Option 1 - Requires Shopware warehouses, only transfer to linked iPaaS locations
var locationId = await GetWareHouseIdByIpaasLocationId(LocationId);
if(locationId != null && locationId != ""){
//Only add to linked products
var externalId = await GetExternalIdAsync(ParentId.ToString(), "Product", SpaceportSystemId);
if(externalId != null && externalId != ""){
return true;
}
}
return false;//Option 2 - Filter does not require Shopware warehouses, used to only update Shopware product stock for linked iPaaS products
//Note: A mapping must exist passing "true" to NoWarehouseOverride
//Note: A mapping must exist passing "true" to UpdateParent
//Shopware warehouses will not be updated in this configuration and only Product stock levels will be modified
var externalId = await GetExternalIdAsync(ParentId.ToString(), "Product", SpaceportSystemId);
if(externalId != null && externalId != ""){
return true;
}
return false;//Consult with your MISP to determine the best logic for your implementationFilter Description. This collection ships with two configurable options; subscribers or their MiSP choose one and should consult their MiSP for the best logic. Option 1 (warehouse path, active as shipped) resolves the Shopware warehouse linked to the iPaaS.com location through GetWareHouseIdByIpaasLocationId and passes a record only when both that warehouse and the linked Shopware product (resolved via GetExternalIdAsync) exist; inventory for unlinked locations or unlinked products is skipped. Option 2 (non-warehouse path) drops the warehouse requirement and passes any record whose product is linked in Shopware, updating only product-level stock; it requires mappings passing "true" to both NoWarehouseOverride and UpdateParent. To use Option 2, comment out Option 1 so the second block is active. The filter does not throw and pins no environment-specific value.
Description: Writes the initial inventory record for a product, on either the warehouse path or the parent-product (workaround) path.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Static |
| NoWarehouseOverride | optional — set to "true"/"y" to bypass the warehouse write and apply stock directly to the product; its setting must match the active filter option. |
Dynamic Formula |
| ProductId | required — resolves the linked Shopware product the inventory belongs to. |
Field | QtyAvailable | Stock | required — the available inventory quantity written to Shopware. |
Static |
| UpdateParent | optional — set to "true"/"y" (with NoWarehouseOverride "true") to route the stock update to the parent product through the For Stock Updates collection. |
Dynamic Formula |
| WarehouseId | optional — resolves the Shopware warehouse on the warehouse path only; requires the premium warehouse feature. |
Warehouse-level stock requires the premium Shopware warehouse feature (Advanced Stock Management). Subscribers without it should use the UpdateParent / NoWarehouseOverride workaround so stock reaches the parent product. Stock and inventory writes bypass the Index Behavior Header.
Add/Update Shopware Product Inventory FROM iPaaS.com
Mapping Filter
//Option 1 - Requires Shopware warehouses, only transfer to linked iPaaS locationsvar linked = await GetWareHouseIdByIpaasLocationId(LocationId);
if(!string.IsNullOrEmpty(linked)){
return true;
}
return false; //Do not transfer unlinked locations//Option 2 - Filter does not require Shopware warehouses, used to only update Shopware product stock for iPaaS products
//Note: A mapping must exist passing "true" to NoWarehouseOverride
//Shopware warehouses will not be updated in this configuration and only Product stock levels will be modified
return true;//Consult with your MISP to determine the best logic for your implementationFilter Description. This is the inventory child of the full product transfer and ships with two configurable options. Option 1 (warehouse path, active as shipped) resolves the Shopware warehouse linked to the iPaaS.com location through GetWareHouseIdByIpaasLocationId and passes a record only when a linked warehouse exists; inventory for unlinked locations is skipped. Option 2 (non-warehouse path) drops the warehouse requirement and passes every record, updating only product-level stock; it requires a mapping passing "true" to NoWarehouseOverride. To use Option 2, comment out Option 1 so return true; is active. The filter does not throw and pins no environment-specific value.
Description: Writes inventory as part of the full product transfer, on either the warehouse path or the non-warehouse (parent-product) path.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Static |
| NoWarehouseOverride | optional — set to "true"/"y" to bypass the warehouse write and apply stock directly to the product; its setting must match the active filter option. |
Field | QtyAvailable | Stock | required — the available inventory quantity written to Shopware. |
Dynamic Formula |
| WarehouseId | optional — resolves the Shopware warehouse on the warehouse path only; requires the premium warehouse feature. |
This collection is enabled and disabled together with its parent product collection. The UpdateParent workaround for parent-level stock lives on the standalone Add / Update inventory collections. Stock and inventory writes bypass the Index Behavior Header.
Update Shopware Product Inventory FROM iPaaS.com
Mapping Filter
//Option 1 - Requires Shopware warehouses, only transfer to linked iPaaS locations
var locationId = await GetWareHouseIdByIpaasLocationId(LocationId);
if(locationId != null && locationId != ""){
//Only add to linked products
var externalId = await GetExternalIdAsync(ParentId.ToString(), "Product", SpaceportSystemId);
if(externalId != null && externalId != ""){
return true;
}
}
return false;//Option 2 - Filter does not require Shopware warehouses, used to only update Shopware product stock for linked iPaaS products
//Note: A mapping must exist passing "true" to NoWarehouseOverride
//Note: A mapping must exist passing "true" to UpdateParent
//Shopware warehouses will not be updated in this configuration and only Product stock levels will be modified
var externalId = await GetExternalIdAsync(ParentId.ToString(), "Product", SpaceportSystemId);
if(externalId != null && externalId != ""){
return true;
}
return false;//Consult with your MISP to determine the best logic for your implementationFilter Description. This collection updates inventory on an existing product and ships with the same two options as the Add collection. Option 1 (warehouse path, active as shipped) passes a record only when both the linked Shopware warehouse (via GetWareHouseIdByIpaasLocationId) and the linked Shopware product (via GetExternalIdAsync) exist; inventory for unlinked locations or unlinked products is skipped. Option 2 (non-warehouse path) passes any record whose product is linked, updating only product-level stock, and requires mappings passing "true" to both NoWarehouseOverride and UpdateParent. To use Option 2, comment out Option 1. The filter does not throw and pins no environment-specific value.
Description: Updates inventory on an existing product for subsequent stock changes, on either the warehouse path or the parent-product (workaround) path.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Static |
| NoWarehouseOverride | optional — set to "true"/"y" to bypass the warehouse write and apply stock directly to the product; its setting must match the active filter option. |
Field | QtyAvailable | Stock | required — the available inventory quantity written to Shopware. |
Static |
| UpdateParent | optional — set to "true"/"y" (with NoWarehouseOverride "true") to route the stock update to the parent product through the For Stock Updates collection. |
Dynamic Formula |
| WarehouseId | optional — resolves the Shopware warehouse on the warehouse path only; requires the premium warehouse feature. |
Warehouse-level stock requires the premium Shopware warehouse feature. Subscribers without it should use the UpdateParent / NoWarehouseOverride workaround. Stock and inventory writes bypass the Index Behavior Header.
Add Shopware Product Variant Inventory FROM iPaaS.com
Mapping Filter
//Option 1 - Requires Shopware warehouses, only transfer to linked iPaaS locations
var locationId = await GetWareHouseIdByIpaasLocationId(LocationId);
if(locationId != null && locationId != ""){
//Only add to linked products
var externalId = await GetExternalIdAsync(ParentId.ToString(), "Product Variant", SpaceportSystemId);
if(externalId != null && externalId != ""){
return true;
}
}
return false;//Option 2 - Filter does not require Shopware warehouses, used to only update Shopware product stock for linked iPaaS products
//Note: A mapping must exist passing "true" to NoWarehouseOverride
//Note: A mapping must exist passing "true" to UpdateParent
//Shopware warehouses will not be updated in this configuration and only Product stock levels will be modified
var externalId = await GetExternalIdAsync(ParentId.ToString(), "Product Variant", SpaceportSystemId);
if(externalId != null && externalId != ""){
return true;
}
return false;//Consult with your MISP to determine the best logic for your implementationFilter Description. The variant counterpart of the Add Product Inventory filter. Option 1 (warehouse path, active as shipped) passes a record only when both the linked Shopware warehouse (via GetWareHouseIdByIpaasLocationId) and the linked Shopware variant (via GetExternalIdAsync for "Product Variant") exist; inventory for unlinked locations or unlinked variants is skipped. Option 2 (non-warehouse path) passes any record whose variant is linked, updating only variant-level stock, and requires mappings passing "true" to both NoWarehouseOverride and UpdateParent. To use Option 2, comment out Option 1. The filter does not throw and pins no environment-specific value.
Description: Writes the initial inventory record for a variant, on either the warehouse path or the variant-level (workaround) path.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula |
| WarehouseId | required on the warehouse path — resolves the Shopware warehouse for the variant stock; requires the premium warehouse feature. |
Dynamic Formula |
| ProductId | required — resolves the linked Shopware variant; the external id carries both variant and parent product ids. |
Field | QtyAvailable | Stock | required — the available inventory quantity written to the variant. |
Static |
| UpdateParent | optional — set to "true"/"y" (with NoWarehouseOverride "true") to apply stock at the variant level via the variant For Stock Updates collection. |
Static |
| NoWarehouseOverride | optional — set to "true"/"y" to bypass the warehouse write; align with the active filter option. |
Placeholder value — replace during implementation: the static "false" on UpdateParent and NoWarehouseOverride is the default for warehouse-enabled subscriptions; subscribers tracking stock at the variant level should set both to "true". Stock and inventory writes bypass the Index Behavior Header.
Add/Update Shopware Product Variant Inventory FROM iPaaS.com
Mapping Filter
//Option 1 - Requires Shopware warehouses, only transfer to linked iPaaS locationsvar linked = await GetWareHouseIdByIpaasLocationId(LocationId);
if(!string.IsNullOrEmpty(linked)){
return true;
}
return false; //Do not transfer unlinked locations//Option 2 - Filter does not require Shopware warehouses, used to only update Shopware product stock for iPaaS products
//Note: A mapping must exist passing "true" to NoWarehouseOverride
//Shopware warehouses will not be updated in this configuration and only Product stock levels will be modified
return true;//Consult with your MISP to determine the best logic for your implementationFilter Description. This is the inventory child of the variant transfer and ships with two options. Option 1 (warehouse path, active as shipped) passes a record only when a Shopware warehouse is linked to the iPaaS.com location (via GetWareHouseIdByIpaasLocationId); inventory for unlinked locations is skipped. Option 2 (non-warehouse path) passes every record, updating only variant-level stock, and requires a mapping passing "true" to NoWarehouseOverride. To use Option 2, comment out Option 1 so return true; is active. The filter does not throw and pins no environment-specific value.
Description: Writes variant inventory as part of the variant transfer, on either the warehouse path or the variant-level path.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula |
| WarehouseId | required on the warehouse path — resolves the Shopware warehouse for the variant stock; requires the premium warehouse feature. |
Field | QtyAvailable | Stock | required — the available inventory quantity written to the variant. |
Static |
| NoWarehouseOverride | optional — set to "true"/"y" to bypass the warehouse write and apply stock at the variant level; align with the active filter option, and pair with UpdateParent "true" for the variant-level workaround. |
Placeholder value — replace during implementation: the static "false" on NoWarehouseOverride is the default for warehouse-enabled subscriptions; set it to "true" when tracking stock at the variant level. Stock and inventory writes bypass the Index Behavior Header.
Update Shopware Product Variant Inventory FROM iPaaS.com
Mapping Filter
//Option 1 - Requires Shopware warehouses, only transfer to linked iPaaS locations
var locationId = await GetWareHouseIdByIpaasLocationId(LocationId);
if(locationId != null && locationId != ""){
//Only add to linked products
var externalId = await GetExternalIdAsync(ParentId.ToString(), "Product Variant", SpaceportSystemId);
if(externalId != null && externalId != ""){
return true;
}
}
return false;//Option 2 - Filter does not require Shopware warehouses, used to only update Shopware product stock for linked iPaaS products
//Note: A mapping must exist passing "true" to NoWarehouseOverride
//Note: A mapping must exist passing "true" to UpdateParent
//Shopware warehouses will not be updated in this configuration and only Product stock levels will be modified
var externalId = await GetExternalIdAsync(ParentId.ToString(), "Product Variant", SpaceportSystemId);
if(externalId != null && externalId != ""){
return true;
}
return false;//Consult with your MISP to determine the best logic for your implementationFilter Description. The variant counterpart of the Update Product Inventory filter. Option 1 (warehouse path, active as shipped) passes a record only when both the linked Shopware warehouse and the linked Shopware variant (via GetExternalIdAsync for "Product Variant") exist; inventory for unlinked locations or unlinked variants is skipped. Option 2 (non-warehouse path) passes any record whose variant is linked, updating only variant-level stock, and requires mappings passing "true" to both NoWarehouseOverride and UpdateParent. To use Option 2, comment out Option 1. The filter does not throw and pins no environment-specific value.
Description: Updates variant inventory for subsequent stock changes, on either the warehouse path or the variant-level (workaround) path.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula |
| WarehouseId | required on the warehouse path — resolves the Shopware warehouse for the variant stock; requires the premium warehouse feature. |
Dynamic Formula |
| ProductId | required — resolves the linked Shopware variant; the external id carries both variant and parent product ids. |
Field | QtyAvailable | Stock | required — the available inventory quantity written to the variant. |
Static |
| UpdateParent | optional — set to "true"/"y" (with NoWarehouseOverride "true") to apply stock at the variant level via the variant For Stock Updates collection. |
Static |
| NoWarehouseOverride | optional — set to "true"/"y" to bypass the warehouse write; align with the active filter option. |
Placeholder value — replace during implementation: the static "false" on UpdateParent and NoWarehouseOverride is the default for warehouse-enabled subscriptions; set both to "true" to track stock at the variant level. Stock and inventory writes bypass the Index Behavior Header.
Add/Update Shopware Product Kit FROM iPaaS.com
Description: Creates or updates the product's kit as a child of the product transfer. The way the kit is written depends on the Transfer Kits using API Extension preset: when "true", kits are sent through the Bundle API extension as product bundles (the ProductNumber, Discount, DiscountType fields apply); otherwise kits are created as native cross-selling (the Type, Position, Active fields apply). Mappings that do not apply to the active mode are ignored.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula |
| Active | required for native cross-selling mode — enables the cross-selling group in the storefront; not used in bundle mode. |
Static |
| Discount | required for bundle (API extension) mode — the discount value applied to the bundle; not used in cross-selling mode. |
Static |
| DiscountType | required for bundle (API extension) mode — how the discount is interpreted (for example fixed or percentage); not used in cross-selling mode. |
Static |
| Position | required for native cross-selling mode — display order of the cross-selling group; not used in bundle mode. |
Field | Sku | ProductNumber | required for bundle (API extension) mode — the bundle's product number; not used in cross-selling mode. |
Static |
| Type | required for native cross-selling mode — transfers cross-selling of type "productList" (a manual list); not used in bundle mode. |
Placeholder value — replace during implementation: "5" (Discount) and "1" (Position) are example values; "fixed" (DiscountType) is an example type; "productList" (Type) is the supported cross-selling type — leave it unless your configuration requires another supported type. A product cannot carry both related products and a kit in native cross-selling mode; only the Bundle API extension mode allows both.
Add/Update Shopware Product Kit Component FROM iPaaS.com
Description: Creates or updates the individual products assigned to a kit, as a child of the kit transfer. Each component identifies a Shopware product by SKU that must already exist in Shopware — components do not create the products they reference.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Field | Akeneo Bundled Product Option Title (custom) | KitNameToGroupComponents | required for both modes when Group Kit Components Using Custom Fields is "true" — supplies the cross-selling or bundle group name; read by exact custom-field name. |
Static |
| Position | required for native cross-selling mode — display order of the component within the group; not used in bundle mode. |
Dynamic Formula | Resolve product by SKU | ProductId | required for both modes — resolves the component's SKU to a Shopware product; as provided, raises an error when the product is missing. See formula below. |
Field | Quantity | Quantity | required for bundle (API extension) mode — the quantity of the component in the bundle; not used in cross-selling mode. |
Field | Sku | Sku | required for bundle (API extension) mode — identifies the component product; the same SKU drives the ProductId lookup in both modes. |
// ProductId
var productId = await GetProductIdByProductNumber(Sku);
if (string.IsNullOrEmpty(productId)) {
throw new Exception($"Sku {Sku} does not exist in Shopware")
}
return productId;Placeholder value — replace during implementation: "Akeneo Bundled Product Option Title" is an example custom-field name; "1" (Position) is an example. To skip missing components instead of failing, change ProductId to return the lookup result without throwing and add a collection filter that returns true only when the product resolves.
Add/Update Shopware Property Group FROM iPaaS.com
Description: Creates or links the property groups (option axes such as Color or Size) used to vary a product, as a child of the product transfer. A group is resolved by name and auto-created when missing.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Field | OptionName | Name | required — the property group name (for example Color); also the default match value; an empty match value rejects the group with an error in Dashboard / Integration Monitoring / Error Logs. |
When the Property Group Match Field preset names a different field, that field supplies the match value. When Translations Enabled is on, the group's content is processed as multi-language translations.
Add/Update Shopware Property Group Value FROM iPaaS.com
Description: Creates or links the individual option values within a group (for example Red within Color), as a child of the property group transfer. An option is resolved by name within its group and auto-created when missing.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Field | Color Hex Code (custom) | ColorHexCode | optional — sets the option's color swatch (for example #98e3f5ff); meaningful only for color-style options. |
Field | Value | Name | required — the option value name (for example Red); also the default match value; an empty match value rejects the option with an error in Dashboard / Integration Monitoring / Error Logs. |
Field | Order | Position | optional — the option's display position within its group; Shopware applies default ordering when omitted. |
When the Property Group Option Match Field preset names a different field, that field supplies the match value. When Translations Enabled is on, the option's content is processed as multi-language translations.
Add/Update Shopware Product Variant Property Group Value FROM iPaaS.com
Description: Assigns the property group option values that define a variant (for example Color = Red and Size = Large), as a child of the variant transfer. The group and option are resolved by name and auto-created when missing, then assigned to the variant.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Field | OptionName | Name | required — the property group the variant option belongs to (for example Color); default match value; an empty value rejects the option with an error in Dashboard / Integration Monitoring / Error Logs. |
Field | Value | VariantOptionValue | required — the specific option the variant carries (for example Red); default match value; an empty value rejects the option with an error. |
When the Property Group Match Field / Property Group Option Match Field presets name a different field, that field supplies the match value. When Translations Enabled is on, group and option content is processed as multi-language translations.
Add/Update Shopware Scale Unit FROM iPaaS.com
Description: Resolves and, when missing, auto-creates the product's unit of measure (for example Kilogram or Each), as a child of the product transfer. The integration resolves a unit by name; the parent Product and Variant collections use the lookup-and-create path, so a named unit that does not yet exist is created with the supplied name and a derived short code.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Field | Name | Name | required — the full unit name; Shopware requires it and it is the match value for resolving an existing unit. |
Dynamic Formula |
| ShortCode | required — the unit short code; defaults to the lowercased name. See formula below. |
// ShortCode Name.ToLower()
Adjust the ShortCode formula if the store uses specific abbreviations (for example "kg" rather than "kilogram").
Add/Update Shopware Product Related Product FROM iPaaS.com
Mapping Filter
var type = "Product";
if (IsVariant){type = "Product Variant";}
var externalProductId = await GetExternalIdAsync(RelatedId, type, SpaceportSystemId);
if(externalProductId!=null && externalProductId!=""){
return true;
}
return false;Filter Description. This validating filter transfers a cross-sell link only when the target related product (or variant) already exists and is linked in Shopware. The filter determines whether the related record is a product or a variant via IsVariant, resolves its external (Shopware) id through GetExternalIdAsync, and passes the record only when that id resolves to a value. When the related record has no Shopware link yet, the cross-sell is skipped rather than failing the whole product transfer. The filter does not throw and pins no environment-specific value.
Description: Adds related products to a Shopware product as a manually assigned list of cross-sells grouped by related-product type, as a child of the product transfer.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula |
| Name | required — the cross-selling group name, defaulted to the related-product type. |
Dynamic Formula | Resolve target by external id | ProductId | required — the target Shopware product/variant; returns the first segment of the linked id, or nothing (the filter then skips the link). See formula below. |
Static |
| Type | required — sets the cross-selling type to a manually assigned product list. |
Dynamic Formula |
| Active | required — keeps the cross-selling group active (shown) in Shopware. |
Dynamic Formula | Position by related type | Position | optional — assigns the group's display position from the related-product type (for example "Related Product" → 1); unlisted types default to 0. See formula below. |
Field | RelatedType | RelatedProductType | required — carries the related-product type used to group cross-sells. |
// ProductId
var type = "Product";
if (IsVariant){type = "Product Variant";}
var externalProductId = await GetExternalIdAsync(RelatedId, type, SpaceportSystemId);
if(externalProductId!=null && externalProductId!=""){
return externalProductId.ToString().Split("|")[0];
}
return null;// Position
int position = 0;
switch (RelatedType) {
case "Related Product": position = 1; break;
case "Compatible Products": position = 2; break;
case "Included": position = 3; break;
case "Child": position = 4; break;
case "Cross-Sell": position = 5; break;
case "Parent": position = 6; break;
case "Replacement": position = 7; break;
case "Similar Item": position = 8; break;
case "Upsell": position = 9; break;
}
return position;Placeholder value — replace during implementation: "productList" (Type) is the value the integration expects for a manually assigned cross-sell list. The target product must already exist and be linked in Shopware. Cross-sell cleanup is configured on the parent Product collection's CrossSellingUpdateHandling field; a product cannot carry both related products and a kit unless Transfer Kits using API Extension is enabled.
Add/Update Shopware Variant Related Product FROM iPaaS.com
Mapping Filter
var type = "Product";
if (IsVariant){type = "Product Variant";}
var externalProductId = await GetExternalIdAsync(RelatedId, type, SpaceportSystemId);
if(externalProductId!=null && externalProductId!=""){
return true;
}
return false;Filter Description. The variant counterpart of the related-product validating filter. It transfers a cross-sell link only when the target related product (or variant) already exists and is linked in Shopware: it determines the related record's type via IsVariant, resolves its external id through GetExternalIdAsync, and passes the record only when that id resolves. Unlinked targets are skipped rather than failing the variant transfer. The filter does not throw and pins no environment-specific value.
Description: Adds related products to a Shopware variant as a manually assigned list of cross-sells grouped by related-product type, as a child of the variant transfer.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula |
| Name | required — the cross-selling group name, combining the parent variant SKU with the related-product type. |
Dynamic Formula | Resolve target by external id | ProductId | required — the target Shopware product/variant external id, or nothing (the filter then skips the link). See formula below. |
Static |
| TType | required — sets the cross-selling type to a manually assigned product list. |
Dynamic Formula |
| Active | required — keeps the cross-selling group active (shown) in Shopware. |
Dynamic Formula | Position by related type | Position | optional — assigns the group's display position from the related-product type; unlisted types default to 0. See formula below. |
Field | RelatedType | RelatedProductType | required — carries the related-product type used to group cross-sells. |
// ProductId
var type = "Product";
if (IsVariant){type = "Product Variant";}
var externalProductId = await GetExternalIdAsync(RelatedId, type, SpaceportSystemId);
if(externalProductId!=null && externalProductId!=""){
return externalProductId;
}
return null;// Position
int position = 0;
switch (RelatedType) {
case "Related Product": position = 1; break;
case "Compatible Products": position = 2; break;
case "Included": position = 3; break;
case "Child": position = 4; break;
case "Cross-Sell": position = 5; break;
case "Parent": position = 6; break;
case "Replacement": position = 7; break;
case "Similar Item": position = 8; break;
case "Upsell": position = 9; break;
}
return position;Placeholder value — replace during implementation: "productList" (TType) is the value the integration expects for a manually assigned cross-sell list. The target product must already exist and be linked in Shopware. Cross-sell cleanup is configured on the parent Product Variant collection's CrossSellingUpdateHandling field; a variant cannot carry both related products and a kit unless Transfer Kits using API Extension is enabled.
Error Handling
Errors surface in Dashboard / Integration Monitoring / Error Logs, where a failed transfer can be retried by triggering a new transfer from iPaaS.com.
Missing required Shopware record (tax / currency / scale unit): a required name-based lookup resolves to nothing because the named record does not exist in the target store, so product or variant creation fails. Resolution: confirm the referenced tax, currency, and scale unit exist in Shopware and replace the example names in the mappings before enabling the collection.
Missing product number, name, or stock: a transfer arrives without a value Shopware requires to create a product or variant, and the record is rejected. Resolution: ensure the source SKU, name, and inventory are populated in iPaaS.com.
Invalid sales channel ID: Shopware returns an internal server error when an incorrect channel id is supplied to the sales-channel assignment. Resolution: confirm the channel ids in the Shopware Product Sales Channels custom field are valid for the target store.
Product Content Processing enabled without a content-entity name: the Product Content Processing preset is on but CustomProductEntityName is unmapped or empty, so the transfer errors. Resolution: supply the content-entity name (and create the expected content and image fields) or disable the preset.
"Sku {Sku} does not exist in Shopware": a kit component references a SKU that has no matching Shopware product. Resolution: transfer the component product to Shopware first, or change the ProductId mapping and add the skip filter shown above to exclude missing components instead of failing.
Nothing to delete or update for an unlinked record: a delete, stock refresh, or inventory write targets an iPaaS.com record that is not linked to an existing Shopware record. Resolution: confirm the product or variant was created through the full collection so the external-id link exists.
Shopware API temporarily unavailable: the transfer fails when the Shopware API cannot be reached. Resolution: retry the transfer from iPaaS.com once the API is available.
Testing & Validation
Test Scenarios
Create a new product with all required fields populated (SKU, name, tax, currency, unit, stock, price) and confirm it is created in Shopware with the resolved tax, currency, and scale unit.
Update an existing product and confirm only the changed fields are applied and the external-id link is preserved.
Transfer a product missing a required field (for example no tax name resolvable) and confirm the record is rejected with an error in Dashboard / Integration Monitoring / Error Logs.
Create a product with variants and confirm each variant is created under the parent with its option values, property groups (auto-created), and stock.
Trigger a stock-only change and confirm the Update Shopware Product Stock FROM iPaaS.com collection updates only stock while the full product collection ignores the secondary update.
Add and update inventory on both the warehouse path (Option 1) and the non-warehouse path (Option 2 with NoWarehouseOverride / UpdateParent set) and confirm stock lands at the warehouse or the product/variant level accordingly.
Transfer a kit in cross-selling mode and in bundle (API extension) mode and confirm the correct fields are applied and components resolve to existing Shopware products.
Create related products with linked and unlinked targets and confirm linked targets create cross-sells while unlinked targets are skipped.
Delete an iPaaS.com product and variant and confirm the linked Shopware records are removed.
Manual Sync a product by its iPaaS.com identifier and confirm the product and its children transfer.
Validation Checklist
The named Shopware records the mappings resolve (tax, currency, categories, warehouse groups, sales channels) exist in the target store, and example names and IDs have been replaced.
The SEO URL language identifier and the example sales-channel/URL custom-field names have been replaced for the target store.
The inventory path is decided and the NoWarehouseOverride / UpdateParent control fields and the active filter option are aligned.
The required custom fields exist and are named exactly as referenced in the mappings.
The relevant presets are configured (Product Content Processing, Transfer Kits using API Extension, Translations Enabled, Index Behavior Header, the match-field presets).
Test/example mappings (static product-attribute value, template custom-field mappings) have been replaced or removed.
Created products carry the correct stock, pricing, categories, sales-channel visibility, and external-id link.
Variants, property groups, kits, scale units, inventory, and related products appear correctly under their parent records.
Errors appear in Dashboard / Integration Monitoring / Error Logs for rejected records and resolve after correction.
Additional Notes
There is no standalone outbound (To iPaaS.com) Product or Product Variant collection; iPaaS.com is the source for products in this integration.
Variants, kits, property groups, scale units, inventory, and related products are not transferred on independent triggers — they ride along with the parent product (or variant) transfer.
The scale unit and manufacturer are auto-created when missing; property groups and option values are auto-created during transfer; all other name-based lookups (tax, currency, categories, warehouse groups, sales channels) resolve to nothing when no match is found rather than creating the record.
Per-sales-channel product content requires both the Product Content Processing preset and the Sales Channel Specific Content extension (tested with Shopware 6.6.10.4), plus correctly named content and image custom fields.
Warehouse-level stock requires the premium Shopware warehouse feature (Advanced Stock Management); subscribers without it use the UpdateParent / NoWarehouseOverride workaround so stock reaches the product or variant level. The variant configurable-parent-product step does not apply to Shopware.
These limitations are inherent to the current design of the integration and the capabilities of the Shopware API, and they apply to all subscribers at the time this documentation was written.
