Summary
Stock levels held in iPaaS.com can be written to commercetools inventory entries through two standalone mapping collections — Update commercetools Product Inventory Standalone FROM iPaaS.com for stock recorded against an iPaaS.com Product, and Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com for stock recorded against an iPaaS.com Product Variant. Both transfer automatically once the corresponding outbound subscriptions are enabled, and both have their own Manual Sync entry point. They exist so that a quantity change can move on its own cadence — which in normal operation is far more frequent than catalogue change — instead of requiring a full product transfer every time stock moves.
The two collections do not behave identically. Update commercetools Product Inventory Standalone FROM iPaaS.com performs updates only: it will not create an inventory entry, so an entry must already exist and already be linked before it can act. Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com both creates and updates. This article covers only these two standalone collections. The two child inventory collections that carry stock as part of a product or variant publish are covered by the product mapping documentation; the difference between the two pairs is set out under Duplicate or Conflicting Mappings below and is the single most important thing to get right before go-live.
ID Format
Manual Sync ID Format
Both collections transfer data from iPaaS.com, so the identifier entered on the Manual Sync page is the iPaaS.com-side record id — a numeric value shown on the inventory record in iPaaS.com. It is not a commercetools identifier and it is not a GUID.
For Update commercetools Product Inventory Standalone FROM iPaaS.com:
<iPaaS.com Product Inventory record id>
For Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com:
<iPaaS.com Product Variant Inventory record id>
The value is specific to your own subscription's records — open the inventory record in iPaaS.com to read it. There is no subscription setting that changes the accepted format, and neither collection accepts a composite parent-and-child form, because neither has child collections.
For Update commercetools Product Inventory Standalone FROM iPaaS.com the record entered must already be linked to a commercetools inventory entry, since that collection updates but does not create. A record with no link has nothing to update and produces no new entry.
External ID Format
After an inventory entry is written, iPaaS.com stores the identifier commercetools returned for that entry as the external-ID link on the iPaaS.com inventory record. The stored value is a commercetools identifier even though the transfer runs from iPaaS.com, and commercetools issues record identifiers as 36-character GUIDs (UUIDs) — 32 hexadecimal characters in five hyphen-separated groups of 8-4-4-12:
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
That link is what causes a later transfer of the same record to change the existing entry rather than create a second one. Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com establishes the link on the entries it creates. Update commercetools Product Inventory Standalone FROM iPaaS.com does not establish a link of its own — it relies on one created elsewhere.
Whether a dispatched record is added or updated is decided by whether that link is already present, not by which outbound event dispatched the transfer.
Deleted Record Support
Deletion is not supported. This integration does not delete commercetools inventory entries, and there is no delete path for any other entity either. Delete mappings are not included in the default mapping templates, and an inventory record removed in iPaaS.com is not removed from commercetools.
If a delete is nonetheless requested — for example by enabling a delete-triggered outbound data flow — the attempt fails with the runtime's generic "The method or operation is not implemented." message, which names neither the entity nor the collection. Remove inventory entries directly in commercetools instead. See Error Messages and Known Limitations.
Custom Field Support
This integration has no custom-field implementation. There is no conversion function for reading or writing commercetools custom fields, and there is no subscription setting that enables one. Custom fields defined on a commercetools inventory entry are neither read nor written by either collection, and no mapping in the shipped configuration references one.
Mapping Collection Status
Both collections are Enabled in the shipped configuration, and neither has a mapping filter applied — every inventory record dispatched to either collection is processed.
Update commercetools Product Inventory Standalone FROM iPaaS.com
Status: Enabled.
Sync type: Update only. This collection will not create a commercetools inventory entry. An iPaaS.com inventory record that has never been written to commercetools produces no new entry here.
Trigger Events: Automatic transfers are driven by iPaaS.com outbound event subscriptions, which subscribers or their MiSP enable under Outbound Data Flows in the subscription configuration. The scopes that drive this collection are:
product/inventory/createdproduct/inventory/updated
Because the collection is Update-only, a record dispatched by product/inventory/created for an item that has never been published to commercetools has nothing to act on — the scope is listed because it is registered for this collection type, not because it creates anything here.
Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com
Status: Enabled.
Sync type: Add/Update. This collection creates an inventory entry for a variant that has none, and updates the entry when one already exists.
Trigger Events: The scopes that drive this collection are:
product/variant/inventory/createdproduct/variant/inventory/updated
No automatic transfers occur for either collection until the relevant subscriptions are enabled. Enabling them is a deliberate configuration step, not a default — see Subscription Configuration – Edit and the Installation Instructions. Manual Sync is available on both collections at all times, whether or not any outbound subscription is enabled.
Duplicate or Conflicting Mappings
This is the section to read before enabling anything. There are four inventory mapping collections in this integration, not two. The two documented here are standalone root collections. Two further child collections — Add/Update commercetools Product Inventory FROM iPaaS.com (a child of the product collection) and Add/Update commercetools Product Variant Inventory FROM iPaaS.com (a child of the variant collection) — write stock into the same commercetools inventory entries from the same iPaaS.com data. Their mappings are documented in the product mapping documentation, not here; what belongs here is the relationship, because conflating the two roles is the likeliest configuration mistake in this integration.
Standalone Versus Child — What Actually Differs
The difference is role and entry point, not destination:
A child inventory collection carries stock as part of a product or variant publish. It runs when its parent runs. To push a stock change through a child collection, the whole product or variant has to be re-synced — there is no way to reach it on its own.
A standalone inventory collection exists for high-frequency, stock-only pushes. It is a root collection with its own Manual Sync entry point, so a single stock level can be pushed on demand without touching the product or variant it belongs to, and without re-writing any catalogue data.
That is the whole reason the standalone collections exist. Stock moves far more often than catalogue content does, and republishing a product for every quantity change is both slow and a much larger write.
The Overlap — Each Standalone Duplicates a Child
Each standalone collection writes the same iPaaS.com data type as one specific child collection:
Standalone collection | Duplicates this child collection | Shared iPaaS.com data type | Shared outbound scopes |
Update commercetools Product Inventory Standalone FROM iPaaS.com | Add/Update commercetools Product Inventory FROM iPaaS.com | Product Inventory |
|
Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com | Add/Update commercetools Product Variant Inventory FROM iPaaS.com | Product Variant Inventory |
|
The outbound scopes are defined per data type, not per collection. Each pair answers to an identical scope set. The scopes cannot distinguish a standalone collection from its child counterpart, so there is no way to route an event to one and not the other.
The consequence: if both members of a pair are enabled, every iPaaS.com inventory change is processed twice — once by the standalone collection and once through the child collection's parent transfer. This integration implements no collision handling on any collection, so nothing arbitrates between the two writes. The later write simply wins, and there is no single owner of the stock value in commercetools.
The Two Pairs Overlap Differently
The two pairs are not the same problem, and they do not have the same answer.
The Product-level pair is genuinely complementary
Update commercetools Product Inventory Standalone FROM iPaaS.com cannot create an inventory entry — only the child collection can. So the two divide cleanly: the child creates the entry when a product is first published, and the standalone carries ongoing stock movement afterwards. Running both in those distinct roles is a workable arrangement, and is the usual one. What must not be left unconsidered is that they still share their scopes, so an update event still reaches both. If the standalone collection is to own ongoing stock, use the parent product collection's Manual Sync deliberately for initial publishes rather than leaving both running against the same automatic events.
The Variant-level pair genuinely overlaps
Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com and its child counterpart both create and both update, so there is no natural division of labour — one of them should own ongoing stock movement. The usual arrangement is to leave the child collection enabled so that a newly published variant arrives with an initial stock level, and to use the standalone collection for everything afterwards. Note also that the two do not map an identical field set: the standalone collection also maps MinQuantity, so leaving both enabled means the same commercetools entry is written from two different mapping configurations.
Decide before go-live which collection owns ongoing stock updates in each pair, and configure the Outbound Data Flows subscriptions and the collection enablement to match that decision. See Known Limitations.
The Two Standalone Collections Against Each Other
Update commercetools Product Inventory Standalone FROM iPaaS.com and Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com are not duplicates of each other, provided each item's stock is held in one place in iPaaS.com. If your iPaaS.com data records stock at both the product and the variant level for the same item, the two collections can write competing values into the same commercetools inventory entry — because commercetools identifies an inventory entry by its stock keeping unit and supply channel, and both paths can resolve to the same one.
No Duplicate Detection
This integration implements no duplicate detection and no match-and-link behavior on any collection. An inventory entry that already exists in commercetools but was never linked through iPaaS.com is not detected or reused. For the variant standalone collection, that means a second entry may be created for the same stock keeping unit and channel, or the write may be rejected by commercetools. For the product standalone collection, an unlinked record simply has nothing to update.
Unmapped Fields Are Left Alone
Unlike the customer, product and location flows in this integration, inventory writes are guarded — the integration reads the stored inventory entry immediately before writing and sends only the values that have actually changed. Inventory fields that these collections do not map — restock lead time, expected delivery, cart quantity limits, and reservation-related values — are left as they are in commercetools. Removing an unrelated mapping does not clear a commercetools value on these collections.
Two mappings are exceptions, and both matter on a create. Quantity and MinQuantity are non-nullable whole numbers that default to 0. Removing either mapping does not mean "nothing is written" — it means zero is written:
Removing Quantity sends a stock level of zero.
Removing MinQuantity on Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com publishes every newly created entry with an available quantity of zero, so the item reads as out of stock in commercetools even though a stock quantity was sent.
This applies to any path that creates an entry. Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com has a create path, so it is exposed. Update commercetools Product Inventory Standalone FROM iPaaS.com has no create path and does not map MinQuantity at all, so the available-quantity effect does not arise there — but an item whose availability reads as zero despite correct stock should be checked against the collection that created its entry, which for a Product-level item is Add/Update commercetools Product Inventory FROM iPaaS.com.
Keep Quantity mapped on both collections and MinQuantity mapped on the variant collection.
Supported Child Collections
None. Both collections documented here are root collections with no child collections. Everything each of them writes is written in a single transfer by that collection alone, with no dependent record pass.
This is precisely what makes them standalone. The child inventory collections — Add/Update commercetools Product Inventory FROM iPaaS.com and Add/Update commercetools Product Variant Inventory FROM iPaaS.com — are children of the product and variant collections respectively, are documented with those collections, and are not children of anything described here.
Neither collection is a parent, and neither is a child. They do, however, depend on Add commercetools Location FROM iPaaS.com having run first. That is a prerequisite, not a parent-child relationship: this integration performs no automatic dependency transfer, so a location is never pulled through as a side effect of an inventory transfer. See Setup Requirements.
System Caveats
commercetools Caveats
Stock keeping unit and supply channel are the identity of an inventory entry. commercetools identifies an inventory entry by its stock keeping unit together with its supply channel. Neither collection sets the stock keeping unit from a mapping — Update commercetools Product Inventory Standalone FROM iPaaS.com acts on an entry that already carries one, and Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com reads it from the commercetools product record when it creates an entry. A variant whose commercetools record carries no stock keeping unit cannot receive inventory. There is no mapping for it in either collection and none should be added.
The supply channel is effectively required, even though commercetools documents it as optional. commercetools permits an inventory entry with no supply channel, but this integration cannot update such an entry — every later change to it fails, and it can only be corrected in commercetools directly. For Update commercetools Product Inventory Standalone FROM iPaaS.com, which does nothing but update, an entry in that state is entirely beyond its reach. Keep the Location mapping in place on both collections and make sure it resolves for every record.
A supply channel created by this integration may lack the inventory-supply role. commercetools marks a channel as usable for tracking inventory by giving it an inventory-supply role. When Add commercetools Location FROM iPaaS.com creates a channel it does not set that role, so transferring a location is necessary but may not be sufficient to make the channel accept stock. Before relying on inventory transfers in production, open each channel that will hold stock in commercetools, confirm it carries the inventory-supply role, and add the role there if it is missing.
Inventory supply channel quota. commercetools allows 100 inventory supply channels per store, and that figure is configurable per project rather than a hard limit. See
https://docs.commercetools.com/api/limits(retrieved 2026-07-20). Subscribers running more distinct stock locations than that should raise the limit with commercetools before transferring them.Moving stock between supply channels may fail even where creating against a channel succeeds. The supply-channel reference is not sent in the same form on the create path as on the update path, so a channel move on an existing entry may be rejected by commercetools while a create against the same channel works. Every channel change made through Update commercetools Product Inventory Standalone FROM iPaaS.com takes the update path, so that collection is the most exposed. Validate channel moves specifically in a staging environment before relying on them in production, and watch Dashboard / Integration Monitoring / Error Logs on the first attempt.
Available quantity is calculated by commercetools and will not always equal what was sent. commercetools reports available quantity as stock on hand less any reservations. Neither collection sends available quantity when changing an entry that already exists; only the create path on Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com sends it, from MinQuantity. Subscribers should validate in a staging environment what commercetools stores and reports for available quantity before relying on it.
Record versioning. The stored inventory entry is read immediately before it is changed. If the commercetools entry is edited elsewhere between that read and the write, the change is rejected and the transfer must be re-run. Because these collections are intended for high-frequency use, expect occasional rejections of this kind on items also being edited in commercetools directly.
Rate limiting. commercetools publishes its request limits and per-project quotas at
https://docs.commercetools.com/api/limits(retrieved 2026-07-20), where some limits are fixed and others can be raised per project on review. High-frequency stock pushes are the flow in this integration most likely to encounter a limit, and each write costs more than one commercetools request because the current record — and, on the variant collection, the product — is read around the change. This integration makes no claim that a declined request is retried, rescheduled or resumed. Treat a declined request as a failed transfer: monitor Dashboard / Integration Monitoring / Error Logs, re-run affected records with Manual Sync, and validate expected throughput in staging.
iPaaS.com Caveats
Inventory updates are filed in the Activity Tracker under Product Category, not under Product Inventory or Product Variant Inventory. Records created for the first time are filed correctly; it is the update path that is mis-filed, so a stock change to an existing entry is the case that goes missing from where you would look for it. Subscribers looking for evidence that a stock change was applied will not find it filed where they expect — look under the Product Category entries for the same time period. Errors raised during an inventory write are affected the same way; review them in Dashboard / Integration Monitoring / Error Logs, where they can be found by record and timestamp. This matters more here than on any other collection in the integration, because a stock-only push produces no other visible trace: nothing about the product changes, so the Activity Tracker is the only place a subscriber would think to look.
This collection adds nothing on the Product-level standalone path. Update commercetools Product Inventory Standalone FROM iPaaS.com has a sync type of Update. Stock for an item that has never been published will not appear until the item is published through the child collection.
The field list offered when mapping either inventory type is identical. Product Inventory and Product Variant Inventory share one set of available fields, so a field that is only meaningful for one of them still appears when mapping the other. Map only the fields shown in the mapping tables below.
Field references in Dynamic Formulas use PascalCase on the iPaaS.com source side, matching the field names shown in the mapping editor.
The connection test reports success without contacting commercetools. A configuration problem in the connection settings is not caught by the test — it surfaces at the first transfer instead, as an authorization failure in Dashboard / Integration Monitoring / Error Logs. Validate the settings by running a single Manual Sync rather than relying on the test result. See Connections and Settings.
Integration-Specific Caveats
Locations must be transferred before the inventory that references them. The Location mapping does not pass the iPaaS.com location value through unchanged — it converts the iPaaS.com Location into the matching commercetools supply channel by reading the link iPaaS.com holds for that Location. When no link can be found, the transfer stops with an error rather than writing the entry without a supply channel. This integration performs no automatic dependency transfer, so the location is never pulled through on demand.
There is no inbound inventory flow. Both collections are outbound only. Nothing brings commercetools stock levels back into iPaaS.com, so commercetools is never the system of record for stock in this integration.
Bulk initialization is not supported. There is no first-load path for inventory outside of normal transfers, and no initialization scope should be enabled for either collection.
Setup Requirements
iPaaS.com Configuration
Complete the commercetools connection settings before the first transfer, and confirm them with a single Manual Sync rather than with the connection test. See Connections and Settings.
Run Add commercetools Location FROM iPaaS.com for every iPaaS.com Location referenced by inventory, before any inventory transfer.
Publish products and variants before their inventory. Update commercetools Product Inventory Standalone FROM iPaaS.com requires an inventory entry that already exists and is already linked; Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com requires the commercetools product and variant to exist, with a stock keeping unit on the variant.
Enable the outbound subscriptions you actually want under Outbound Data Flows —
product/inventory/createdandproduct/inventory/updatedfor the Product-level collection,product/variant/inventory/createdandproduct/variant/inventory/updatedfor the variant-level collection. Until they are enabled, inventory transfers only through Manual Sync. The full walkthrough is in the Installation Instructions.Decide which collection in each pair owns ongoing stock updates before go-live, and enable accordingly. See Duplicate or Conflicting Mappings above.
Confirm that Quantity is mapped on both collections and MinQuantity on the variant collection, since an unmapped value writes zero rather than nothing.
commercetools Configuration
Confirm the API client credentials used by the integration are permitted to read products and to create and update inventory entries. The credential set and the endpoints used are described in Connections and Settings and API Endpoints.
Assign the inventory-supply role to every channel that is intended to hold stock. Channels created by Add commercetools Location FROM iPaaS.com are created without it.
Confirm the project's inventory supply channel allowance covers the number of stock locations in use, and raise it with commercetools if not.
Confirm every variant that will carry stock has a stock keeping unit on its commercetools record.
Correct any inventory entry that already exists in commercetools without a supply channel, directly in commercetools. Such an entry cannot be repaired through this integration.
Integration Flow
A transfer is raised for an iPaaS.com inventory record — either by an enabled outbound subscription on the matching scope, or by a subscriber entering the numeric iPaaS.com record id on the Manual Sync page.
iPaaS.com checks whether the record already carries an external-ID link to a commercetools inventory entry. This, not the dispatching scope, decides whether the transfer creates or updates.
The collection evaluates its mappings against the source record. The Location mapping resolves the iPaaS.com Location to a commercetools supply channel by reading the link stored for that Location; if no link exists, the transfer stops here with an error and nothing is written.
On the variant collection creating a new entry: the ProductId mapping resolves the commercetools product that owns the variant, that product is read from commercetools, the variant is located on it, and the variant's stock keeping unit is taken from the product record. If no product identifier is resolved, the transfer stops with an error stating that a product identifier is required. A new inventory entry is then created carrying the stock keeping unit, the mapped stock quantity, the mapped supply channel, and an available quantity taken from MinQuantity.
On either collection changing an entry that already exists: the stored commercetools inventory entry is read first, and only values that actually differ are sent. If the supply channel already matches, no channel instruction is sent; if the stock quantity already matches, no quantity instruction is sent. A record whose values are unchanged produces a write that changes nothing. Available quantity is never sent on this path.
commercetools validates the request. A version conflict, a rejected channel move, a missing stock keeping unit, or an authorization failure causes a rejection, recorded in Dashboard / Integration Monitoring / Error Logs.
On success the saved entry is read back so that iPaaS.com holds the current commercetools state, and — where the entry was newly created — its commercetools GUID identifier is stored as the external-ID link on the iPaaS.com record.
The activity is recorded in the Activity Tracker. For an update to an existing entry it is filed under Product Category rather than under an inventory heading; a first-time create is filed correctly.
Mappings
Update commercetools Product Inventory Standalone FROM iPaaS.com
iPaaS.com data type: Product Inventory
Description: Pushes a stock-level change from an iPaaS.com Product to the matching commercetools inventory entry, on its own, without republishing the product. This collection updates only — it does not create inventory entries. It has no mapping filter, so every inventory record dispatched to it is processed.
Mapping Type | Source Field (iPaaS.com) | Destination Field (commercetools) | Description |
Dynamic Formula |
|
| Required in practice. Sets the commercetools supply channel the stock sits in. The formula does not pass the iPaaS.com Location value through unchanged — it converts the iPaaS.com Location into the matching commercetools supply channel by reading the link iPaaS.com holds for that Location. commercetools documents the supply channel as optional on an inventory entry, but an entry that exists without one cannot be updated through this integration at all, and since this collection does nothing but update, such an entry is entirely beyond its reach and must be corrected in commercetools directly. The Location must have been transferred by Add commercetools Location FROM iPaaS.com first; when no link is found, the transfer stops with an error. Every channel change made here takes the update path, which is the path most exposed to a rejected channel move. |
Field |
|
| Required in practice. The stock on hand written to the commercetools inventory entry, taken from the available quantity on the iPaaS.com inventory record. This is the value the collection exists to move. The quantity is only sent if it differs from the value currently stored in commercetools, so a record whose quantity has not changed produces a write that changes nothing. If the mapping is removed, a stock level of zero is sent whenever the stored value is not already zero — it is not left alone. commercetools distinguishes this stock on hand from the available quantity it reports, which it calculates as stock on hand less reservations; this collection never sends available quantity. |
Dynamic Formula |
|
| Recommended. Supplies the commercetools product the inventory belongs to, by reading the link iPaaS.com holds between the parent iPaaS.com Product and its commercetools product record. Because this collection performs updates only, its update path locates the entry to be changed through the link recorded when that entry was first created and does not read this value. The mapping is kept so the collection's configuration remains correct if the same data is ever transferred through a path that does create entries, where a product identifier is required. Leave it mapped. |
There are no Static or Lookup mappings in this collection, so there are no lookup translation tables. No mapping in this collection carries a placeholder value requiring replacement during implementation.
Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com
iPaaS.com data type: Product Variant Inventory
Description: Pushes a stock-level change from an iPaaS.com Product Variant to the matching commercetools inventory entry, on its own, without republishing the variant or the product above it. Unlike its Product-level counterpart, this collection handles both new inventory entries and changes to existing ones. It has no mapping filter, so every variant inventory record dispatched to it is processed.
Mapping Type | Source Field (iPaaS.com) | Destination Field (commercetools) | Description |
Dynamic Formula |
|
| Required in practice. Sets the commercetools supply channel the variant's stock sits in, by converting the iPaaS.com Location into the matching commercetools supply channel through the link iPaaS.com holds for that Location. commercetools documents the supply channel as optional, but an entry written without one cannot be updated through this integration afterwards — every later change to it fails and it can only be corrected in commercetools directly. The Location must have been transferred by Add commercetools Location FROM iPaaS.com first; when no link is found, the transfer stops with an error. On a new entry the resolved channel is written with the entry; on an existing entry the channel instruction is only sent when the resolved channel differs from the stored one, and that instruction may be rejected even where a create against the same channel succeeds. |
Field |
|
| Required in practice. The stock on hand recorded against the commercetools inventory entry for this variant, taken from the available quantity on the iPaaS.com variant inventory record. This is the value the collection exists to move, and commercetools treats the stock quantity and the stock keeping unit as the only required values on a new inventory entry (commercetools HTTP API documentation for inventory entries, retrieved 2026-07-20). On an entry that already exists, the quantity is only sent if it differs from the stored value. If the mapping is removed, a stock level of zero is written — it is not left alone. |
Dynamic Formula | Multi-line formula — reproduced in full immediately after this table. |
| Required. Supplies the commercetools product that owns the variant the inventory belongs to. The integration uses it to read the product back from commercetools so it can locate the variant and take the stock keeping unit from the product record. If it resolves to nothing — because the record identifier carries no variant portion, because the variant resolves to no Product, or because that Product has never been published — the transfer stops with an error stating that a product identifier is required, and no inventory entry is written. |
Field |
|
| Recommended — keep it mapped. Sent as the available quantity when the integration creates a new commercetools inventory entry. It is sent whether or not the mapping is in place: with the mapping removed it is sent as zero, so every entry created afterwards is published showing no availability and reads as out of stock. Removing the mapping does not leave the value alone; it publishes zero. It is not sent when an entry that already exists is changed, so a correction made in iPaaS.com after the entry exists does not reach commercetools through this collection. When the source is empty, zero is sent. commercetools also reports an available quantity it calculates itself, as stock on hand less reservations, so what it reports will not always equal what was sent. |
Dynamic Formula |
|
| Recommended. Supplies the commercetools variant this stock belongs to, by reading the link iPaaS.com holds between the parent iPaaS.com Product Variant and its commercetools variant record. It records which variant the inventory record was raised against and keeps the transferred record associated with the right variant. Requires that the variant has already been transferred by Add/Update commercetools Product Variant FROM iPaaS.com; when the parent variant has never been published, this resolves to nothing. Leave it mapped. |
The ProductId mapping's formula, reproduced verbatim:
int parentPos = Id.IndexOf('|');
int VariantId = Convert.ToInt32(Id.Substring(0, parentPos));
var parentId = await ParentIdFromVariantId(VariantId);
return await GetExternalIdAsync(parentId, "Product", SpaceportSystemId);The formula works in three steps. It reads the variant identifier out of the leading portion of the inventory record's own composite identifier, up to the pipe character that separates it from the rest. It resolves that variant back to the iPaaS.com Product it belongs to. It then reads the link iPaaS.com holds between that Product and its commercetools product record, and returns the commercetools product identifier.
There are no Static or Lookup mappings in this collection, so there are no lookup translation tables. No mapping in this collection carries a placeholder value requiring replacement during implementation. There is no mapping for the stock keeping unit in either collection and none should be added — it is always taken from the commercetools product record.
Error Handling
The full catalog of messages, including the connection and authentication errors that apply before any transfer runs, is in Error Messages. The entries below are the ones an inventory transfer is most likely to produce. Note that some of these are written to the Activity Tracker rather than to the Error Logs, and that inventory activity is filed there under Product Category.
"Product Id Is Required" — the ProductId mapping resolved to nothing on a create, so the integration could not read the commercetools product and could not take the variant's stock keeping unit from it. This applies to Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com, which is the standalone collection with a create path. Resolution: confirm the variant's parent product has been transferred to commercetools by Add/Update commercetools Product FROM iPaaS.com, that the variant itself has been transferred, and that the iPaaS.com inventory record carries the composite identifier the formula expects. Then re-run with Manual Sync.
"Recieved ErrorException from externalSystem's iPaaSCallWrapper.{action}. See Tech log for more details" — an iPaaS.com lookup failed. On the inventory collections this is the message that appears when a Location has never been transferred to commercetools, so no supply channel link exists to resolve. The misspelling is present in the shipped text and is reproduced so it can be searched for; this wording is written to the Activity Tracker rather than to the Error Logs. Resolution: transfer the referenced Location through Add commercetools Location FROM iPaaS.com, confirm the resulting channel carries the inventory-supply role, then re-run the inventory transfer.
"Error calling CommerceTool CallWrapper.{action}: {response body} (Http Code: {status})" — commercetools rejected the inventory request. The useful detail is the response body, which names the offending field. Common causes on inventory are a version conflict (the entry was edited elsewhere between the read and the write), a rejected supply-channel change on an existing entry, a channel that does not carry the inventory-supply role, and a missing stock keeping unit on the variant's commercetools record. Note that the action name for the inventory operations is spelled inconsistently between the create and update paths, so a case-sensitive search of the Error Logs should try both Inventory_POST and Inventory_Post. Resolution: read the response body in the Error Logs entry, correct the underlying condition, then re-run with Manual Sync.
"Call to CollectionUpdate with unhandled parameters: System={system} {collection}, sourceObject is null" — the transfer reached the write stage but no record had been built, typically because every mapped field evaluated to empty. Resolution: confirm the iPaaS.com inventory record carries the values the mappings read, and that the mappings are intact, then re-run.
"Invalid data passed to {record}.SetPrimaryKey: {value}" — commercetools accepted the inventory entry but its identifier could not be stored against the iPaaS.com record, so the entry exists without a link back to iPaaS.com. This matters on inventory because the update path depends on that link. Resolution: confirm the entry exists in commercetools, then re-run the transfer so the link can be established.
"The method or operation is not implemented." — a delete was requested for a commercetools inventory entry. Delete is not supported for any entity in this integration and the message names neither the entity nor the collection. Resolution: remove any configuration that asks the integration to delete a commercetools record, including delete-triggered outbound data flows, and remove inventory entries directly in commercetools.
"Recieved ErrorException from {action}. See Tech log for more details" — the request never reached commercetools, or the response could not be read: a name-resolution, TLS or timeout failure. Resolution: confirm the host in the API Url setting is reachable and correctly spelled, including its region component, then re-run. See API Endpoints.
Validation Rules
A supply channel must resolve for every inventory record. Enforced by the integration: an iPaaS.com Location with no linked commercetools supply channel stops the transfer with an error rather than writing an entry without a channel.
An inventory entry that carries no supply channel cannot be updated. Enforced by the integration. There is no repair path through this integration; correct the entry in commercetools.
A product identifier is required on the create path. Enforced by the integration on Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com: an unresolved product identifier stops the transfer before anything is written.
The stock keeping unit cannot be supplied by a mapping. Enforced by the integration: it is always taken from the commercetools product record, so a variant whose commercetools record carries no stock keeping unit cannot receive inventory.
Quantity and MinQuantity default to zero when unmapped. Enforced by the integration: neither is omitted when unmapped — each is written as zero on the paths that send it.
The stored entry version must be current at the moment of the write. Enforced by commercetools: an entry edited elsewhere between the read and the write causes the change to be rejected.
Only linked records are written by the Product-level standalone collection. Enforced by the integration: its sync type is Update, so a record with no commercetools link produces no write and no new entry.
No mapping filter is applied on either collection. Every inventory record dispatched to either collection is processed; there are no conditions under which a record is silently skipped by these collections.
Testing & Validation
Test Scenarios
Transfer a variant stock level that creates a new entry. Choose a variant whose product and variant are already published to commercetools and which has no inventory entry, set a distinct quantity in iPaaS.com, and run Manual Sync on Add/Update commercetools Product Variant Inventory Standalone FROM iPaaS.com with the numeric iPaaS.com record id. Confirm a new inventory entry appears in commercetools against the expected supply channel, with the expected stock quantity, and that the iPaaS.com record now carries a commercetools GUID as its external-ID link.
Confirm the available quantity on a newly created entry. On the entry created above, check what commercetools reports as available quantity and compare it against the MinQuantity source value. Then remove the MinQuantity mapping in a staging subscription, create another entry, and confirm the effect — the entry is expected to publish with an available quantity of zero and read as out of stock. Restore the mapping.
Update an existing stock level. Change the quantity on an iPaaS.com record that is already linked, re-run Manual Sync, and confirm only the stock quantity changed in commercetools and that unmapped inventory values — restock lead time, expected delivery, cart quantity limits — are unchanged.
Confirm the no-op case. Re-run the same transfer without changing anything and confirm nothing changes in commercetools.
Verify Update-only behavior on the Product-level collection. Run Manual Sync on Update commercetools Product Inventory Standalone FROM iPaaS.com with the id of an iPaaS.com inventory record that has never been written to commercetools. Confirm that no inventory entry is created. Then publish the item through the product collection with its inventory child collection enabled, and confirm the standalone collection can update it afterwards.
Verify the location prerequisite. Attempt a transfer referencing an iPaaS.com Location that has not been transferred to commercetools, and confirm the transfer stops with an error rather than writing an entry with no supply channel.
Verify the channel role requirement. Transfer stock against a channel created by Add commercetools Location FROM iPaaS.com before assigning the inventory-supply role, and again after assigning it. Record which behavior you observe in your project.
Verify a channel move. Change the Location on an already-linked inventory record so it resolves to a different supply channel, transfer, and confirm whether commercetools accepts the move. Do this in staging before relying on channel moves in production.
Verify the automatic path. Enable one scope pair under Outbound Data Flows, change a stock level in iPaaS.com, and confirm the change reaches commercetools without any Manual Sync.
Verify the double-processing behavior deliberately. In staging, enable both a standalone collection and its child counterpart, raise one stock change, and observe that the change is processed twice with no arbitration between the writes. Then disable whichever collection is not to own ongoing stock.
Locate the activity record. After any of the transfers above, find the corresponding Activity Tracker entry under Product Category and confirm the timestamp matches, so support staff know where to look.
Validation Checklist
Every iPaaS.com Location referenced by inventory has been transferred to commercetools and carries a linked supply channel.
Every channel intended to hold stock carries the inventory-supply role in commercetools.
The project's inventory supply channel allowance covers the number of stock locations in use.
Every variant intended to carry stock has a stock keeping unit on its commercetools record.
Quantity is mapped on both collections and MinQuantity is mapped on the variant collection.
No inventory entry in commercetools exists without a supply channel.
A decision has been recorded for each pair as to which collection owns ongoing stock updates, and the enabled collections and Outbound Data Flows subscriptions match that decision.
Stock quantities in commercetools match the corresponding iPaaS.com values for a representative sample of items.
Available quantity in commercetools has been checked against expectation on newly created entries.
Dashboard / Integration Monitoring / Error Logs shows no unresolved inventory failures, and Activity Tracker entries have been located under Product Category.
Additional Notes
The following are outside the scope of the two collections documented here:
Creating Product-level inventory entries. Update commercetools Product Inventory Standalone FROM iPaaS.com updates only; new Product-level entries come from Add/Update commercetools Product Inventory FROM iPaaS.com, which is documented with the product mapping collections.
The two child inventory collections' own mappings. They are covered by the product mapping documentation. Only their relationship to these two collections is described here.
Inventory delete. Not performed in either direction.
Reading stock back from commercetools. Both collections are outbound only; there is no inbound inventory flow.
Reservations and stock values beyond stock on hand. Restock lead time, expected delivery, cart quantity limits and reservation handling are not written.
The stock keeping unit. Never supplied by a mapping — always taken from the commercetools product record.
Channel roles. Not set by this integration; assign them in commercetools.
Inventory custom fields. Not written.
Duplicate detection and conflict resolution. Not implemented for any collection in this integration.
Bulk initialization of inventory that already exists in commercetools.
For the integration-wide statement of what is and is not supported, see Known Limitations. For assistance, contact iPaaS.com Support at support@ipaas.com.
