Skip to main content

Zuper to iPaaS.com Job Mapping Documentation

How the Zuper integration captures a Zuper job — its product lines, addresses, notes, description, and outstanding-balance entry — into iPaaS.com as a transaction, including field-by-field mappings and filters.

Summary

This article documents how the Zuper integration captures jobs from Zuper into iPaaS.com as transactions. When a job is created or updated in Zuper, the integration reads the full job — including its product lines, addresses, notes, and description — and creates the matching transaction in iPaaS.com. This makes job activity visible alongside invoices and deposit tickets in iPaaS.com.

The data flow is one-directional: Source is Zuper and Destination is iPaaS.com. The parent collection captures the job header, and six child collections capture the job's lines, billing address, service address, notes, description, and an outstanding-balance entry. The children are captured as part of the same job transfer and are linked to the transaction they belong to; they do not run independently.

ID Format

Manual Sync ID Format

Manual Sync ID Format : The Zuper job identifier (job_uid). Example: 52100890-d152-11ee-83d4-fbdc23854096.

Enter this value on the iPaaS.com Manual Sync page to capture a specific job on demand.

External ID Format

External ID Format : After a successful transfer, iPaaS.com records the Zuper job identifier as the external ID on a dedicated external-ID record. This routes later updates to the same iPaaS.com transaction. The TransactionNumber mapping also carries the job's number onto the transaction, which provides visibility and serves as a fallback match when no external-ID record yet exists.

Deleted Record Support

This mapping family captures job creates and updates. It does not remove transactions from iPaaS.com. Deleting a job in Zuper does not delete the corresponding transaction in iPaaS.com.

Mapping Collection Status

Enabled.

All collections in this family are enabled. Mapping filters apply to the parent job collection and to the address, note, description, and payment-due children so that each collection captures only the records it should own. The Line collection has no filter, so every product line is captured with its parent job. Each collection's filter is described in its section under Mappings below.

Trigger Events: This TO iPaaS.com family is driven by Zuper job webhooks. In the subscription configuration's Inbound Data Flows section, enable the Zuper job events — such as new job, job update, and job status update — so that job activity in Zuper flows into iPaaS.com automatically. No automatic transfers occur until those events are enabled. A Manual Sync is also available at any time from the iPaaS.com Manual Sync page using the job identifier.

Duplicate or Conflicting Mappings

Several TO iPaaS.com collections capture Zuper billing and job records as iPaaS.com transactions. They are separated by their filters, so each owns a distinct record type. Review them together and confirm each is filtered for the records it should own:

  • Add Zuper Job TO iPaaS.com captures jobs (this article). Its filter requires a job identifier and job type and excludes identifiers ending in -D.

  • Add Zuper Invoice TO iPaaS.com captures standard invoices.

  • Add Zuper Deposit Ticket TO iPaaS.com captures deposit-ticket invoices (identifiers ending in -D).

  • Update Zuper Invoice TO iPaaS.com captures updates to standard invoices.

Collision Handling

Collision handling is not used. Records are matched by the saved external ID and, before an external-ID link exists, by the transaction number.

Supported Child Collections

The parent job collection captures the following six child collections as part of the same job transfer. Each child is linked to the transaction it belongs to and is not captured independently:

  • Add Zuper Job Line TO iPaaS.com: captures the job's product lines.

  • Add Zuper Job Billing Address TO iPaaS.com: captures the billing address.

  • Add Zuper Job Service Address TO iPaaS.com: captures the service address.

  • Add Zuper Job Note TO iPaaS.com: captures the job's line-level notes.

  • Add Zuper Job Description TO iPaaS.com: captures the job title and description together as a note.

  • Add Zuper Job Payment Due TO iPaaS.com: records an outstanding-balance entry.

Zuper Caveats

  • Jobs versus invoices and deposit tickets: this family captures Zuper jobs. Standard invoices and deposit tickets are captured by their own collections and are separated from jobs by filters.

  • Totals from product lines: the transaction totals — subtotal, discount, and quantity — are calculated from the job's product lines at capture time.

  • No tax on jobs: Zuper jobs do not carry tax, so the transaction tax amount is not populated from the job.

  • No billed balance until invoiced: a job does not carry a billed balance until it is invoiced, so the outstanding-balance entry defaults to zero.

  • Organization name: when a job belongs to a Zuper organization, the organization name is captured as the address company on the billing and service addresses.

iPaaS.com Caveats

  • The captured transaction and its child records are created together. The child collections do not run independently of the job transfer.

  • Captured product lines are recorded with a default status of Pending.

  • The billing address is marked as the transaction's primary billing address, and the service address is marked as the transaction's primary service (shipping) address.

  • The outstanding-balance entry is recorded with a status of Authorized.

Setup Requirements

  • Inbound Data Flows webhook events: in the subscription configuration's Inbound Data Flows section, enable the Zuper job events (new job, job update, job status update) so that jobs flow into iPaaS.com automatically. Until these events are enabled, no automatic transfers occur and the family runs only through Manual Sync.

  • API key authentication: the integration authenticates to Zuper with an API key. Ensure a valid Zuper API key is configured on the subscription.

  • Installation: for step-by-step setup, see the Zuper Installation Instructions article.

Integration Flow

  1. A job is created or updated in Zuper, and an enabled Zuper job webhook event notifies iPaaS.com (or a subscriber runs a Manual Sync with the job identifier).

  2. The integration retrieves the full job from Zuper by its identifier.

  3. The parent collection's filter confirms the record is a job (it has a job identifier and job type) and is not a deposit ticket (its identifier does not end in -D).

  4. The job header is mapped to an iPaaS.com transaction.

  5. The child collections capture the job's product lines, billing address, service address, notes, description, and outstanding-balance entry, each linked to the transaction.

  6. iPaaS.com saves the Zuper job identifier as the external ID so that later updates route to the same transaction.

Mappings

Add Zuper Job TO iPaaS.com

Description: Captures the Zuper job header as an iPaaS.com transaction, including transaction number, type, status, contact email, and calculated totals.

Mapping Filter

if (Id != null && JobType != null && JobId != null){
  if (Id.EndsWith("-D") )
    return false;
  else
    return true;
} else {return false;}

Plain-language explanation:

  • The record is evaluated only when it has an identifier, a job type, and a job identifier. If any of these are missing, the record is skipped.

  • When those values are present, the filter checks the identifier: if it ends in -D, the record is a deposit ticket and is skipped (returns false).

  • Otherwise the record is a job and is captured (returns true).

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Dynamic Formula

return InvoiceNo != null ? InvoiceNo : JobTitle;

TransactionNumber

Required. Sets the transaction number from the Zuper invoice number, falling back to the job title when the job has no invoice number. Identifies the transaction and is used to match it on later transfers.

Static

"Job"

Type

Recommended. Sets the transaction type to Job for records captured through this collection. This is a fixed classification.

Lookup Translation

Lookup Translation: Zuper Invoice Status To iPaaS

Status

Recommended. Sets the transaction status by translating the Zuper status. Values not listed in the translation table are passed through unchanged, and new or revisit jobs with no status are set to Pending.

Dynamic Formula

Customer != null ? Customer.Email : (Organization != null ? Organization.Email : null);

EmailAddress

Recommended. Sets the contact email from the Zuper customer's email, or the organization's email when the job belongs to an organization.

Dynamic Formula

Decimal mySubtotal = 0; foreach (var jobLine in Products) { var fixedQty = Convert.ToDecimal(jobLine.Quantity); if ( jobLine.DiscountType == "FIXED") { var result = ( jobLine.Price * fixedQty ) - jobLine.Discount; mySubtotal = mySubtotal + result; } else if ( jobLine.DiscountType == "PERCENTAGE") { var result = ( jobLine.Price * fixedQty ) - (( jobLine.Price * fixedQty ) * (jobLine.Discount / 100)); mySubtotal = mySubtotal + result; } else { var result = jobLine.Price * fixedQty; mySubtotal = mySubtotal + result; } } return mySubtotal;

Total

Recommended. Sets the transaction total by totaling the job's product lines, applying each line's fixed or percentage discount.

Dynamic Formula

Decimal mySubtotal = 0; foreach (var jobLine in Products) { var fixedQty = Convert.ToDecimal(jobLine.Quantity); if ( jobLine.DiscountType == "FIXED") { var result = ( jobLine.Price * fixedQty ) - jobLine.Discount; mySubtotal = mySubtotal + result; } else if ( jobLine.DiscountType == "PERCENTAGE") { var result = ( jobLine.Price * fixedQty ) - (( jobLine.Price * fixedQty ) * (jobLine.Discount / 100)); mySubtotal = mySubtotal + result; } else { var result = jobLine.Price * fixedQty; mySubtotal = mySubtotal + result; } } return mySubtotal;

Subtotal

Recommended. Sets the transaction subtotal by totaling the job's product lines, applying each line's fixed or percentage discount.

Dynamic Formula

Decimal myTotalDiscount = 0; foreach (var jobLine in Products) { var fixedQty = Convert.ToDecimal(jobLine.Quantity); if ( jobLine.DiscountType == "FIXED") { myTotalDiscount = myTotalDiscount + jobLine.Discount; } else if ( jobLine.DiscountType == "PERCENTAGE") { var result = (jobLine.Price * fixedQty ) * (jobLine.Discount / 100); myTotalDiscount = myTotalDiscount + result; } } return myTotalDiscount;

DiscountAmount

Optional. Sets the total discount on the transaction by adding up each product line's fixed or percentage discount.

Dynamic Formula

//Jobs have no tax return null;

TaxAmount

Optional. Zuper jobs do not carry tax, so this returns no value and the transaction tax amount is left unpopulated.

Dynamic Formula

Decimal myTotalQty = 0; foreach (var invoiceLine in LineItems) { var fixedQty = Convert.ToDecimal(invoiceLine.Quantity); myTotalQty = myTotalQty + fixedQty; } return myTotalQty;

TotalQty

Optional. Sets the total quantity on the transaction by adding up the line quantities.

Dynamic Formula

SpaceportSystemId

SystemId

System-managed. Records which connected system the transaction came from. Leave as configured.

Dynamic Formula

CurrentDateTimeOffset()

TransactionCreatedDateTime

System-managed. Records when the transaction was captured into iPaaS.com.

Dynamic Formula

CurrentDateTimeOffset()

TransactionUpdatedDateTime

System-managed. Records when the transaction was last updated in iPaaS.com.

Lookup Translation Tables

Source Value (Zuper)

Destination Value (iPaaS.com)

Notes

DRAFT

Pending

Draft records are captured as Pending.

PAID

Complete

Fully paid records are captured as Complete.

AWAIT_PAYMENT

Pending

Records awaiting payment are captured as Pending.

Values not listed above are passed through unchanged. Subscribers can edit these pairs in the iPaaS.com lookup translation editor.

Add Zuper Job Line TO iPaaS.com

Description: Captures each product line of the job as an iPaaS.com transaction line, with product, quantity, pricing, and discount.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Field

ProductId

Sku

Recommended. Captures the product identifier for the line so it can be matched to a product.

Field

ProductDescription

Description

Recommended. Captures the line description from the Zuper product description.

Field

Quantity

Qty

Recommended. Captures the quantity for the line.

Dynamic Formula

var fixedQty = Convert.ToDecimal(Quantity); if ( DiscountType == "FIXED") { var result = (( Price * fixedQty ) - Discount ) / fixedQty; return Convert.ToDecimal(result); } else if ( DiscountType == "PERCENTAGE") { var result = (( Price * fixedQty ) - (( Price * fixedQty ) * (Discount / 100))) / fixedQty; return Convert.ToDecimal(result); } else { var result = Price; return Convert.ToDecimal(result); }

UnitPrice

Recommended. Sets the per-unit price after any fixed or percentage line discount.

Dynamic Formula

var fixedQty = Convert.ToDecimal(Quantity); if ( DiscountType == "FIXED") { var result = ( Price * fixedQty ) - Discount; return Convert.ToDecimal(result); } else if ( DiscountType == "PERCENTAGE") { var result = ( Price * fixedQty ) - (( Price * fixedQty ) * (Discount / 100)); return Convert.ToDecimal(result); } else { var result = Price * fixedQty; return Convert.ToDecimal(result); }

ExtendedPrice

Recommended. Sets the extended (line total) price, accounting for the line quantity and any discount.

Field

Price

OriginalUnitPrice

Optional. Captures the original unit price before any discount.

Dynamic Formula

var fixedQty = Convert.ToDecimal(Quantity); if ( DiscountType == "FIXED") { return Discount; } else if ( DiscountType == "PERCENTAGE") { var result = (Price * fixedQty ) * (Discount / 100); return result; } else { return 0; }

DiscountAmount

Optional. Sets the discount amount for the line, based on whether the Zuper discount is a fixed amount or a percentage.

Static

"Product"

Type

Fixed classification. Marks the line as a Product line for lines captured through this collection.

Static

"Pending"

Status

Sets the line status to Pending by default. Subscribers who track a different line status can change this value.

Field

LocationName

Zuper Fulfillment Location (custom field)

Optional. Captures the fulfillment location name for the line into a custom field.

Dynamic Formula

var numberList = SerialNos; if (numberList != null && numberList.count() > 0) { string result = String.Join(",", numberList); return result; } return null;

Serial Number (custom field)

Optional. Captures the line serial numbers into a custom field, when the Zuper line carries them.

Add Zuper Job Billing Address TO iPaaS.com

Description: Captures the job's customer billing address as the transaction's primary billing address.

Mapping Filter

SourceTypeName == "ParentOnly"

Plain-language explanation:

  • The address is captured only from the parent job record (ParentOnly), so a single billing address is captured per transaction rather than once per line item.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Dynamic Formula

Parent.CustomerBillingAddress.Street

Address1

Recommended. Captures the billing street from the job's customer billing address.

Dynamic Formula

Parent.CustomerBillingAddress.City

City

Recommended. Captures the billing city from the job's customer billing address.

Dynamic Formula

Parent.CustomerBillingAddress.State

Region

Recommended. Captures the billing state or region from the job's customer billing address.

Dynamic Formula

Parent.CustomerBillingAddress.Country

Country

Recommended. Captures the billing country from the job's customer billing address.

Dynamic Formula

Parent.CustomerBillingAddress.ZipCode

PostalCode

Recommended. Captures the billing postal or zip code from the job's customer billing address.

Dynamic Formula

Parent.CustomerBillingAddress.FirstName

FirstName

Optional. Captures the billing contact first name from the job's customer billing address.

Dynamic Formula

Parent.CustomerBillingAddress.LastName

LastName

Optional. Captures the billing contact last name from the job's customer billing address.

Dynamic Formula

if (Parent.Organization != null) {return Parent.Organization.Name;} else {return null;}

Company

Optional. Captures the company name on the billing address when the job belongs to a Zuper organization.

Static

"true"

IsPrimaryBilling

Fixed value. Marks this address as the transaction's primary billing address.

Add Zuper Job Service Address TO iPaaS.com

Description: Captures the job's customer address as the transaction's primary service (shipping) address, when the job has a customer address.

Mapping Filter

SourceTypeName == "ParentOnly" && Parent.CustomerAddress != null

Plain-language explanation:

  • The address is captured only from the parent job record (ParentOnly), so a single service address is captured per transaction.

  • It is captured only when the job has a customer address. Jobs without a customer address do not produce a service address record.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Dynamic Formula

Parent.CustomerAddress.Street

Address1

Recommended. Captures the service street from the job's customer address.

Dynamic Formula

Parent.CustomerAddress.City

City

Recommended. Captures the service city from the job's customer address.

Dynamic Formula

Parent.CustomerAddress.State

Region

Recommended. Captures the service state or region from the job's customer address.

Dynamic Formula

Parent.CustomerAddress.Country

Country

Recommended. Captures the service country from the job's customer address.

Dynamic Formula

Parent.CustomerAddress.ZipCode

PostalCode

Recommended. Captures the service postal or zip code from the job's customer address.

Dynamic Formula

Parent.CustomerAddress.FirstName

FirstName

Optional. Captures the service contact first name from the job's customer address.

Dynamic Formula

Parent.CustomerAddress.LastName

LastName

Optional. Captures the service contact last name from the job's customer address.

Dynamic Formula

if (Parent.Organization != null) {return Parent.Organization.Name;} else {return null;}

Company

Optional. Captures the company name on the service address when the job belongs to a Zuper organization.

Dynamic Formula

true

IsPrimaryShipping

Fixed behavior. Marks this address as the transaction's primary service (shipping) address.

Add Zuper Job Note TO iPaaS.com

Description: Captures the job's line-level notes as transaction notes.

Mapping Filter

SourceTypeName != "ParentOnly"

Plain-language explanation:

  • Notes are captured only when they are attached to the job's records rather than the job header (SourceTypeName != "ParentOnly"), so line-level job notes are captured through this collection. The job header's own title and description are handled by the Add Zuper Job Description collection instead.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Field

Note

Text

Recommended. Captures the note text from the Zuper job note.

Static

"Job Note"

Type

Fixed value. Classifies the captured note as a Job Note.

Add Zuper Job Description TO iPaaS.com

Description: Captures the job title and description together as a single note on the transaction, giving the transaction a readable summary of the job.

Mapping Filter

SourceTypeName == "ParentOnly"

Plain-language explanation:

  • The note is captured only from the parent job record (ParentOnly), so a single job-description note is captured per transaction.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Dynamic Formula

Parent.JobTitle + " - " + Parent.JobDescription

Text

Recommended. Captures the job title and description together as the note text, so the transaction carries a readable summary of the job.

Static

"Job Description"

Type

Fixed value. Classifies the captured note as a Job Description.

Add Zuper Job Payment Due TO iPaaS.com

Description: Records an outstanding-balance payment entry on the transaction captured from the job.

Mapping Filter

SourceTypeName == "ParentOnly"

Plain-language explanation:

  • The entry is created only from the parent job record (ParentOnly), so a single outstanding-balance entry is recorded per transaction.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Static

"0"

Amount

Placeholder default. Sets the entry amount to 0 because a Zuper job does not carry a billed balance until it is invoiced. Subscribers who want to record an actual outstanding amount for jobs should map this from a source value instead.

Static

"amount due"

Method

Fixed value. Labels the entry method as amount due, distinguishing it from a recorded payment.

Static

"amount due"

Description

Fixed value. Sets the entry description to amount due.

Static

"Authorized"

Status

Fixed value. Marks the entry as Authorized, reflecting an outstanding (not yet captured) balance.

Error Handling

For error messages this integration may return during a job transfer, and the recommended response to each, see the Zuper Error Messages article.

Testing & Validation

Test Scenarios

  • Create a new job in Zuper with product lines, a customer billing address, a customer service address, and one or more notes, then confirm a matching transaction is captured in iPaaS.com with type Job.

  • Update the job in Zuper and confirm the update routes to the same iPaaS.com transaction rather than creating a duplicate.

  • Capture a job that has a customer billing address but no customer service address, and confirm the service address record is not produced.

  • Capture a job whose identifier ends in -D and confirm it is skipped by this family (it is owned by the Deposit Ticket collection).

  • Capture a job with fixed-discount and percentage-discount lines and confirm the transaction subtotal, total, discount amount, and per-line unit and extended prices calculate correctly.

  • Capture a job that belongs to a Zuper organization and confirm the organization name appears as the company on the billing and service addresses.

  • Run a Manual Sync using the job identifier (job_uid) and confirm the same transaction is captured.

Validation Checklist

  • The transaction is created with type Job and a transaction number drawn from the invoice number, or the job title when there is no invoice number.

  • The transaction status reflects the translated Zuper status (DRAFT to Pending, PAID to Complete, AWAIT_PAYMENT to Pending), with unlisted values passed through unchanged.

  • The contact email is populated from the customer's email, or the organization's email when the job belongs to an organization.

  • Subtotal, total, discount amount, and total quantity match the job's product lines; the tax amount is unpopulated.

  • Each product line carries the product SKU, description, quantity, unit price, extended price, and a Pending status.

  • The billing address is marked primary billing and the service address is marked primary service.

  • A single job-description note captures the job title and description, and any line-level notes are captured as Job Note entries.

  • The outstanding-balance entry is present with an amount of 0, method and description of amount due, and a status of Authorized.

  • The external ID is saved on the transaction so later updates route to the same record.

Additional Notes

  • Totals — subtotal, discount, and quantity — are computed from the job's product lines at capture time. Zuper jobs do not carry tax, so the transaction tax amount is not populated from the job.

  • The Payment Due amount is a placeholder default of 0. Because a job does not carry a billed balance until it is invoiced, review this value during implementation and map it from a source value if you need to record an actual outstanding amount for jobs.

  • All child collections travel with the parent job. None of them can be captured on its own.

Related Documents

Did this answer your question?