Summary
This documentation covers the B2B Company family that transfers company data from iPaaS.com into Shopware, together with each company's addresses and B2B employees. The flow is split into two complementary halves: an Add parent that creates new B2B companies, and an Update parent that maintains existing, linked companies. Each parent processes the company's addresses and B2B employees through dedicated child collections. B2B Company records, their addresses, and their employees are provided by the Shopware Commercial (B2B Suite) extension, so this entire family requires that extension to write data into Shopware.
ID Format
Manual Sync ID Format
A company transfer is initiated from iPaaS.com against the target Shopware subscription. The company is identified by its iPaaS.com company record Id, for example 12345. The same Id is written to the Shopware company's customer number so the company stays identifiable across both platforms. The address and B2B employee child collections do not run on their own; they execute as part of the parent company transfer.
External ID Format
After a successful transfer, the integration links the iPaaS.com record to the Shopware record it created or updated:
A B2B company is linked under the Company external-id entity.
A company address is linked using a composite external ID built from the address ID and its parent customer ID, so the address stays associated with the correct company across transfers.
A B2B employee relationship is linked under the Company Relationship external-id entity.
The Update parent additionally inspects the company's existing Company external id to decide whether the record is eligible for update (see the Update parent's Mapping Filter).
Deleted Record Support
This family does not propagate deletions. No Delete collection ships with the B2B Company From iPaaS.com family, so removing a company, address, or employee in iPaaS.com does not delete the corresponding record in Shopware. Subscribers or their MiSP who need to remove records in Shopware should do so directly in Shopware.
Custom Field Support
The company address child collections support iPaaS.com custom fields. Subscribers or their MiSP can map additional iPaaS.com address values to Shopware custom fields where needed. The recipient first- and last-name resolution reads from First Name and Last Name custom fields when they are present, using the GetCustomFieldValue conversion function. Several parent and employee mappings also read iPaaS.com custom fields (First Name, Last Name, Sales Channel ID, Language ID) with GetCustomFieldValue before applying their fallbacks.
Mapping Collection Status
B2B Company FROM iPaaS.com - Add: Enabled
B2B Company Address FROM iPaaS.com (Add child): Enabled
B2B Company Relationship (B2B-Employee) FROM iPaaS.com (Add child): Enabled
B2B Company FROM iPaaS.com - Update: Enabled
B2B Company Address FROM iPaaS.com (Update child): Enabled
B2B Company Relationship (B2B-Employee) FROM iPaaS.com (Update child): Enabled
Trigger Events
The Add and Update parent collections are triggered when an iPaaS.com company transfer targets this Shopware subscription (through an Outbound Data Flow, or by Manual Sync from iPaaS.com).
The Add parent creates a B2B company; the Update parent updates an existing, linked, non-subsidiary company.
The address and B2B employee child collections have no independent trigger — they run automatically as part of their parent company transfer.
Duplicate or Conflicting Mappings
The Add and Update parents are complementary halves of the same FROM flow, not conflicting collections. The Add parent creates new B2B companies, while the Update parent maintains companies that are already linked to Shopware and are not subsidiaries. Together they cover the full create-and-maintain lifecycle for inbound company data; the Update parent's filter keeps new (unlinked) companies on the Add path and excludes subsidiary companies.
The following collections operate on the same entities in the opposite direction (Shopware → iPaaS.com):
Add/Update Shopware B2B Company TO iPaaS.com: Transfers B2B companies from Shopware to iPaaS.com.
Add/Update Shopware B2B Company Address TO iPaaS.com: Transfers B2B company addresses from Shopware to iPaaS.com.
Shopware B2B Company Relationship TO iPaaS - (B2B-Employee): Transfers Shopware B2B employee relationships to iPaaS.com.
Important: Before enabling these inbound "FROM iPaaS.com" collections alongside the outbound "TO iPaaS.com" collections, review and customize your mapping collection filters to prevent circular updates. Define clearly which system is the source of truth for company, address, and employee data. If both directions are active with default mappings, changes may propagate back and forth between systems.
Supported Child Collections
The Add parent and the Update parent each have two children:
B2B Company Address FROM iPaaS.com (Customer Company Address): Creates (Add parent) or maintains (Update parent) the company's addresses in Shopware as part of the company transfer. Each address is linked using a composite external ID built from the address ID and its parent customer ID.
B2B Company Relationship (B2B-Employee) FROM iPaaS.com (Company Relationship): Creates (Add parent) or updates (Update parent) the company's B2B employees in Shopware as part of the company transfer. Employee relationships are linked under the Company Relationship external-id entity. This child collection takes effect only when the Shopware Commercial (B2B Suite) extension is installed.
Shopware Caveats
B2B Suite required: B2B Company records, their addresses, and their employees are provided by the Shopware Commercial (B2B Suite) extension, not the stock Admin API. Subscribers must have that extension installed for this family to write data. The B2B component flags and the B2B employee child collection take effect only when the extension is installed; without it, the parent company transfer cannot run, so its addresses and employees are not written.
At least one employee is required to create a company: A B2B company is created only when it has at least one valid B2B employee relationship — an iPaaS.com Company Relationship of type Employee whose related customer has an email, first name, and last name. Employee Management must remain enabled so employees can be created and maintained.
Named records must exist: The default payment method, sales channel, customer group, and language are resolved from names as they appear in Shopware. Each named record referenced by a required field must exist in the target Shopware store, or company creation/update fails.
Address required fields: Shopware requires a recipient name, street, city, and country on every company address. If the country does not resolve to a Shopware country, the address write fails for that record.
State resolution assumes US addresses: The country-state (region) formula prefixes "US-" to a converted state abbreviation to meet Shopware's ISO state-code format. For non-US addresses the resulting short code may not resolve to a Shopware state, in which case the state is left unset on the address. Subscribers or their MiSP should validate non-US state resolution in a staging environment before relying on it in production.
iPaaS.com Caveats
Subsidiary companies are excluded from the Update path: The Update parent's filter skips companies whose Shopware link identifies them as subsidiary companies, so subsidiaries are not updated through this path. Only existing, linked, non-subsidiary companies are updated.
Custom-field driven values: The first name, last name, sales channel, and language are read from iPaaS.com custom fields (First Name, Last Name, Sales Channel ID, Language ID) when present, otherwise from their respective fallbacks. The named-language fallback accepts only Latin-character language names; for non-Latin languages, supply the Shopware language ID through the Language ID custom field.
Children cannot be triggered independently: As child collections, the address and B2B employee collections run only as part of a parent company transfer. They cannot be triggered independently from the Manual Sync page; transfer the parent company to write its addresses and employees into Shopware.
Throttle large jobs: When transferring a large volume of companies, subscribers or their MiSP should stagger large manual jobs and rely on the configured API throttle limits to avoid contention with the Shopware instance.
Setup Requirements
For automatic transfer, configure an Outbound Data Flow in iPaaS.com that delivers company records to this Shopware subscription. The B2B Company From iPaaS.com parent collections (Add and Update) subscribe to that flow; their address and B2B employee children run automatically as part of each parent transfer. Confirm the Shopware Commercial (B2B Suite) extension is installed before enabling the family, and replace the example named records (payment method, sales channel, customer group, language) in the mappings with names that exist in the target Shopware store.
Integration Flow
An iPaaS.com company transfer is triggered against the Shopware subscription (Outbound Data Flow or Manual Sync).
The integration routes the company to the Add parent (new, unlinked companies) or the Update parent (companies already linked to a non-subsidiary Shopware company), based on each parent's filter and the company's existing Company external id.
The parent resolves the Shopware-specific identifiers a B2B company requires — default payment method, sales channel, customer group, and language — from iPaaS.com names, custom field values, and category names, and sets the B2B component flags and customer number.
The B2B company record is created (Add) or updated (Update) in Shopware, and the iPaaS.com record is linked under the Company external-id entity.
Each of the company's addresses is processed through the address child collection, resolving country and state from the iPaaS.com address data, and is linked using a composite external ID built from the address ID and its parent customer ID.
Each qualifying employee relationship is processed through the B2B employee child collection, which looks up the related iPaaS.com customer and creates or updates the Shopware B2B employee, then links the relationship under the Company Relationship external-id entity.
Mappings
The Add parent and its two children are presented first, followed by the Update parent and its two children.
Add Shopware B2B Company FROM iPaaS.com
Creates a new B2B Company record in Shopware from an iPaaS.com company, resolving the Shopware identifiers it requires and setting the B2B component flags.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Field | Email Address | required — the company's email address; Shopware's primary human-readable identifier for the record. | |
Field | Name | CompanyName | recommended — the company name; when omitted, the name is built from the contact's first and last name. |
Dynamic Formula |
| CustomerNumber | required — the Shopware customer number, set to the iPaaS.com record Id to guarantee uniqueness. |
Dynamic Formula | First Name custom field, else Name | FirstName | required — the primary contact's first name; falls back to the first token of the company name. |
Dynamic Formula | Last Name custom field, else Name | LastName | required — the primary contact's last name; falls back to the last token of the company name. |
Dynamic Formula | Payment-method name lookup | DefaultPaymentMethodId | required — resolves the named Shopware payment method; the named method must exist or creation fails. |
Dynamic Formula | Sales Channel ID custom field, else channel name | SalesChannelId | required — the Shopware sales channel; falls back to a named-channel lookup that must resolve. |
Dynamic Formula | Language ID custom field, else language name | LanguageId | required — the Shopware language; falls back to a named-language lookup (Latin names only). |
Dynamic Formula | First category name, else group name | GroupId | required — the Shopware customer group; derived from the first category, else a named-group fallback. |
Static |
| B2B_EmployeeManagement | optional — enables Employee Management; must be enabled to create employees. |
Static |
| B2B_OrderApproval | optional — enables Order Approval. |
Static |
| B2B_QuickOrder | optional — enables Quick Order. |
Static |
| B2B_QuoteManagement | optional — enables Quote Management. |
FirstName formula:
var value = GetCustomFieldValue(CustomFields, "First Name");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
return Name.Split().FirstOrDefault()LastName formula:
var value = GetCustomFieldValue(CustomFields, "Last Name");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
return Name.Split().LastOrDefault()DefaultPaymentMethodId formula:
return await GetPaymentIdByName("PayPal");Placeholder value — replace during implementation: "PayPal" is an example Shopware payment-method name. The named payment method MUST exist in Shopware; if it is not found, this required lookup returns nothing and company creation fails.
SalesChannelId formula:
var value = GetCustomFieldValue(CustomFields, "Sales Channel ID");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
return await GetChannelIdByName("Snowboard Store");Placeholder value — replace during implementation: "Snowboard Store" is an example Shopware sales-channel name used as the fallback. The named channel MUST exist in Shopware whenever the fallback is reached.
LanguageId formula:
var value = GetCustomFieldValue(CustomFields, "Language ID");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
return await GetLanguageIdByName("English");Placeholder value — replace during implementation: "English" is an example Shopware language name used as the fallback. The named-language fallback accepts only Latin-character language names; for non-Latin languages, supply the Shopware language ID through the Language ID custom field.
GroupId formula:
if(Categories != null && Categories.Count > 0){
var groupId = await GetGroupIdByName(Categories[0].CategoryName);
if(!string.IsNullOrEmpty(groupId))
return groupId;
}
return await GetGroupIdByName("Club Member");Placeholder value — replace during implementation: "Club Member" is an example Shopware customer-group name used as the fallback. The named group MUST exist in Shopware whenever the fallback is reached.
Add Shopware B2B Company Address FROM iPaaS.com
Writes each of the company's addresses into Shopware as part of the Add parent transfer, resolving country and state from the iPaaS.com address data.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula | First Name custom field chain, else Parent.Name | FirstName | required — recipient first name; address custom field, then parent custom field, then parent name. |
Dynamic Formula | Last Name custom field chain, else Parent.Name | LastName | required — recipient last name; address custom field, then parent custom field, then parent name. |
Dynamic Formula | Country | CountryId | required — resolves the Shopware country from the address country; the write fails if it cannot resolve. |
Dynamic Formula | Region | CountryStateId | optional — resolves the Shopware state from the address region; left unset if it cannot resolve. |
Field | Address1 | Street | required — the primary street line. |
Field | City | City | required — the address city. |
Field | PostalCode | ZipCode | recommended — the postal/ZIP code for deliverable addresses. |
Field | Address2 | AdditionalAddressLine1 | optional — additional street line 1. |
Field | Address3 | AdditionalAddressLine2 | optional — additional street line 2. |
Field | IsPrimaryBilling | IsPrimaryBilling | optional — flags the address as the company's primary billing address. |
Field | IsPrimaryShipping | IsPrimaryShipping | optional — flags the address as the company's primary shipping address. |
Static |
| address_id_test | optional — sample custom field carrying a test value (see placeholder note). |
FirstName formula:
var value = GetCustomFieldValue(CustomFields, "First Name");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
else{
value = GetCustomFieldValue(Parent.CustomFields, "First Name");
if (!string.IsNullOrWhiteSpace(value))
return value;
return Parent.Name.Split().FirstOrDefault()
}LastName formula:
var value = GetCustomFieldValue(CustomFields, "Last Name");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
else{
value = GetCustomFieldValue(Parent.CustomFields, "Last Name");
if (!string.IsNullOrWhiteSpace(value))
return value;
return Parent.Name.Split().LastOrDefault()
}CountryId formula:
if(!string.IsNullOrWhiteSpace(Country)){
if(Country.Length > 3)
Country = CountryCode(Country);
return await GetCountryIdByIso(Country);
}CountryStateId formula:
if (!string.IsNullOrWhiteSpace(Region))
{
Region = Region.Trim();
if (Region.Length > 3 && !Region.Contains("-")) {
Region = StateAbbreviation(Region);
//Append "US-" to meet Shopware ISO standards
Region = "US-"+Region;
}
var stateId = await GetStateIdByShortCode(Region);
return stateId;
}Placeholder value — replace during implementation: The static "test created" on the address_id_test sample custom field is an example/test value. Subscribers or their MiSP should replace it with a real mapped value or remove the mapping before going live.
Add Shopware B2B Company Relationship (B2B-Employee) FROM iPaaS.com
Creates B2B employees in Shopware from qualifying iPaaS.com company relationships as part of the Add parent transfer.
Mapping Filter
if(!string.IsNullOrEmpty(Type) && Type.ToLower() == "employee"){
var companyRelationshipId = await GetExternalIdAsync(Id, "Company Relationship", SpaceportSystemId);
if(!string.IsNullOrWhiteSpace(companyRelationshipId))
return true;
var email = await GetiPaaSCustomerData(RelatedToId, "Email");
if(!string.IsNullOrWhiteSpace(email)){
bool duplicateFound = await B2BEmployeeDuplicateCheck(email);
if(!duplicateFound)
return true;
else
throw new Exception(email + " this email has already been existed in Shopware as the B2B-Employee");
}
}
return false;Filter Description. Only employee relationships are processed: the relationship proceeds only when its Type (lowercased) is "employee"; relationships of any other type are skipped. For an employee relationship, the filter checks whether it is already linked to a Shopware B2B employee via GetExternalIdAsync for the Company Relationship entity — if a link exists, it proceeds. Otherwise it resolves the related iPaaS.com customer's email with GetiPaaSCustomerData and runs B2BEmployeeDuplicateCheck. If no Shopware B2B employee has that email, the relationship proceeds. If a B2B employee with that email already exists, the filter throws "<email> this email has already been existed in Shopware as the B2B-Employee" and the relationship fails rather than being silently skipped. Relationships with no resolvable email are skipped.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula | Related customer FirstName | FirstName | required — the employee's first name, read from the related iPaaS.com customer. |
Dynamic Formula | Related customer LastName | LastName | required — the employee's last name, read from the related iPaaS.com customer. |
Dynamic Formula | Related customer Email | required — the employee's email; also the key used to identify the employee and prevent duplicates. | |
Dynamic Formula | Language ID custom field, else language name | LanguageId | required — the employee's language; falls back to a named-language lookup. |
Dynamic Formula |
| Active | optional — marks the new employee as active on creation. |
FirstName formula:
return await GetiPaaSCustomerData(RelatedToId, "FirstName");
LastName formula:
return await GetiPaaSCustomerData(RelatedToId, "LastName");
Email formula:
return await GetiPaaSCustomerData(RelatedToId, "Email");
LanguageId formula:
var value = GetCustomFieldValue(CustomFields, "Language ID");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
return await GetLanguageIdByName("English");Placeholder value — replace during implementation: the fallback language name "English" is an example default. It must be replaced with a language name that exists in the subscriber's Shopware instance, or the Language ID custom field should be supplied on the source record so the fallback is not needed. GetLanguageIdByName resolves only Latin-character names and returns nothing for a name it cannot find.
Update Shopware B2B Company FROM iPaaS.com
Updates an existing, linked, non-subsidiary B2B Company record in Shopware from an iPaaS.com company.
Mapping Filter
var companyId = await GetExternalIdAsync(Id, "Company", SpaceportSystemId);
if(!string.IsNullOrEmpty(companyId) && !companyId.Contains("_SubsidiaryCompany"))
return true;
return false;Filter Description. The filter restricts this collection to companies that should be updated. It looks up the company's existing Shopware link with GetExternalIdAsync for the Company entity. A company is updated only when a link exists and that link does not contain _SubsidiaryCompany. If the company has no Shopware link yet, it is skipped here and handled by the Add collection. If its link identifies it as a subsidiary company, it is skipped so subsidiaries are not updated through the standard company update path. The filter pins no environment-specific value.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Field | Name | CompanyName | recommended — the company name; when omitted, the name is built from the contact's first and last name. |
Dynamic Formula |
| CustomerNumber | required — keeps the Shopware customer number aligned with the iPaaS.com record Id. |
Dynamic Formula | First Name custom field, else Name | FirstName | required — the primary contact's first name; falls back to the first token of the company name. |
Dynamic Formula | Last Name custom field, else Name | LastName | required — the primary contact's last name; falls back to the last token of the company name. |
Dynamic Formula | Payment-method name lookup | DefaultPaymentMethodId | required — resolves the named Shopware payment method; the named method must exist or the update fails. |
Dynamic Formula | Sales Channel ID custom field, else channel name | SalesChannelId | required — the Shopware sales channel; falls back to a named-channel lookup that must resolve. |
Dynamic Formula | Language ID custom field, else language name | LanguageId | required — the Shopware language; falls back to a named-language lookup (Latin names only). |
Dynamic Formula | First category name, else group name | GroupId | required — the Shopware customer group; derived from the first category, else a named-group fallback. |
Static |
| B2B_EmployeeManagement | optional — enables Employee Management; must be enabled to maintain employees. |
Static |
| B2B_OrderApproval | optional — enables Order Approval. |
Static |
| B2B_QuickOrder | optional — enables Quick Order. |
Static |
| B2B_QuoteManagement | optional — enables Quote Management. |
FirstName formula:
var value = GetCustomFieldValue(CustomFields, "First Name");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
return Name.Split().FirstOrDefault()LastName formula:
var value = GetCustomFieldValue(CustomFields, "Last Name");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
return Name.Split().LastOrDefault()DefaultPaymentMethodId formula:
return await GetPaymentIdByName("PayPal");Placeholder value — replace during implementation: "PayPal" is an example Shopware payment-method name. The named payment method MUST exist in Shopware; if it is not found, this required lookup returns nothing and the company update fails.
SalesChannelId formula:
var value = GetCustomFieldValue(CustomFields, "Sales Channel ID");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
return await GetChannelIdByName("Snowboard Store");Placeholder value — replace during implementation: "Snowboard Store" is an example Shopware sales-channel name used as the fallback. The named channel MUST exist in Shopware whenever the fallback is reached.
LanguageId formula:
var value = GetCustomFieldValue(CustomFields, "Language ID");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
return await GetLanguageIdByName("English");Placeholder value — replace during implementation: "English" is an example Shopware language name used as the fallback. The named-language fallback accepts only Latin-character language names; for non-Latin languages, supply the Shopware language ID through the Language ID custom field.
GroupId formula:
if(Categories != null && Categories.Count > 0){
return await GetGroupIdByName(Categories[0].CategoryName);
}
return await GetGroupIdByName("Club Member");Unlike the Add collection, this Update formula returns the first-category lookup directly. If the company has a category whose name does not match any Shopware customer group, the lookup returns nothing and the update fails. Subscribers or their MiSP should confirm each category name used on companies matches an existing Shopware customer-group name.
Placeholder value — replace during implementation: "Club Member" is an example Shopware customer-group name used as the fallback. The named group MUST exist in Shopware whenever the fallback is reached.
Update Shopware B2B Company Address FROM iPaaS.com
Writes each of the company's addresses into Shopware as part of the Update parent transfer, resolving country and state from the iPaaS.com address data.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula | First Name custom field chain, else Parent.Name | FirstName | required — recipient first name; address custom field, then parent custom field, then parent name. |
Dynamic Formula | Last Name custom field chain, else Parent.Name | LastName | required — recipient last name; address custom field, then parent custom field, then parent name. |
Dynamic Formula | Country | CountryId | required — resolves the Shopware country from the address country; the write fails if it cannot resolve. |
Dynamic Formula | Region | CountryStateId | optional — resolves the Shopware state from the address region; left unset if it cannot resolve. |
Field | Address1 | Street | required — the primary street line. |
Field | City | City | required — the address city. |
Field | PostalCode | ZipCode | recommended — the postal/ZIP code for deliverable addresses. |
Field | Address2 | AdditionalAddressLine1 | optional — additional street line 1. |
Field | Address3 | AdditionalAddressLine2 | optional — additional street line 2. |
Field | IsPrimaryBilling | IsPrimaryBilling | optional — flags the address as the company's primary billing address. |
Field | IsPrimaryShipping | IsPrimaryShipping | optional — flags the address as the company's primary shipping address. |
Static |
| address_id_test | optional — sample custom field carrying a test value (see placeholder note). |
FirstName formula:
var value = GetCustomFieldValue(CustomFields, "First Name");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
else{
value = GetCustomFieldValue(Parent.CustomFields, "First Name");
if (!string.IsNullOrWhiteSpace(value))
return value;
return Parent.Name.Split().FirstOrDefault()
}LastName formula:
var value = GetCustomFieldValue(CustomFields, "Last Name");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
else{
value = GetCustomFieldValue(Parent.CustomFields, "Last Name");
if (!string.IsNullOrWhiteSpace(value))
return value;
return Parent.Name.Split().LastOrDefault()
}CountryId formula:
if(!string.IsNullOrWhiteSpace(Country)){
if(Country.Length > 3)
Country = CountryCode(Country);
return await GetCountryIdByIso(Country);
}CountryStateId formula:
if (!string.IsNullOrWhiteSpace(Region))
{
Region = Region.Trim();
if (Region.Length > 3 && !Region.Contains("-")) {
Region = StateAbbreviation(Region);
//Append "US-" to meet Shopware ISO standards
Region = "US-"+Region;
}
var stateId = await GetStateIdByShortCode(Region);
return stateId;
}Placeholder value — replace during implementation: The static "test updated" on the address_id_test sample custom field is an example/test value. Subscribers or their MiSP should replace it with a real mapped value or remove the mapping before going live.
Update Shopware B2B Company Relationship (B2B-Employee) FROM iPaaS.com
Updates B2B employees in Shopware from qualifying iPaaS.com company relationships as part of the Update parent transfer.
Mapping Filter
if(!string.IsNullOrEmpty(Type) && Type.ToLower() == "employee"){
var companyRelationshipId = await GetExternalIdAsync(Id, "Company Relationship", SpaceportSystemId);
if(!string.IsNullOrWhiteSpace(companyRelationshipId))
return true;
var email = await GetiPaaSCustomerData(RelatedToId, "Email");
if(!string.IsNullOrWhiteSpace(email)){
bool duplicateFound = await B2BEmployeeDuplicateCheck(email);
if(!duplicateFound)
return true;
else
throw new Exception(email + " this email has already been existed in Shopware as the B2B-Employee");
}
}
return false;Filter Description. Only employee relationships are processed: the relationship proceeds only when its Type (lowercased) is "employee"; relationships of any other type are skipped. For an employee relationship, the filter checks whether it is already linked to a Shopware B2B employee via GetExternalIdAsync for the Company Relationship entity — if a link exists, it proceeds. Otherwise it resolves the related iPaaS.com customer's email with GetiPaaSCustomerData and runs B2BEmployeeDuplicateCheck. If no Shopware B2B employee has that email, the relationship proceeds. If a B2B employee with that email already exists, the filter throws "<email> this email has already been existed in Shopware as the B2B-Employee" and the relationship fails rather than being silently skipped. Relationships with no resolvable email are skipped.
Mapping Type | Source Field (iPaaS.com) | Destination Field (Shopware) | Description |
Dynamic Formula | Related customer FirstName | FirstName | required — the employee's first name, read from the related iPaaS.com customer. |
Dynamic Formula | Related customer LastName | LastName | required — the employee's last name, read from the related iPaaS.com customer. |
Dynamic Formula | Related customer Email | required — the employee's email; also the key used to identify the employee and prevent duplicates. | |
Dynamic Formula | Language ID custom field, else language name | LanguageId | required — the employee's language; falls back to a named-language lookup. |
Dynamic Formula |
| Active | optional — marks the employee as active. |
FirstName formula:
return await GetiPaaSCustomerData(RelatedToId, "FirstName");
LastName formula:
return await GetiPaaSCustomerData(RelatedToId, "LastName");
Email formula:
return await GetiPaaSCustomerData(RelatedToId, "Email");
LanguageId formula:
var value = GetCustomFieldValue(CustomFields, "Language ID");
if (!string.IsNullOrWhiteSpace(value)){
return value;
}
return await GetLanguageIdByName("English");Placeholder value — replace during implementation: the fallback language name "English" is an example default. It must be replaced with a language name that exists in the subscriber's Shopware instance, or the Language ID custom field should be supplied on the source record so the fallback is not needed. GetLanguageIdByName resolves only Latin-character names and returns nothing for a name it cannot find.
Error Handling
Errors surface in Dashboard / Integration Monitoring / Error Logs.
"<email> this email has already been existed in Shopware as the B2B-Employee": thrown by the B2B employee child filters when a relationship is not already linked to a Shopware employee but a B2B employee with the resolved email already exists. The relationship fails rather than being silently skipped. Resolution: link the existing employee to the source relationship, or remove the duplicate source relationship.
Required lookup resolves to nothing: when a named payment method, sales channel, customer group, or language does not exist in Shopware (or, on the Update parent, a category name does not match a customer group), the required value resolves to nothing and company creation/update fails. Resolution: confirm the referenced records exist in Shopware and align category names with existing customer-group names.
Address country does not resolve: when the supplied country does not resolve to a Shopware country, the address write fails for that record. Resolution: supply a country value that resolves to a Shopware country.
Shopware API temporarily unavailable: the transfer fails. Resolution: re-trigger the parent company transfer from iPaaS.com.
Testing & Validation
Test Scenarios
Transfer a new iPaaS.com company with at least one valid employee relationship and confirm the Add parent creates a B2B company with its addresses and employees.
Transfer a company that is already linked to a non-subsidiary Shopware company and confirm the Update parent updates the existing company rather than creating a duplicate.
Transfer a company whose Shopware link identifies it as a subsidiary and confirm the Update parent skips it.
Transfer a company without a valid employee relationship and confirm no B2B company is created.
Transfer a company referencing a payment method, sales channel, customer group, or language that does not exist in Shopware and confirm the transfer fails with the expected error.
Transfer a company whose employee email already exists in Shopware (and is not linked) and confirm the duplicate-email error is thrown.
Transfer an address with a non-US region and confirm state-resolution behavior.
Validation Checklist
The Shopware Commercial (B2B Suite) extension is installed before enabling the family.
The example named records (payment method, sales channel, customer group, language) have been replaced with names that exist in the target Shopware store.
The sample address_id_test mapping has been replaced with a real value or removed before going live.
New companies are routed to the Add parent and existing linked non-subsidiary companies to the Update parent.
Each created or updated company has its addresses linked by the composite address external ID and its employees linked under the Company Relationship entity.
Required address fields (recipient name, street, city, country) are present and the country resolves to a Shopware country.
Circular-update protection is in place where the opposite-direction "TO iPaaS.com" collections are also enabled.
Additional Notes
The named-language fallback (GetLanguageIdByName) accepts only Latin-character language names; for non-Latin languages, supply the Shopware language ID directly through the Language ID custom field. A region-specific value can include the variant, for example "English (US)".
The address state (region) formula assumes United States states because of its "US-" prefix; non-US state resolution should be validated in a staging environment before relying on it in production, at the time this documentation was written.
