Summary
Heartland product records are transferred into iPaaS.com as Product records. The same collection both creates new iPaaS.com products and updates existing ones, so it is used whether the Heartland item is new to iPaaS.com or already linked.
Heartland distinguishes two kinds of item, and that distinction drives the whole family. A simple item (including a simple associated item) becomes an iPaaS.com Product. A grid item is a configurable product whose sellable combinations are its variants; a grid item does not become a standalone iPaaS.com product. Instead, its combinations are transferred as iPaaS.com Product Variants through the Add/Update Heartland Product Variant TO iPaaS.com child collection. The parent collection's mapping filter is what enforces this split, and the variant child collection's filter is its exact mirror.
Four child collections ride along with the parent product transfer: the product's per-location inventory, its options, its variants, and the add-on items Heartland offers alongside it. None of them runs on its own. Alongside the native iPaaS.com product fields, the parent and variant collections store a set of Heartland-specific values — cost, financial class, online availability, long description, primary vendor id, primary vendor name, tags, and the track-inventory flag — on iPaaS.com custom fields.
This document covers the Heartland → iPaaS.com direction. A separate collection writes products in the opposite direction, from iPaaS.com into Heartland; it is a different flow with different trigger semantics and is listed under Duplicate or Conflicting Mappings.
ID Format
Manual Sync ID Format
Because Heartland uses different APIs for grid items and for simple or simple associated items, the Heartland item ID on its own is not enough to identify a record — the same ID number can exist under both types. A type suffix is therefore appended to every product identifier.
On the iPaaS.com Manual Sync page, enter the Heartland item or grid ID with its type suffix in the Heartland input field:
Simple item: append _SIMPLE — for example, 101602_SIMPLE.
Grid item: append _GRID — for example, 101602_GRID.
A record ID entered without one of these suffixes returns a not-implemented error, because the integration cannot determine which Heartland API to call. Transferring a product this way also transfers its inventory, options, variants, and add-on related products in the same operation.
External ID Format
After a successful transfer, iPaaS.com records the Heartland product's identifier with its type suffix as the external-id link between the two systems — for example, 101602_GRID or 12345_SIMPLE. Subsequent transfers of the same item match on that external id and update the existing iPaaS.com record rather than creating a second one. Whether an incoming product is created or updated is determined by whether that external id is already linked, not by which event triggered the transfer.
The _SIMPLE suffix also appears inside the add-on child collection's logic, where a non-grid add-on item's identifier has the suffix appended before the iPaaS.com lookup is performed.
Deleted Record Support
Deleting a Heartland product is not supported by this integration, at any level of the family. The integration creates and updates iPaaS.com records only. Removing or deactivating a Heartland item, variant, inventory record, option, or add-on relationship does not delete or deactivate the corresponding iPaaS.com Product, Product Variant, Product Inventory, Product Option, or related-product record. Records that should no longer appear must be managed directly in iPaaS.com.
One partial exception is worth knowing about, and it is not a deletion the integration performs. When iPaaS.com updates a product option, option values that are not included in the incoming request are removed from that option. Because the option collection ships with no mappings, this behavior is not currently exercised by the template, but it becomes relevant the moment option mappings are added. See Mappings.
If a Heartland item is deactivated rather than deleted, the parent collection's Status mapping does carry that through: an inactive Heartland item is transferred with the iPaaS.com status Disabled. Deactivating in Heartland is therefore the reliable way to retire a product through the integration.
Custom Field Support
This family stores a consistent set of Heartland values on iPaaS.com custom fields at both the product and variant level:
Heartland Cost: the Heartland item or grid item cost.
Heartland Financial Class: the Heartland financial class identifier.
Heartland Item Available Online: the Heartland online-availability flag.
Heartland Long Description: the Heartland long description. This is a separate custom field from the native iPaaS.com product Description field, which this collection does not map.
Heartland Primary Vendor Id: the Heartland primary vendor identifier.
Heartland Primary Vendor Name: the vendor name resolved from that identifier.
Heartland Tags: the Heartland item tags, combined into a single comma-separated string.
Heartland Track Inventory: the Heartland track-inventory setting.
Each requires a matching iPaaS.com subscription custom field on the relevant collection — Product for the parent, Product Variant for the variant child — before its value is stored. If the custom field does not exist, the product still transfers and the remaining fields are written; only that custom value is not retained.
The collections can also read arbitrary Heartland item custom field values. Add a mapping of type Dynamic Formula whose source calls GetValueFromCustomField with the name of the Heartland custom field, and choose any iPaaS.com destination. At transfer time the integration returns the value of the named Heartland custom field.
Important: grid item custom field values and simple item custom field values are returned by the Heartland API in different objects. Grid item values are found in the Heartland ItemCustom object; simple and simple associated item values are found in the Heartland Custom object. A formula that must handle both types has to check the product type and read from the appropriate object — the parent collection's shipped custom-field formula demonstrates exactly this pattern. A Heartland custom field must be created in Heartland before it is available to mappings.
Both the parent and variant collections ship a placeholder custom-field mapping — C5_Custom_Product and C5_Custom_Product_Variant — whose source names the sample field "My Custom Item Field". Replace that name with a real Heartland custom field, or remove the mapping, before going live.
Mapping Collection Status
Status: Enabled. The parent collection's mapping filter transfers only Heartland items that are not grid items; grid items are transferred through the variant child collection instead.
Trigger Events: The integration registers product created, updated, and polling events, and equivalent created, updated, and polling events for product inventory, product variants, product variant inventory, and product options. In practice automatic transfers run on a schedule through polling: Heartland's webhook format is not compatible with iPaaS.com instant webhooks, so products arrive through polling rather than instant push notifications. Product polling searches for simple items and simple associated items changed since the last polling time, and a change to a variant is processed as a single update to its parent grid item. Polling does not run until the subscription is configured and enabled. Individual products can also be transferred at any time from the iPaaS.com Manual Sync page. The four child collections have no trigger of their own; they run only as part of a parent product transfer.
Duplicate or Conflicting Mappings
Other mapping collections operate on the same iPaaS.com records. They fall into two groups.
The opposite direction — writing products into Heartland. Add/Update Heartland Product FROM iPaaS.com creates and updates Heartland items from iPaaS.com product data, with its own child collections for variants, inventory, options, option values, and variant options. It is not the reverse of this collection in a symmetric sense: its mappings, its trigger, and its record-matching behavior all differ.
Standalone inventory, same direction. Add Heartland Product Inventory Standalone TO iPaaS.com, Update Heartland Product Inventory Standalone TO iPaaS.com, Add Heartland Product Variant Inventory Standalone TO iPaaS.com, and Update Heartland Product Variant Inventory Standalone TO iPaaS.com transfer Heartland inventory levels into iPaaS.com on their own polling schedule, without re-transferring the whole product. These are documented separately in Heartland to iPaaS.com Standalone Inventory Mapping Documentation and should not be confused with the Add/Update Heartland Product Inventory TO iPaaS.com child collection documented here. The distinction is the trigger, not the destination: the child collection moves inventory only when its product moves, while the standalone collections poll inventory changes on their own. Both write to the same iPaaS.com Product Inventory records, so running both is a supported and common configuration — the standalone collections keep levels fresh between full product transfers.
Inventory in the opposite direction. Add/Update Heartland Product Inventory Adjustment FROM iPaaS.com and Add/Update Heartland Product Variant Inventory Adjustment FROM iPaaS.com write inventory changes from iPaaS.com back into Heartland as adjustments. Heartland levels read in through this family are read-only; outbound quantity changes are applied through the adjustment collections, never by writing these fields back.
Important: Template mapping collections are provided in both directions, but running them all bi-directionally is not recommended. Before running the inbound and outbound directions together, review your mapping collection filters and clearly define which system is the source of truth for product and inventory data. If both directions are active with the default mappings, review your polling schedules with your integration specialist to prevent a feedback loop.
Collision Handling
This integration does not use iPaaS.com collision handling for products. Whether an incoming product is created or updated is determined solely by whether its Heartland external id is already linked in iPaaS.com; there is no collision recovery step to configure.
Supported Child Collections
The parent Add/Update Heartland Product TO iPaaS.com collection has four child collections. None of them runs independently, and none has its own schedule, webhook, or Manual Sync entry:
Add/Update Heartland Product Add On Product TO iPaaS.com: attaches the products returned by the Heartland add-on item filter to the iPaaS.com product as related products.
Add/Update Heartland Product Inventory TO iPaaS.com: transfers the product's per-location inventory levels and unit cost.
Add/Update Heartland Product Option TO iPaaS.com: carries the product's options. It ships with no mappings configured — see Mappings.
Add/Update Heartland Product Variant TO iPaaS.com: transfers each Heartland grid item combination as an iPaaS.com product variant.
Two of those children carry nested collections of their own, which are dispatched under the same parent product transfer. The full hierarchy is three levels deep:
Add/Update Heartland Product TO iPaaS.com
Add/Update Heartland Product Add On Product TO iPaaS.com
Add/Update Heartland Product Inventory TO iPaaS.com
Add/Update Heartland Product Option TO iPaaS.com
Add/Update Heartland Product Option Value TO iPaaS.com: transfers the allowed values under each product option — the individual sizes under a "Size" option, or the colors under a "Color" option.
Add/Update Heartland Product Variant TO iPaaS.com
Add/Update Heartland Product Variant Option TO iPaaS.com: transfers each variant's option assignments, the option name and value combination that distinguishes it within the grid product.
Add/Update Heartland Product Variant Inventory TO iPaaS.com: transfers each variant's per-location inventory levels and unit cost.
Every collection in that tree is documented in this article, under Mappings, in the order shown. None of them has a trigger, schedule, webhook, or Manual Sync entry of its own — a single parent product transfer drives the whole tree.
System Caveats
Heartland Caveats
Item and grid types are different APIs: Heartland serves grid items and simple or simple associated items through separate APIs, and some field names differ between the two. This is why every product identifier carries a _SIMPLE or _GRID suffix, and why several parent mappings read a grid field first and fall back to the simple field.
Grid items are never standalone products: a grid item is transferred as a set of iPaaS.com product variants under a parent product, not as a product of its own.
Required source data: Heartland requires a description on every item, and the default cost and current price must be present for a product to transfer successfully.
Barcode length: Heartland enforces an undocumented barcode format that limits barcode length. A product or variant barcode that exceeds the allowed length can cause validation errors on later transfers. Provide a compliant barcode, or omit the barcode and accept the Heartland auto-generated value.
Hidden Retail Online location: Heartland maintains an internal, hidden Heartland Retail Online location. Inventory for that location is deliberately excluded by the inventory child collection's filter and never reaches iPaaS.com. This is by design; do not expect its quantities to appear.
Inventory levels are read-only: Heartland inventory transferred to iPaaS.com is a read-only stock level. Changing an iPaaS.com quantity does not change Heartland stock through this collection.
Options are pick-list custom fields: Heartland maintains product options and their values as allowed values on item custom fields, and only pick-list type custom fields are supported for options and option values.
Add-on items come from a filter: a Heartland product contributes related products only when it has an add-on item filter defined. That filter can return hundreds of products.
Custom field visibility: a Heartland custom field must be created in Heartland before it is available to mappings.
Polling delay: because Heartland does not deliver instant push notifications to iPaaS.com, expect a delay between a product change in Heartland and its arrival in iPaaS.com, bounded by the polling schedule.
iPaaS.com Caveats
SKU required and unique: iPaaS.com requires a SKU on every product, and it must be unique across iPaaS.com products. Without it the product is not created.
Variant SKU required and unique: iPaaS.com requires a SKU on every product variant. It must not duplicate another variant and must not match the parent product's SKU.
Required product values: every iPaaS.com product requires a SKU, a name, a type, a tracking method, a default price, and a status. This collection supplies all six.
Constrained values: the iPaaS.com product type accepts Physical and Virtual; the tracking method accepts Product and Variant; the status accepts Preorder, Active, Disabled, and Discontinued. A value outside those sets is rejected.
Tracking method governs inline variants: when a product's tracking method is Variant, the product is tracked at the variant level and variants may accompany it. When the tracking method is Product, variants are not allowed on the request. The parent collection's tracking-method formula is what decides this per product, so a mis-set tracking method is the usual cause of a variant being refused.
Inventory must resolve to a valid location: every iPaaS.com inventory record requires a location id that matches an existing iPaaS.com location, and a product may not carry two inventory records for the same location.
Related id required and typed: every iPaaS.com related product requires a related id, and that id must reference a product when the record is not a variant, or a variant when it is. The relationship type is also required and accepts only Replacement, Similar Item, and Related Product.
Duplicate related products not allowed: iPaaS.com rejects two related products on the same product that share a related id and relationship type. A repeated transfer of the same add-on item updates the existing link rather than creating a duplicate.
Option name required: iPaaS.com requires an option name to create a product option, and each option value requires a value.
Option values are replaced wholesale: when iPaaS.com updates an existing product option, any option value not present in the incoming request is deleted from that option. Send the complete set of values on every update.
No product field is flagged as ignored on update: unlike some other iPaaS.com entities, none of the writable fields on the Product, Product Variant, Product Inventory, Related Product, Product Option, Product Option Value, Product Variant Option, or Product Variant Inventory records is marked as accepted-on-create-only. Every field this family maps takes effect on update as well as on create.
Custom field prerequisites: every custom field mapped by these collections must already exist on the corresponding iPaaS.com collection before the mapped value is stored.
Integration-Specific Caveats
No prerequisites are auto-transferred in this direction. Unlike the Heartland transaction and customer address flows, the product flow runs no automatic prerequisite transfer. Nothing the product depends on is fetched and created for you. In particular, locations are not auto-transferred: an inventory record whose Heartland location is not already linked to an iPaaS.com location is silently skipped. Transfer your Heartland locations before transferring products.
Add-on products are not auto-transferred either. An add-on item is linked only if the product or variant it points to already exists in iPaaS.com. If it does not, the link is skipped without an error and can be created on a later transfer once that product has been transferred. Transferring your full catalog once and then re-transferring is the reliable way to populate related products.
Two filters silently skip records. The inventory child skips the hidden Retail Online location and any unlinked location; the add-on child skips any add-on item that does not resolve in iPaaS.com. Neither raises an error, so a missing inventory row or a missing related product produces no entry in the error log.
The option collection transfers nothing today. It is dispatched with the product's options, but because it has no mappings configured, no option data is written to iPaaS.com. See Mappings.
Updates replace the record. Re-transferring a product that already exists in iPaaS.com replaces the Product record and, at the variant level, the Product Variant record. See Unmapped Field Overwrite Risk under Mappings before re-transferring.
Custom prices are read-only. Custom prices can be read from Heartland using advanced mapping formulas. Uploading custom prices or price lists from iPaaS.com is not supported at this time.
First inventory poll is bounded. When product inventory polling runs for the first time, only the last several days of inventory adjustment history are searched. An optional inventory search-days subscription setting lets you widen that window, which is useful for temporary troubleshooting.
Setup Requirements
Heartland Configuration
Ensure every item you intend to transfer carries a description, a default cost, and a current price.
Create any Heartland custom fields you intend to map before configuring the mappings, so they are available for selection.
Confirm which Heartland object holds each custom field value you plan to read — the grid item object or the simple item object — before writing the formula.
Define an add-on item filter on any product whose add-on items you want transferred as related products.
Confirm product barcodes comply with the Heartland barcode format, or leave them for Heartland to generate.
iPaaS.com Configuration
Transfer your Heartland locations to iPaaS.com first. Product inventory for an unlinked location is silently skipped.
Create the custom fields listed under Custom Field Support on both the Product and the Product Variant collections if you want those Heartland values retained.
Set the Add On Item Limit subscription setting before the first transfer. A Heartland add-on item filter can return hundreds of products: set it to 0 to disable related-product transfer entirely, enter a number to cap the count, or leave it empty for no limit. A limit is strongly recommended.
Optionally set the inventory poll search-days subscription setting if you need to widen the inventory search window.
Decide whether you need the Heartland option name in iPaaS.com and, if so, add the missing option mapping described under Mappings before going live.
Review the writable iPaaS.com product and variant fields your business relies on and confirm each is either mapped or preserved. See Unmapped Field Overwrite Risk.
Enable the subscription so polling can run.
Authentication & Security
Heartland uses OAuth 2.0 to obtain an access token, which authorizes the Heartland API requests made during a transfer. Credentials are configured on the Heartland subscription — see the Heartland Installation Instructions.
Integration Flow
Prerequisites:
No prerequisite records are transferred automatically in this direction. The product flow dispatches the product and its children directly, with no preliminary lookup-and-transfer step of the kind that runs on the Heartland transaction and customer address flows. The practical consequence is that two dependencies must already be satisfied before a product transfer produces complete results:
Locations. The inventory child collection resolves each Heartland location to its linked iPaaS.com location. If a Heartland location is not linked, that inventory record is skipped without an error. Transfer your Heartland locations first.
Other products, for add-on links. The add-on child collection resolves each add-on item to an existing iPaaS.com product or variant. If the target has not yet been transferred, the link is skipped without an error and can be created on a later transfer.
Scheduled polling:
On its polling schedule, the integration requests the Heartland simple items and simple associated items changed since the last polling time. A change to a variant is processed as a single update to its parent grid item.
Each item is evaluated against the parent mapping filter. Items whose product type is not "grid" continue as iPaaS.com products; grid items are passed over by the parent and handled by the variant child instead.
The product header is dispatched to iPaaS.com, where a Product is created if its external id is not yet linked, or the existing record is updated if it is.
The product's inventory, options, variants, and add-on related products are dispatched through the four child collections under that product. The variant child in turn dispatches each variant's options and inventory.
Manual Sync:
A Heartland item or grid ID with its type suffix is entered on the iPaaS.com Manual Sync page.
The integration retrieves that single item from Heartland, using the grid API or the simple API according to the suffix.
The item is evaluated against the same filters, and the item and its children are dispatched through the same create-or-update path.
Both paths converge on the same mapping logic, so a product's resulting iPaaS.com record is identical regardless of how the transfer was triggered.
Mappings
Add/Update Heartland Product TO iPaaS.com
Mapping Filter
ProductType != "grid" //grid items are added as iPaaS variants
The filter has a single branch: a Heartland item is transferred as an iPaaS.com product only when its product type is not "grid". Grid items are Heartland's configurable products, and their sellable combinations are transferred as iPaaS.com product variants by the Add/Update Heartland Product Variant TO iPaaS.com child collection rather than as standalone products. Simple items and simple associated items pass the filter and become iPaaS.com products.
The filter does not raise an error and throws no message. Grid items are passed over silently by this collection, so a grid item produces no entry in the error log here — it is expected to arrive as variants instead.
Description: Creates or updates the iPaaS.com Product record from the Heartland simple item, matched by the Heartland external id. This is the parent of the inventory, option, variant, and add-on product child collections.
Mapping Type | Source Field (Heartland) | Destination Field (iPaaS.com) | Description |
Field |
| Sku | Required. Stores the Heartland item's public identifier as the iPaaS.com product SKU. iPaaS.com requires a SKU on every product and it must be unique across iPaaS.com products; without it the product is not created. |
Field |
| Name | Required. Stores the Heartland item's description as the iPaaS.com product name. iPaaS.com requires a name on every product. Note that this is the Heartland short description; the Heartland long description is stored separately on a custom field, and the native iPaaS.com Description field is not mapped by this collection. |
Static | "Physical" | Type | Required. Sets the iPaaS.com product type to the fixed value Physical. iPaaS.com requires a product type and accepts only Physical and Virtual. Heartland products are transferred as Physical; change this only if you have a reason to classify Heartland items as virtual. |
Dynamic Formula |
| TrackingMethod | Required. Sets whether the product is tracked at the product level or the variant level. If the Heartland item carries a price it is tracked as a Product; if it does not, it is tracked as a Variant. iPaaS.com requires a tracking method and accepts only Product and Variant. This value also governs whether iPaaS.com will accept inline variants on the product, so a mis-set tracking method is the usual cause of a variant being refused. |
Dynamic Formula |
| DefaultPrice | Required. Sets the iPaaS.com default price from the Heartland price values. For a non-grid item it uses the item's original price, falling back to the current price; for a grid item it uses the grid item's original price, falling back to the grid item's current price. If none of those values is available it returns 0. iPaaS.com requires a default price on every product. |
Dynamic Formula |
| Status | Required. Sets the iPaaS.com product status from the Heartland active flag: an active Heartland item becomes Active, and anything else becomes Disabled. iPaaS.com requires a status and accepts only Preorder, Active, Disabled, and Discontinued. Because deletion is not supported, deactivating an item in Heartland is the supported way to retire a product through the integration. |
Dynamic Formula |
| SalePrice | Optional. Sets a sale price only when the item is actually on sale. The formula reads the original and current prices — the simple item prices for a non-grid item, the grid item prices for a grid item — and compares them. If they are equal, or either is missing, no sale price is stored; if they differ, the current price is stored as the sale price. |
Field |
| Weight | Optional. Stores the Heartland item's weight. |
Field |
| Width | Optional. Stores the Heartland item's width. |
Field |
| Height | Optional. Stores the Heartland item's height. |
Field |
| Depth | Optional. Stores the Heartland item's depth. |
Dynamic Formula |
| Heartland Cost (custom field) | Optional. Stores the Heartland item cost, using the grid item cost when present and the simple item cost otherwise. Requires a custom field of this name on the Product collection before the value is stored. |
Field |
| Heartland Long Description (custom field) | Optional. Stores the Heartland item's long description. This is a separate custom field from the native iPaaS.com product Name and Description fields. Requires a custom field of this name on the Product collection before the value is stored. |
Dynamic Formula |
| Heartland Financial Class (custom field) | Optional. Stores the Heartland financial class identifier, using the grid item value when present and the simple item value otherwise. Requires a custom field of this name on the Product collection before the value is stored. |
Dynamic Formula |
| Heartland Item Available Online (custom field) | Optional. Stores the Heartland online-availability flag, using the grid item value when present and the simple item value otherwise. Requires a custom field of this name on the Product collection before the value is stored. |
Field |
| Heartland Track Inventory (custom field) | Optional. Stores the Heartland track-inventory setting for the item. Requires a custom field of this name on the Product collection before the value is stored. |
Dynamic Formula |
| Heartland Primary Vendor Id (custom field) | Optional. Stores the Heartland primary vendor identifier, using the grid item vendor when present and the simple item vendor otherwise. Requires a custom field of this name on the Product collection before the value is stored. |
Dynamic Formula |
| Heartland Primary Vendor Name (custom field) | Optional. Resolves the vendor name from the item's primary vendor identifier and stores it alongside the identifier, so the iPaaS.com product carries a human-readable vendor rather than only a number. It uses the simple item vendor first and the grid item vendor as the alternative; if neither identifier is present, no value is stored. Requires a custom field of this name on the Product collection before the value is stored. |
Dynamic Formula |
| Heartland Tags (custom field) | Optional. Combines the Heartland item's tags into a single comma-separated string. If the item has no tags, no value is stored. Heartland tags must be read from the read-only tags field; reference that field in any tag mapping or formula you add. Requires a custom field of this name on the Product collection before the value is stored. |
Dynamic Formula |
| C5_Custom_Product (custom field) | Optional. Reads a named value from the Heartland item's custom fields. This is the custom-field formula pattern for the Product collection and demonstrates the grid-versus-simple distinction: a grid item's values come from the Heartland item-custom object, and a simple item's values come from the standard custom object. It ships with a placeholder name — replace "My Custom Item Field" with the Heartland custom field you want to read, and point the mapping at the iPaaS.com custom field where the value should be stored. The named Heartland custom field must exist in Heartland, and the destination custom field must exist on the Product collection. |
Add/Update Heartland Product Add On Product TO iPaaS.com
This collection is a child of Add/Update Heartland Product TO iPaaS.com. It does not run on its own and has no schedule, webhook, or Manual Sync entry of its own; it runs whenever the parent transfers a product, attaching that product's Heartland add-on items to the iPaaS.com product as related products. The association to the parent product is supplied automatically by the parent transfer and is not a subscriber mapping.
Mapping Filter
//throw new exception("the id is "+Id);
if(Id != null){
var id = Id.Split("|")[1];
var expectedType = "Product";
if(ProductType == "grid"){expectedType = "Product Variant";}
if(ProductType != "grid"){id = id+"_SIMPLE";}
var parentProductiPaaSId = await GetSpaceportIdAsync(id, expectedType, SpaceportSystemId);
if(parentProductiPaaSId != null){
return true;
}
}
return false;The filter decides whether an add-on item can be linked yet, and it evaluates each add-on item through these branches:
Skipped when the add-on item has no identifier. If the add-on item carries no id, the filter returns false immediately and no related-product link is created.
The add-on identifier is derived from the composite id. The filter takes the portion of the add-on item's identifier after the pipe character as the base identifier for the lookup.
The expected record type follows the add-on item's Heartland type. A grid add-on item is looked up as an iPaaS.com product variant; anything else is looked up as an iPaaS.com product, and the _SIMPLE suffix is appended to its identifier so it matches the external-id format the parent collection records.
Transferred when the add-on resolves to an existing iPaaS.com record. If the lookup finds a linked iPaaS.com product or variant, the add-on item is processed and a related-product link is created.
Skipped when it does not resolve. If no matching iPaaS.com record is found, the filter returns false and no link is created.
The filter does not raise an error and throws no message. The commented-out throw statement at the top is a diagnostic aid that is not active. An add-on item that does not resolve is passed over silently, so a missing related product produces no entry in the error log; it can be linked on a later transfer once the add-on product itself has been transferred to iPaaS.com.
Description: Attaches each Heartland add-on item to the iPaaS.com product as a related product of type Related Product, resolving the add-on to the iPaaS.com product or variant it points at.
Mapping Type | Source Field (Heartland) | Destination Field (iPaaS.com) | Description |
Dynamic Formula |
| RelatedId | Required. Resolves the add-on item to its matching iPaaS.com record and stores that record's identifier as the related id. It applies the same logic as the filter: a grid add-on is matched as a variant, any other add-on is matched as a product with the _SIMPLE suffix appended. iPaaS.com requires a related id on every related product, and it must reference a product when the record is not a variant, or a variant when it is. When no match is found, no value is returned and the link is not created. |
Static | "Related Product" | RelatedType | Required. Sets the relationship type to the fixed value Related Product, which describes an add-on item offered alongside the parent product. iPaaS.com requires a relationship type and accepts only Replacement, Similar Item, and Related Product. |
Dynamic Formula |
| IsVariant | Recommended. Reports whether the add-on item is a Heartland grid item. iPaaS.com uses this indicator to interpret the related id: when it is true the related id refers to a variant, and when it is false it refers to a product. It is optional at the platform level, but leave it mapped so the related product links to the correct kind of record. |
Add/Update Heartland Product Inventory TO iPaaS.com
This collection is a child of Add/Update Heartland Product TO iPaaS.com. It does not run on its own and has no schedule, webhook, or Manual Sync entry of its own; it runs whenever the parent transfers a product, creating or updating one iPaaS.com Product Inventory record per Heartland location that stocks the item. The association to the parent product is supplied automatically by the parent transfer and is not a subscriber mapping.
This is not the same as the standalone inventory collections. Those poll inventory changes on their own schedule without re-transferring the product, and are documented in Heartland to iPaaS.com Standalone Inventory Mapping Documentation.
Mapping Filter
if(LocationId == 100010) //Heartland Retail Online is a hidden location
{return false;}var linked = await GetSpaceportIdAsync(LocationId, "Location", SpaceportSystemId);
if(String.IsNullOrEmpty(linked.ToString())){//This location is not linked
return false; //This ignores unlinked locations
//throw new exception($"Heartland location id {LocationId} is not linked to iPaaS and will prevent transfer of this product")
}
return true;The filter evaluates each of the product's location inventory records through three branches:
Skipped when the location is the hidden Retail Online location. Heartland maintains an internal, hidden Heartland Retail Online location. Its inventory is deliberately excluded and never reaches iPaaS.com. This is by design.
Skipped when the location is not linked to iPaaS.com. The filter looks up the linked iPaaS.com location for the Heartland location. If no linked location is found, the record is skipped so that inventory is not created against an unknown location. The commented-out throw statement records an alternative behavior that was considered — raising an error that would block the whole product transfer — but it is not active. The shipped behavior is to ignore unlinked locations quietly.
Transferred when the location is linked. Any other location passes and its inventory record is created or updated in iPaaS.com.
The filter does not raise an error and throws no message. Skipped locations produce no entry in the error log, so if inventory for a location never appears in iPaaS.com, confirm that location is transferred and linked.
Description: Creates or updates one iPaaS.com Product Inventory record for each linked Heartland location that stocks the product, carrying the on-hand and available quantities and the unit cost.
Mapping Type | Source Field (Heartland) | Destination Field (iPaaS.com) | Description |
Dynamic Formula |
| LocationId | Required. Resolves the linked iPaaS.com location from the Heartland location on the record, so the inventory is stored against the matching iPaaS.com location rather than the raw Heartland location number. iPaaS.com requires a valid location id on every inventory record, and a product may not carry two inventory records for the same location. Records whose Heartland location is not linked are excluded by the filter before this mapping runs. |
Field |
| QtyOnHand | Recommended. Stores the Heartland on-hand quantity for the location. Keeping this aligned with Heartland is a primary purpose of the collection. This is a read-only level read from Heartland; outbound quantity changes are applied through the inventory adjustment collection, not by writing this field back. |
Field |
| QtyAvailable | Recommended. Stores the Heartland available quantity for the location. Keeping this aligned with Heartland is a primary purpose of the collection. This is a read-only level read from Heartland; outbound quantity changes are applied through the inventory adjustment collection, not by writing this field back. |
Field |
| Cost | Optional. Stores the Heartland unit cost for the location as the iPaaS.com inventory cost. This records the cost associated with the on-hand inventory and is not written back to Heartland. |
Add/Update Heartland Product Option TO iPaaS.com
This collection is a child of Add/Update Heartland Product TO iPaaS.com. It does not run on its own and has no schedule, webhook, or Manual Sync entry of its own.
Mapping Filter
This mapping collection does not have a mapping filter applied. All records routed to it are processed without additional filtering conditions.
Description: This collection is available and is dispatched with the product's options during every parent product transfer, but it ships with no mappings configured. Because a mapping collection writes only what its mappings tell it to write, nothing transfers through this collection as delivered.
This collection has no mappings. There is no mapping table below because there are no rows — this is the shipped state of the template, not an omission from this document. What that means in practice:
The collection is dispatched. The integration passes each Heartland product option to it on every parent product transfer, so the option level of the hierarchy is present and the nested Add/Update Heartland Product Option Value TO iPaaS.com collection runs beneath it.
No option data reaches iPaaS.com through it. The iPaaS.com product option's writable fields — OptionName, Type, and Order — are all unmapped, so none of them is populated. Most importantly, iPaaS.com requires an option name to create a product option, and this collection does not supply one.
Nothing is overwritten by it either. Because it writes no values, it does not clear iPaaS.com option data the way a partially-mapped collection would.
To make this collection do something, add a mapping of type Field whose source is the Heartland option Name and whose destination is OptionName. That single mapping is what iPaaS.com needs to create the option. Add Type and Order mappings as well if your catalog depends on them. Once option mappings are in place, be aware that iPaaS.com replaces an option's value list wholesale on update: any option value not present in the incoming request is deleted from that option, so the complete set of values must be sent every time.
Subscribers who do not use grid product options in iPaaS.com can leave this collection as delivered; it is inert and costs nothing.
Add/Update Heartland Product Option Value TO iPaaS.com
This collection sits one level deeper than the other children. It is a nested child of Add/Update Heartland Product Option TO iPaaS.com, which is itself a child of Add/Update Heartland Product TO iPaaS.com. In other words: the product transfer dispatches the option collection, and the option collection dispatches this one for each allowed value under an option. It has no schedule, webhook, or Manual Sync entry of its own, and it cannot be run independently of either collection above it.
Mapping Filter
This mapping collection does not have a mapping filter applied. All records routed to it are processed without additional filtering conditions.
Description: Transfers each allowed value under a Heartland product option — the individual sizes under a "Size" option, or the colors under a "Color" option — to the matching iPaaS.com product option.
This collection depends on a parent that currently writes nothing. As established in the section above, Add/Update Heartland Product Option TO iPaaS.com ships with no mappings, so no iPaaS.com product option is created by the template as delivered. Because an option value in iPaaS.com must attach to an option, this collection's single mapping has nothing to attach to until the option collection is given at least an OptionName mapping. The mapping below is correctly configured and will work — it is simply gated on a parent that does not yet produce a record. If you want option values in iPaaS.com, fix the option collection first; this one needs no change.
Mapping Type | Source Field (Heartland) | Destination Field (iPaaS.com) | Description |
Field |
| Value | Required. Stores the Heartland product option value as the iPaaS.com option value. iPaaS.com requires a value on every product option value and will not create one without it. Duplicate values within a single option are not allowed. The option this value belongs to is established by the collection above it, not by a mapping here. |
The writable option value fields this collection does not map are detail and order. Note also that iPaaS.com replaces an option's value list wholesale on update: any option value not present in an incoming option update is deleted from that option. Once the option collection is mapped, the complete set of values must be sent on every transfer.
Add/Update Heartland Product Variant TO iPaaS.com
This collection is a child of Add/Update Heartland Product TO iPaaS.com. It does not run on its own and has no schedule, webhook, or Manual Sync entry of its own; it runs whenever the parent transfers a grid product, creating each grid combination as an iPaaS.com Product Variant under the product the parent created or updated. It in turn dispatches the nested Add/Update Heartland Product Variant Option TO iPaaS.com and Add/Update Heartland Product Variant Inventory TO iPaaS.com collections for each variant.
Mapping Filter
ProductType == "grid" //grid items are added as iPaaS variants
The filter has a single branch and is the exact mirror of the parent's filter: a Heartland item is processed as a variant only when its product type is "grid". In Heartland a grid item is a configurable product whose sellable combinations become the iPaaS.com variants. Items that are not grid type are transferred as standalone iPaaS.com products by the parent collection instead, and are passed over here.
Between the two filters, every Heartland item takes exactly one path — product or variant — and no item can be transferred as both. The filter does not raise an error and throws no message; non-grid items are passed over silently.
Description: Creates or updates an iPaaS.com Product Variant for each combination of a Heartland grid item, carrying the variant's SKU, barcode, pricing, and dimensions, plus the Heartland-specific custom field values.
Mapping Type | Source Field (Heartland) | Destination Field (iPaaS.com) | Description |
Field |
| Sku | Required. Stores the Heartland variant's public identifier as the iPaaS.com variant SKU. iPaaS.com requires a SKU on every variant, and it must be unique — it must not duplicate another variant and must not match the parent product's SKU. Without it the variant is not created. |
Dynamic Formula |
| DefaultPrice | Recommended. Sets the variant's default price from Heartland: the original price when one is present, otherwise the current price. Map it so each variant carries a price in iPaaS.com. Unlike the parent product's default price, this is optional at the platform level for a variant. |
Field |
| Barcode | Optional. Stores the variant's Heartland primary barcode. Heartland enforces an undocumented barcode length limit, so a barcode that exceeds it can cause validation errors on later transfers. |
Dynamic Formula |
| SalePrice | Optional. Sets the variant's sale price only when the variant is on sale in Heartland, that is, when its original price and current price differ. If the two are equal, or the original price is not defined, no sale price is stored. |
Field |
| Weight | Optional. Stores the variant's Heartland weight. |
Field |
| Width | Optional. Stores the variant's Heartland width. |
Field |
| Height | Optional. Stores the variant's Heartland height. |
Field |
| Depth | Optional. Stores the variant's Heartland depth. |
Field |
| Heartland Cost (custom field) | Optional. Stores the variant's Heartland cost. Unlike the parent collection, which must choose between a grid and a simple value, the variant reads the cost directly. Requires a custom field of this name on the Product Variant collection before the value is stored. |
Field |
| Heartland Long Description (custom field) | Optional. Stores the variant's Heartland long description. Requires a custom field of this name on the Product Variant collection before the value is stored. |
Field |
| Heartland Financial Class (custom field) | Optional. Stores the variant's Heartland financial class identifier. Requires a custom field of this name on the Product Variant collection before the value is stored. |
Field |
| Heartland Item Available Online (custom field) | Optional. Stores whether the variant is marked available online in Heartland. Requires a custom field of this name on the Product Variant collection before the value is stored. |
Field |
| Heartland Track Inventory (custom field) | Optional. Stores whether Heartland tracks inventory for the variant. Requires a custom field of this name on the Product Variant collection before the value is stored. |
Field |
| Heartland Primary Vendor Id (custom field) | Optional. Stores the variant's Heartland primary vendor identifier. Requires a custom field of this name on the Product Variant collection before the value is stored. |
Dynamic Formula |
| Heartland Primary Vendor Name (custom field) | Optional. Resolves the variant's primary vendor name from its Heartland primary vendor identifier, so the iPaaS.com variant carries a readable vendor rather than only a number. When no primary vendor identifier is present, no value is stored. Requires a custom field of this name on the Product Variant collection before the value is stored. |
Dynamic Formula |
| Heartland Tags (custom field) | Optional. Combines the variant's Heartland tags into a single comma-separated string. When the variant has no tags, no value is stored. Requires a custom field of this name on the Product Variant collection before the value is stored. |
Dynamic Formula |
| C5_Custom_Product_Variant (custom field) | Optional. Reads a named value from the Heartland variant's custom fields. This is the custom-field formula pattern for the Product Variant collection, shipped with a placeholder name — replace "My Custom Item Field" with the Heartland custom field you want to read, and point the mapping at the iPaaS.com custom field where the value should be stored. For a value that applies to the grid item as a whole rather than to the individual variant, read it from the Heartland item-custom object instead of the standard custom object. The named Heartland custom field must exist in Heartland, and the destination custom field must exist on the Product Variant collection. |
Add/Update Heartland Product Variant Option TO iPaaS.com
This collection sits one level deeper than the other children. It is a nested child of Add/Update Heartland Product Variant TO iPaaS.com, which is itself a child of Add/Update Heartland Product TO iPaaS.com. The product transfer dispatches the variant collection, and the variant collection dispatches this one for each option assignment on a variant. It has no schedule, webhook, or Manual Sync entry of its own and cannot be run independently of either collection above it.
Do not confuse this with Add/Update Heartland Product Option Value TO iPaaS.com. That collection carries the list of values a grid product offers under an option; this one carries the specific value a single variant is — the Large in a Size option, the Red in a Color option. Together they are what make a grid combination identifiable.
Mapping Filter
This mapping collection does not have a mapping filter applied. All records routed to it are processed without additional filtering conditions.
Description: Records each variant's option assignments on the iPaaS.com product variant, carrying the option name and the selected value that distinguish that variant within its grid product.
Mapping Type | Source Field (Heartland) | Destination Field (iPaaS.com) | Description |
Field |
| Value | Required. Stores the Heartland variant option's value — the specific selection on the option axis, such as Large for a Size option or Red for a Color option. iPaaS.com requires a value on every variant option and will not create one without it. |
Field |
| OptionName | Recommended. Stores the Heartland variant option's name — the axis of the grid combination, such as Size or Color. iPaaS.com does not strictly require an option name on a variant option, but mapping it keeps each option identifiable rather than leaving a value with no label. |
The variant that these options belong to is identified by the parent variant transfer, so this collection does not map the variant SKU itself. The writable variant option fields it does not map are detail and order.
Add/Update Heartland Product Variant Inventory TO iPaaS.com
This collection sits one level deeper than the other children. It is a nested child of Add/Update Heartland Product Variant TO iPaaS.com, which is itself a child of Add/Update Heartland Product TO iPaaS.com. It runs whenever the variant collection transfers a variant, creating or updating one iPaaS.com Product Variant Inventory record per Heartland location that stocks that variant. It has no schedule, webhook, or Manual Sync entry of its own.
It is the variant-level counterpart of Add/Update Heartland Product Inventory TO iPaaS.com, and the two never overlap: a simple item's stock flows through the product-level collection, and a grid combination's stock flows through this one. Neither is the same as the standalone inventory collections, which poll inventory changes on their own schedule and are documented in Heartland to iPaaS.com Standalone Inventory Mapping Documentation.
Mapping Filter
if(LocationId == 100010) //Heartland Retail Online is a hidden location
{return false;}var linked = await GetSpaceportIdAsync(LocationId, "Location", SpaceportSystemId);
if(String.IsNullOrEmpty(linked.ToString())){//This location is not linked
return false; //This ignores unlinked locations
//throw new exception($"Heartland location id {LocationId} is not linked to iPaaS and will prevent transfer of this product")
}
return true;The filter is identical to the product-level inventory filter and evaluates each of the variant's location inventory records through the same three branches:
Skipped when the location is the hidden Retail Online location. Heartland maintains an internal, hidden Heartland Retail Online location. Its inventory is deliberately excluded and never reaches iPaaS.com.
Skipped when the location is not linked to iPaaS.com. The filter looks up the linked iPaaS.com location for the Heartland location. If no linked location is found, the record is skipped so that inventory is not created against an unknown location. The commented-out throw statement records an alternative behavior that was considered — raising an error that would block the transfer — but it is not active. The shipped behavior is to ignore unlinked locations quietly.
Transferred when the location is linked. Any other location passes and its variant inventory record is created or updated in iPaaS.com.
The filter does not raise an error and throws no message. Skipped locations produce no entry in the error log, so if inventory for a variant at a given location never appears, confirm that location is transferred and linked.
Description: Creates or updates one iPaaS.com Product Variant Inventory record for each linked Heartland location that stocks the variant, carrying the on-hand and available quantities and the unit cost.
Mapping Type | Source Field (Heartland) | Destination Field (iPaaS.com) | Description |
Dynamic Formula |
| LocationId | Required. Resolves the linked iPaaS.com location from the Heartland location on the variant inventory row, so the quantities and cost are recorded against the correct iPaaS.com location rather than the raw Heartland location number. iPaaS.com requires a valid location id on every variant inventory record. Records whose Heartland location is not linked are excluded by the filter before this mapping runs. |
Field |
| QtyOnHand | Recommended. Stores the variant's on-hand quantity at the location. This is a read-only stock level reported by Heartland; outbound quantity changes are applied through the variant inventory adjustment collection, not by writing this field back. |
Field |
| QtyAvailable | Recommended. Stores the variant's available quantity at the location. This is a read-only stock level reported by Heartland; outbound quantity changes are applied through the variant inventory adjustment collection, not by writing this field back. |
Field |
| Cost | Optional. Stores the Heartland unit cost for the variant at that location as the iPaaS.com variant inventory cost. This is not written back to Heartland. |
Unmapped Field Overwrite Risk
Updates in this direction are full replacements. When iPaaS.com updates a record that already exists — which happens whenever a linked Heartland product is re-transferred — the full record is replaced. Every writable iPaaS.com field that these collections do not map is overwritten with an empty value. Do not assume unmapped values are preserved.
Product. The writable product fields the parent collection does not map are:
description: the native iPaaS.com product description. The Heartland long description is stored on a separate custom field, so the native description field is left unmapped and is cleared on every update.
msrp
tax_class
barcode: mapped at the variant level but not at the product level, so a barcode set on an iPaaS.com product by another process is cleared.
unit
allow_discounts
allow_backorders
in_stock_threshold
The product record also carries child groups that this collection does not transfer at all: kit, categories, units, and alternate_ids. Values held in those on the iPaaS.com side are not maintained here. Product units and alternate ids can be transferred if you need them, but there is no corresponding Heartland source data for them, so no template mappings are provided; their configuration is specific to each use case.
Product Variant. The writable variant fields the variant child collection does not map are msrp and status. The unmapped status deserves attention: the parent collection sets a product status from the Heartland active flag, but no equivalent mapping exists at the variant level, so a variant status set in iPaaS.com is cleared on each update. The variant also carries kit, categories, and variant-level alternate_ids groups that this collection does not transfer.
Product Inventory. The inventory child collection maps every core writable inventory field that iPaaS.com exposes — location, on-hand quantity, available quantity, and cost. The product association is supplied by the parent transfer. Only inventory-level custom fields and external ids remain unmapped; if your integration stores values there, confirm they are set through another mapping before relying on repeated updates.
Related Product. The add-on child collection maps every core writable related-product field — related id, relationship type, and the variant indicator. The parent product association is supplied by the parent transfer. Only related-product custom fields and external ids remain unmapped and are cleared on update.
Product Option. Because the option collection ships with no mappings, OptionName, Type, and Order are all unmapped. This collection writes nothing, so it does not clear existing iPaaS.com option data — but it also cannot populate any of these values. Add the mappings you need. Once option mappings are in place, remember that iPaaS.com deletes any option value not present in an incoming update.
Product Option Value. The single mapping on this collection supplies the value itself, which is the only field iPaaS.com requires. The writable option value fields it does not map are detail and order. There is a second, larger effect to understand here: iPaaS.com replaces an option's value list wholesale on update, deleting any value not present in the incoming request. Once the option collection is mapped, an option value that Heartland stops reporting is removed from iPaaS.com — this is a genuine deletion, and it is the one place in this family where an iPaaS.com record disappears as a result of a transfer.
Product Variant Option. This collection maps the value and the option name. The writable variant option fields it does not map are detail and order. The variant association is supplied by the parent variant transfer.
Product Variant Inventory. This collection maps every core writable field that iPaaS.com exposes for variant inventory — location, on-hand quantity, available quantity, and cost. The variant association is supplied by the parent variant transfer. Only variant-inventory-level custom fields and external ids remain unmapped; if your integration stores values there, confirm they are set through another mapping before relying on repeated updates.
The remedy. To keep a value that iPaaS.com holds but Heartland does not supply, add a mapping of type Dynamic Formula for that field whose source is DestinationValue.[FieldName] — for example DestinationValue.Description to preserve the native product description, DestinationValue.Msrp to preserve an MSRP, or DestinationValue.Status on the variant collection to preserve a variant status. The formula reads the value currently on the iPaaS.com record and writes it back, so the update carries it forward instead of clearing it. Add one such mapping for each field you need to keep.
No field in this family is ignored on update. Unlike some other iPaaS.com entities, none of the writable fields on the Product, Product Variant, Product Inventory, Related Product, Product Option, Product Option Value, Product Variant Option, or Product Variant Inventory records is flagged as accepted on create only. Every field these collections map takes effect on update as well as on create, so a change made in Heartland to any mapped field does propagate on the next transfer.
Error Handling
Missing or duplicate SKU: iPaaS.com requires a SKU on every product and variant, and it must be unique. If the Heartland public identifier is absent, or it collides with an existing iPaaS.com product, the record is not created. Confirm the Heartland item carries a public identifier and that it is unique in your catalog.
Variant SKU collides with the parent: a variant SKU must not duplicate another variant and must not match its parent product's SKU. Correct the Heartland public identifiers so each grid combination is distinct from the grid item itself.
Missing name: iPaaS.com requires a name on every product. The name comes from the Heartland item description, so a Heartland item with no description is rejected. Heartland requires a description on every item, so this normally indicates a data problem in the source record.
Missing default price or cost: iPaaS.com requires a default price on every product. Heartland requires the default cost and current price to be present for a product to transfer successfully; supply them in Heartland.
Invalid type, tracking method, or status: the product type must be Physical or Virtual, the tracking method must be Product or Variant, and the status must be Preorder, Active, Disabled, or Discontinued. A value outside these sets causes the product to be rejected. All three are set by the shipped mappings, so this normally indicates an edited mapping.
Variants refused on a product: when a product's tracking method resolves to Product rather than Variant, iPaaS.com does not accept variants on that product. Check the tracking-method formula against the Heartland item's price, which is what the formula reads.
Inventory location not resolved: an inventory record whose Heartland location is not linked to an iPaaS.com location is skipped by the filter without an error. If inventory for a location never appears, transfer that Heartland location to iPaaS.com and re-transfer the product.
Duplicate inventory for a location: iPaaS.com does not allow two inventory records for the same location on the same product. If a location's inventory is rejected, confirm the Heartland item does not report the same location twice.
Related product does not resolve: an add-on item whose target product or variant is not yet in iPaaS.com is skipped by the filter without an error. Transfer the add-on product first, then re-transfer the parent product to create the link.
Duplicate related product: iPaaS.com rejects two related products on the same product sharing a related id and relationship type. A repeated transfer of the same add-on updates the existing link rather than creating a duplicate, so this normally indicates a manually created link.
Too many related products: a Heartland add-on item filter can return hundreds of products. If a product transfer is slow or produces an unexpected number of related products, set the Add On Item Limit subscription setting to cap the count, or to 0 to disable the feature.
Option not created: iPaaS.com requires an option name to create a product option. Because the option collection ships with no mappings, no option name is supplied and no option is created through it. Add the option name mapping described under Mappings.
Option values disappeared: iPaaS.com deletes any option value not present in an incoming option update. If values are missing after a transfer, confirm the complete set of values is being sent.
Barcode rejected: Heartland enforces an undocumented barcode format that limits barcode length. A barcode that exceeds the allowed length can cause validation errors on later transfers. Provide a compliant barcode, or omit it and accept the Heartland auto-generated value.
Custom value not stored: when a custom field mapped by these collections does not exist on the corresponding iPaaS.com collection, the product still transfers and its other fields are written; only that custom value is not retained. Create the custom field and re-transfer to populate it.
Custom field read returns nothing: a custom-field formula that reads from the wrong Heartland object returns no value. Grid item values are in the Heartland item-custom object and simple item values are in the standard custom object; confirm which object holds the value before relying on the mapping.
Manual Sync ID rejected: a Heartland item ID entered on the Manual Sync page without a _SIMPLE or _GRID suffix returns a not-implemented error, because the integration cannot determine which Heartland API to call. Re-enter the ID with the correct suffix.
Product not found: when a Manual Sync is run for a Heartland item ID that does not exist, or the record cannot be retrieved, the transfer fails and no iPaaS.com record is created or updated. Confirm the ID and suffix are correct and that the item is still present in Heartland.
Heartland API unavailable: if the Heartland API is temporarily unavailable when a transfer is triggered, the transfer fails, including its inventory, options, variants, and related products. The error appears in the iPaaS.com Dashboard error logs, and the record can be retried through a new polling cycle or Manual Sync.
Grid item silently absent as a product: a grid item never appears in iPaaS.com as a standalone product, and this is not an error. Look for its combinations as product variants instead.
Testing & Validation
Test Scenarios
New simple item created — create a simple item in Heartland, transfer it, and confirm an iPaaS.com Product is created with the SKU from the Heartland public identifier and the external id in the {item_id}_SIMPLE format.
Existing product updated — change a value on a linked Heartland item, transfer it again, and confirm the same iPaaS.com Product is updated with no duplicate created.
Grid item becomes variants — transfer a Heartland grid item and confirm no standalone iPaaS.com product is created for the grid item itself, and that each combination appears as a product variant under the parent product.
Grid item skipped by the parent — confirm the grid item transfer produces no error entry from the parent collection; it is expected to be passed over silently.
Tracking method drives variants — transfer a Heartland item with no price and confirm its tracking method resolves to Variant, then transfer one with a price and confirm it resolves to Product. Confirm variants are accepted only in the first case.
Status reflects the Heartland active flag — deactivate a Heartland item, transfer it, and confirm the iPaaS.com product status becomes Disabled. Reactivate and confirm it returns to Active.
Deletion is not propagated — remove or deactivate a Heartland item and confirm the linked iPaaS.com Product is not deleted. Deactivation should change the status; deletion should have no effect at all.
Sale price only when on sale — transfer an item whose original and current prices are equal and confirm no sale price is stored; change the current price and confirm the sale price appears.
Default price falls back — transfer an item with no original price and confirm the current price is used as the default price, and an item with neither and confirm the default price is 0.
Dimensions carried — transfer an item with weight, width, height, and depth and confirm all four appear on the iPaaS.com product.
Vendor name resolved — transfer an item with a primary vendor and confirm both the vendor identifier and the resolved vendor name are stored on their custom fields. Transfer one with no vendor and confirm neither is stored and no error is raised.
Tags combined — transfer an item with several Heartland tags and confirm they appear as a single comma-separated string on the tags custom field. Transfer one with no tags and confirm nothing is stored.
Grid versus simple custom fields — read the same custom field name from a grid item and from a simple item and confirm each resolves from the correct Heartland object.
Custom fields populated — with all custom fields created on the Product and Product Variant collections, transfer a product and a grid item and confirm each Heartland value is stored.
Custom field absent — remove one custom field, transfer a product, and confirm the record still transfers with the remaining fields written and no error raised for the missing custom value.
Inventory for a linked location — transfer a product stocked at a linked Heartland location and confirm an iPaaS.com Product Inventory record is created with the correct location, on-hand quantity, available quantity, and cost.
Inventory for an unlinked location skipped — transfer a product stocked at a Heartland location that is not linked to iPaaS.com and confirm no inventory record is created and no error is logged. Then transfer the location, re-transfer the product, and confirm the inventory now appears.
Retail Online inventory excluded — transfer a product stocked at the hidden Heartland Retail Online location and confirm its quantities do not appear in iPaaS.com.
No location prerequisite runs — with a fresh subscription and no locations transferred, transfer a product and confirm no locations are created automatically and all inventory is skipped. This confirms locations must be transferred first.
Add-on item linked — with an add-on product already in iPaaS.com, transfer a Heartland product carrying an add-on item filter and confirm a related product of type Related Product is created pointing at the correct record.
Add-on item to a grid product — transfer a product whose add-on item is a Heartland grid item and confirm the related product links to the iPaaS.com variant and the variant indicator is true.
Add-on item skipped when missing — transfer a product whose add-on item is not yet in iPaaS.com and confirm no related product is created and no error is logged. Transfer the add-on product, re-transfer the parent, and confirm the link now appears.
Add On Item Limit honored — set the Add On Item Limit subscription setting to a small number, transfer a product with many add-on items, and confirm the number of related products is capped. Set it to 0 and confirm none are created.
Duplicate related product — re-transfer a product with the same add-on item and confirm the existing link is updated rather than duplicated.
Option collection transfers nothing — transfer a Heartland grid product carrying options and confirm no product option is created in iPaaS.com as delivered, and that no error is raised.
Option values blocked by the unmapped option — with the option collection as delivered, transfer a grid product carrying option values and confirm no iPaaS.com option values appear, because there is no option for them to attach to. Confirm no error is raised.
Option mapping added unblocks option values — add the option name mapping to the option collection, transfer the same grid product, and confirm the iPaaS.com product option is created with the Heartland option name and that its allowed values now appear beneath it through the nested option value collection, with no change made to that collection.
Option values replaced on update — with option mappings in place, remove a Heartland option value, re-transfer the product, and confirm the removed value is deleted from the iPaaS.com option. This is the one case in this family where a transfer deletes an iPaaS.com record.
Duplicate option value rejected — force two identical values under a single Heartland option and confirm iPaaS.com rejects the duplicate.
Variant SKU uniqueness — transfer a grid product whose combinations produce distinct public identifiers and confirm each becomes a variant. Then force a duplicate and confirm the variant is rejected.
Variant options identify the combination — transfer a grid product with two option axes (for example Size and Color) and confirm each iPaaS.com variant carries a variant option row per axis, with the correct option name and the correct selected value.
Variant option name omitted — remove the option name mapping from the variant option collection, transfer a grid product, and confirm the variant option is still created with its value but carries no label. This confirms the option name is recommended rather than required.
Variant inventory for a linked location — transfer a grid product whose variants are stocked at a linked Heartland location and confirm an iPaaS.com Product Variant Inventory record is created per variant per location with the correct quantities and cost.
Variant inventory for an unlinked location skipped — transfer a grid product stocked at an unlinked Heartland location and confirm no variant inventory record is created and no error is logged. Transfer the location, re-transfer the product, and confirm it now appears.
Retail Online variant inventory excluded — transfer a grid product stocked at the hidden Heartland Retail Online location and confirm those quantities do not appear in iPaaS.com.
Product and variant inventory do not overlap — confirm a simple item's stock arrives only through the product-level inventory collection and a grid combination's stock arrives only through the variant-level one, with no duplicate inventory rows.
Variant status cleared on update — set a status on an iPaaS.com product variant, re-transfer the grid product, and confirm the status is cleared. Then add the DestinationValue preservation mapping and confirm it survives the next re-transfer.
Unmapped product field cleared — set a value on an unmapped writable product field (for example the native description or MSRP) in iPaaS.com, re-transfer the product, and confirm the value is cleared. Then add the DestinationValue preservation mapping and confirm it survives.
Unmapped detail and order cleared — set a detail or order value on an iPaaS.com option value or variant option, re-transfer the product, and confirm the value is cleared, then preserve it with a DestinationValue mapping.
All mapped fields propagate on update — change every mapped Heartland value on a linked product, re-transfer, and confirm each change appears. No field in this family is ignored on update.
Manual Sync with the correct suffix — enter a known Heartland item ID with _SIMPLE on the Manual Sync page and confirm the product and its children transfer. Repeat with a grid ID and _GRID, and confirm the full three-level tree transfers in one operation.
Manual Sync without a suffix — enter an item ID with no suffix and confirm a not-implemented error is returned.
Nested collections have no independent trigger — confirm none of the option value, variant option, or variant inventory collections can be scheduled or manually synced on its own, and that each moves only as part of a parent product transfer.
Variant change rolls up to the parent — change a single Heartland grid combination and confirm polling processes it as one update to the parent grid item rather than as an isolated variant transfer.
Polling — with the subscription enabled, change a Heartland item and confirm it arrives in iPaaS.com on the next polling cycle without manual intervention.
Standalone inventory does not conflict — with the standalone inventory collections also running, confirm a product transfer and a standalone inventory poll both update the same iPaaS.com product and variant inventory records without creating duplicates.
Validation Checklist
Every transferred simple item has an iPaaS.com Product with a unique SKU, a name, a type, a tracking method, a default price, and a status, and re-transfers update rather than duplicate.
No Heartland grid item appears as a standalone iPaaS.com product; each of its combinations appears as a product variant with a SKU that is unique and distinct from the parent product's SKU.
Every product's external id carries the correct _SIMPLE or _GRID suffix.
Product status matches the Heartland active flag, and deactivating in Heartland disables rather than deletes the iPaaS.com record.
Sale price is present only on items that are genuinely on sale in Heartland.
Inventory appears for every linked Heartland location and for no unlinked location, with quantities and cost matching Heartland, and the hidden Retail Online location is absent.
Related products point at existing iPaaS.com products or variants, carry the Related Product relationship type, and respect the Add On Item Limit setting.
Every custom field listed under Custom Field Support exists on the Product and Product Variant collections and carries its Heartland value.
Each variant carries a variant option row for every option axis of its grid product, with the correct option name and selected value, so every combination is identifiable.
Variant inventory appears for every linked location and for no unlinked location, and no variant inventory duplicates a product-level inventory row.
Either the option collection has been given the mappings your catalog needs — in which case option values now appear beneath each option — or you have confirmed you do not need product options in iPaaS.com.
Every writable field you rely on is either mapped or has a DestinationValue preservation mapping, verified by re-transferring an existing product and confirming nothing you need was cleared.
Polling and Manual Sync produce the same resulting record for the same product.
Additional Notes
Heartland is the source of truth for the fields listed under Mappings. Editing those values directly in iPaaS.com will be overwritten on the next transfer of that product.
The four child collections are transferred as part of the parent product transfer. They cannot be run, scheduled, or manually synced on their own, and neither can the nested variant and option collections beneath them.
The Add/Update Heartland Product Option TO iPaaS.com collection ships with no mappings. It is dispatched, but it writes nothing until mappings are added. This is the shipped state of the template. Because Add/Update Heartland Product Option Value TO iPaaS.com sits beneath it, option values are blocked by the same gap — that collection is correctly mapped and needs no change; fixing the option collection above it is what releases both.
No prerequisite records are auto-transferred in this direction. Locations, and any products referenced as add-on items, must be transferred before the product that depends on them.
The C5_Custom_Product and C5_Custom_Product_Variant mappings ship with a placeholder Heartland custom field name. Replace them with real Heartland custom field names, or remove the mappings, before going live.
Because products arrive by polling rather than instant webhooks, allow for the polling interval when validating a change made in Heartland.
Custom prices can be read from Heartland with advanced mapping formulas, but uploading custom prices or price lists from iPaaS.com is not supported at this time.
Product units and alternate ids can be transferred to iPaaS.com if your use case calls for them, but no template mappings are provided because Heartland has no corresponding source data to map from.
Related Documents
Setup & Reference
Mapping Documentation
