Skip to main content

Zoho CRM from iPaaS.com Sales Order Mapping Documentation

How iPaaS.com transactions map to Zoho CRM sales orders and line items: product matching by SKU, tax handling, and field mappings.

Summary

iPaaS.com Transactions can be transferred out to Zoho CRM as Sales Orders, one order per transaction, either automatically on a Transaction create or update or on demand from the Manual Sync page. Each order carries its totals, tax and discount amounts, status, and both the billing and shipping addresses, and it is written together with its line items in a single call. This document covers the parent Sales Order collection and its Sales Order Line child together.

ID Format

Manual Sync ID Format

To transfer a single Transaction on demand, enter the iPaaS.com Transaction ID on the Manual Sync page — the numeric identifier of the Transaction record in iPaaS.com, for example 1234. The integration retrieves that Transaction with its lines and addresses and writes it to Zoho CRM. The child line collection has no separate Manual Sync id; lines are re-sent by re-syncing the parent transaction.

External ID Format

After a successful transfer, iPaaS.com saves the Zoho CRM sales order id — a long numeric value in the shape Zoho CRM uses for all record ids — on a dedicated external-ID record. That record routes a repeat transfer to an update of the existing order rather than creating a duplicate, and it is the only link between the two systems: this collection does not search Zoho CRM for a matching order before creating one. If the external-ID record is missing or cleared, the next transfer creates a second Zoho CRM sales order. Each returned line is matched back to its originating iPaaS.com transaction line after the write, so the line links are recorded too.

Deleted Record Support

Deletion is not propagated. Deleting a Transaction in iPaaS.com does not delete or cancel the corresponding Zoho CRM sales order; the order remains until it is removed in Zoho CRM directly.

Custom Field Support

Custom fields are supported on this collection. Before a custom field can be transferred, it must already exist in Zoho CRM: go to Settings → Customization → Modules and Fields → Sales Orders → Fields and create the field, then configure the matching custom field on the iPaaS.com subscription using exactly the Zoho CRM field label or API name — the integration matches on either, and API names differ from labels in that spaces and special characters are removed. The integration resolves each mapped name against the live Sales Orders field list on every transfer.

The Raise Custom Field Not Found Exception subscription setting controls what happens when a mapped custom field cannot be matched in Zoho CRM: True stops the transfer with a message naming the field; False sends the value anyway, and Zoho CRM has been observed to accept the request and ignore the unrecognised field, so the mapping fails silently. Subscribers or their MiSP still configuring the integration are advised to set it to True.

Mapping Collection Status

Status: Enabled. This collection has no mapping filter, so every Transaction sent to it is processed. Subscribers or their MiSP who only want certain transactions in Zoho CRM — for example only completed orders — should add a mapping filter before enabling automatic transfers.

Trigger Events: Created and Updated. Automatic transfers do not activate by default — subscribe to the transaction/created and transaction/updated triggers under Outbound Data Flows in the subscription configuration. Until those are enabled, no automatic transfers occur.

Duplicate or Conflicting Mappings

There are no other mapping collections in this integration that write to the Zoho CRM Sales Orders module, so no conflicting source of truth exists by default. Collision handling is not configurable on this collection.

Supported Child Collections

  • Add/Update Zoho CRM Sales Order Line FROM iPaaS.com: carries the order's line items — each line's product (matched by SKU), quantity, prices, discount, and per-line tax. The lines are written as part of the same call that creates the order rather than as separate requests. Zoho CRM will not accept a sales order without at least one line, so the parent and child always transfer together.

System Caveats

Zoho CRM Caveats

  • Products must exist before the order does: an order line is attached to a Zoho CRM product by matching the line's SKU against the product's code. The integration does not create the product on demand, so any product not already transferred causes the whole order to fail.

  • Subject is enforced by Zoho CRM, not by iPaaS.com: an order with no subject is rejected at the Zoho CRM end, so the failure appears in the error log rather than being caught before the call.

  • Call credits are consumed per transfer, and per line: a single order transfer makes one Zoho CRM call per line item to resolve products, plus the order write and its read-back, so orders with many lines consume proportionally more of the edition's rolling 24-hour allowance. When the allowance or concurrency cap is reached, Zoho CRM rejects the call and the transfer is not retried or rescheduled — it fails and is recorded under Dashboard / Integration Monitoring / Error Logs.

  • Taxes referenced on an order must already be configured: tax values written to a sales order reference the organization's configured taxes by name — the tax names used by the order and line tax mappings must exist in the Zoho CRM tax settings.

iPaaS.com Caveats

  • The customer must be transferred to Zoho CRM before the order: the contact on the order is resolved from an existing link between the iPaaS.com Customer and a Zoho CRM contact, created by Add/Update Zoho CRM Contact FROM iPaaS.com. This collection does not create it. Transferring an order for a customer that has never been transferred writes the order with no contact attached.

  • Transfers are not sequenced automatically: the integration does not transfer the customer or the products as prerequisites of an order. Subscribers or their MiSP are responsible for the order in which the initial data load is run — products and customers first, then orders.

Setup Requirements

  • In Zoho CRM, confirm the connected user can read and write the Sales Orders, Products, and Contacts modules.

  • Transfer the product catalog first (Add/Update Zoho CRM Product FROM iPaaS.com), confirming each product's code matches the SKU used on iPaaS.com transaction lines.

  • Transfer the customers first (Add/Update Zoho CRM Contact FROM iPaaS.com) so orders can attach to a contact.

  • In the Zoho CRM tax settings, create the tax names referenced by the order and line tax mappings.

  • Review the Status lookup translation and confirm the value pairs match the transaction statuses in use.

  • Subscribe to the transaction/created and transaction/updated triggers under Outbound Data Flows for automatic transfers.

Integration Flow

When a Transaction transfer is started from iPaaS.com, the integration:

  1. Resolves every line's product. For each line it searches Zoho CRM for a product whose code matches the line's SKU. If any line's SKU cannot be found, the whole transfer stops with a message naming the problem — no partial order is created. A transaction with no lines stops for that reason instead.

  2. Resolves the contact. The mapped formulas look up the Zoho CRM contact the transaction's customer was previously linked to. This reads an existing link; it does not create the contact.

  3. Resolves any mapped custom fields against the live Sales Orders field list, handling unmatched fields per the Raise Custom Field Not Found Exception setting.

  4. Creates or updates the sales order with its lines in a single call — a new order if the Transaction is not yet linked, otherwise an update in place.

  5. Reads the order back and records the links, matching each returned line to its originating iPaaS.com line and recording the Zoho CRM sales order id as the external-id link.

Mappings

Add/Update Zoho CRM Sales Order FROM iPaaS.com

iPaaS.com data type: Transaction

Description: Writes an iPaaS.com Transaction to Zoho CRM as a Sales Order. This collection has no mapping filter — every Transaction sent to it is processed. Billing and shipping addresses are each selected from the transaction's address list by the corresponding primary-address flag; an address carrying neither flag leaves those Zoho CRM fields empty rather than falling back to another address.

Mapping Type

Source Field (iPaaS.com)

Destination Field (Zoho CRM)

Description

Field

TransactionNumber

Subject

Required. Zoho CRM rejects a sales order without a subject; it is populated from the transaction number.

Dynamic Formula

GetExternalIdAsync(CustomerId, "Customer", SpaceportSystemId)

Customer_No

Recommended. Resolves the Zoho CRM contact id the customer was previously linked to. Depends on the customer having been transferred first; without the link the order is written with no customer number.

Dynamic Formula

see Formula bodies below

Contact_Name

Recommended. Attaches the order to the Zoho CRM contact, using the same customer link. If no link exists, no contact is attached.

Lookup Translation

Lookup Translation: OrderStatus

Status

Recommended. Translates the iPaaS.com transaction status to a Zoho CRM order status — see the Lookup Translation Table below.

Field

Total

Grand_Total

Recommended. The order total, so it matches iPaaS.com.

Field

Subtotal

Sub_Total

Recommended. The pre-tax total.

Field

TaxAmount

Tax

Recommended. The order-level tax figure.

Field

DiscountAmount

Discount

Recommended. The order-level discount.

Field

ShippingAmount

Adjustment

Recommended. Carries the shipping charge — Zoho CRM sales orders have no dedicated shipping field, so it is placed in Adjustment.

Dynamic Formula

FieldFromFirstMatch(Addresses, "IsPrimaryBilling == true", "Address1")

Billing_Street

Optional. Street of the transaction's primary billing address.

Dynamic Formula

FieldFromFirstMatch(Addresses, "IsPrimaryBilling == true", "City")

Billing_City

Optional. City of the primary billing address.

Dynamic Formula

FieldFromFirstMatch(Addresses, "IsPrimaryBilling == true", "Region")

Billing_State

Optional. State/region of the primary billing address.

Dynamic Formula

FieldFromFirstMatch(Addresses, "IsPrimaryBilling == true", "PostalCode")

Billing_Code

Optional. Postal code of the primary billing address.

Dynamic Formula

FieldFromFirstMatch(Addresses, "IsPrimaryBilling == true", "Country")

Billing_Country

Optional. Country of the primary billing address.

Dynamic Formula

FieldFromFirstMatch(Addresses, "IsPrimaryShipping == true", "Address1")

Shipping_Street

Optional. Street of the primary shipping address.

Dynamic Formula

FieldFromFirstMatch(Addresses, "IsPrimaryShipping == true", "City")

Shipping_City

Optional. City of the primary shipping address.

Dynamic Formula

FieldFromFirstMatch(Addresses, "IsPrimaryShipping == true", "Region")

Shipping_State

Optional. State/region of the primary shipping address.

Dynamic Formula

FieldFromFirstMatch(Addresses, "IsPrimaryShipping == true", "PostalCode")

Shipping_Code

Optional. Postal code of the primary shipping address.

Dynamic Formula

FieldFromFirstMatch(Addresses, "IsPrimaryShipping == true", "Country")

Shipping_Country

Optional. Country of the primary shipping address.

Dynamic Formula

see Formula bodies below

line_tax

Optional. Summarises the transaction's taxes into a single named tax entry written on the order. Placeholder value — replace during implementation: the formula pins a specific Zoho CRM tax record id (6027981000000021001) and the name Sales Tax; both must be replaced with a tax that exists in the subscriber's Zoho CRM organization.

Formula bodies. The multi-line formulas above, verbatim:

// Contact_Name
var number = await GetExternalIdAsync(CustomerId, "Customer", SpaceportSystemId);
if (number != null) {
  var contact = new Integration.DataModels.ContactName() { id = number};
  return contact
} else {
return null;
}
// line_tax  — the tax id and name below are placeholders; replace with a tax configured in your Zoho CRM organization
decimal taxPercent = 0;
decimal taxAmount = 0;
if (Taxes != null){
  foreach (var ipTax in Taxes){
   taxPercent += ipTax.TaxPercent;
   taxAmount += ipTax.Amount;
  }
}
dynamic tax = new ExpandoObject();
tax.name = "Sales Tax";
tax.percentage = taxPercent;
tax.value = taxAmount;
tax.id = "6027981000000021001";
var finalTaxList = new List<object>();
finalTaxList.add(tax);
return finalTaxList;

Lookup Translation Table — OrderStatus

Source Value (iPaaS.com)

Destination Value (Zoho CRM)

Notes

Pending

Created

Confirm the pairs match the transaction statuses actually in use.

Complete

Delivered

Cancelled

Cancelled

Shipped

Approved

Add/Update Zoho CRM Sales Order Line FROM iPaaS.com

iPaaS.com data type: Transaction Line

Description: Carries one line item of the order. Lines are written as part of the parent order's call, never on their own. The SKU mapping resolves the Zoho CRM product the line is attached to.

Mapping Type

Source Field (iPaaS.com)

Destination Field (Zoho CRM)

Description

Dynamic Formula

see Formula bodies below

SKU

Required. The product code used to match the Zoho CRM product. Where the iPaaS.com SKU is a composite SKU\|id, the formula keeps only the part before the \|.

Field

Qty

quantity

Required. The quantity ordered.

Field

UnitPrice

unit_price

Recommended. The price charged per unit.

Field

OriginalUnitPrice

list_price

Recommended. The list (pre-discount) unit price.

Field

ExtendedPrice

total

Recommended. The line total.

Field

ExtendedPrice

total_after_discount

Recommended. The line total after discount.

Field

DiscountAmount

Discount

Optional. The line discount amount.

Field

EstimatedTaxAmount

Tax

Optional. The line tax amount.

Field

Description

product_description

Optional. The line description.

Dynamic Formula

see Formula bodies below

line_tax

Optional. Builds a per-line named tax entry from the line's tax percent; returns nothing when the line has no tax percent.

Formula bodies. The multi-line formulas above, verbatim:

// SKU
if (Sku.Contains("|")){
  var pos = Sku.IndexOf("|");
  return Sku.Substring(0, pos);
} else
  return Sku;
// line_tax
if (TaxPercent != null){
  dynamic tax = new ExpandoObject();
  tax.name = "Sales Tax";
  tax.percentage = TaxPercent;  var finalTaxList = new List<object>();
  finalTaxList.add(tax);
  return finalTaxList;} else {return null;}

Error Handling

  • An order fails because a line's product is not in Zoho CRM. Product resolution runs across every line before the order is written; a single unmatched SKU stops the transfer with a message naming the problem. Resolution: transfer the product first (matching its code to the line SKU) and re-run the order.

  • An order is rejected for a missing subject. Zoho CRM enforces a subject; the failure appears in the error log. Resolution: ensure Subject is mapped and populated.

  • A transfer fails when the Zoho CRM call allowance or concurrency cap is reached. Order transfers make one call per line to resolve products, so bulk order loads reach the limit sooner than record counts suggest. The transfer is not rescheduled — it fails and is recorded in the error log. Resolution: stagger bulk loads and re-run affected transfers once the allowance resets.

  • A tax write fails because the referenced tax is not configured. The order and line tax entries reference Zoho CRM taxes by name (and, for the order, by id). Resolution: create the referenced tax names in the Zoho CRM tax settings and replace the placeholder tax id in the order line_tax formula.

A dedicated Zoho CRM Error Messages article covers the integration's error catalog in full.

Testing & Validation

Test Scenarios

  1. Transfer a product, then a customer, then an order that references both, and confirm the Zoho CRM sales order is created with its line, its contact, and its totals.

  2. Transfer an order whose line references a SKU not present in Zoho CRM and confirm the whole transfer stops with a naming error.

  3. Update a transferred order's total and confirm the existing Zoho CRM order updates rather than duplicating.

  4. Transfer an order with distinct primary billing and primary shipping addresses and confirm each set of Zoho CRM address fields is populated correctly.

  5. Confirm the Status value written to Zoho CRM matches the OrderStatus translation for the transaction's status.

  6. Manually sync by entering an iPaaS.com Transaction ID and confirm success.

Validation Checklist

  • The connected Zoho CRM user can read and write the Sales Orders, Products, and Contacts modules.

  • The product catalog and customers have been transferred first.

  • The tax names referenced by the order and line tax mappings exist in Zoho CRM, and the placeholder tax id in the order line_tax formula has been replaced.

  • The OrderStatus translation pairs match the transaction statuses in use.

  • Any custom fields exist in Zoho CRM with matching iPaaS.com subscription custom fields.

Additional Notes

  • One missing product fails the whole order — there is no partial order. Transfer the product first and re-run.

  • An order can reach Zoho CRM with no contact attached if the customer link does not yet exist; the order is still written, just unattached.

  • There is no fallback match — a lost external-ID link produces a duplicate sales order rather than a re-link.

  • Line-level tax is applied as a single named tax rather than reproducing each tax line separately.

  • There is no bulk initialization. For an initial order load, use bulk sync using Postman.

The following are out of scope: order deletion, inbound order sync, payments/shipments/tracking numbers, quotes/invoices/purchase orders, and deal or account association (orders attach to a contact only).

Related Documents

Did this answer your question?