Skip to main content

Zuper to iPaaS.com Invoice Mapping Documentation

How the Zuper to iPaaS.com Invoice mapping collection captures invoice records — with their line items, addresses, notes, payments, and tax — from Zuper into iPaaS.com, including field mappings, filters, triggers, and validation.

Summary

This article describes how the integration captures invoices from Zuper into iPaaS.com as transactions. When an invoice is created or updated in Zuper, the integration reads the full invoice — including its line items, addresses, notes, payments, and tax — and creates the matching transaction in iPaaS.com through the parent collection and its seven child collections. A separate update collection applies later header changes to the transaction already captured. This keeps the iPaaS.com transaction records aligned with billing activity in Zuper so downstream systems connected to iPaaS.com work from current data.

ID Format

Manual Sync ID Format

The Manual Sync identifier is the Zuper invoice identifier (invoice_uid). Enter this value on the iPaaS.com Manual Sync page to capture a specific invoice.

Example: 32bc938b-d942-4eed-ad65-15f633c5b270

When the record is a job rather than a standalone invoice, the Zuper job identifier is used instead.

External ID Format

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

Deleted Record Support

This collection captures invoice creates and updates. It does not remove transactions from iPaaS.com. Hard deletion in Zuper is out of scope for this collection.

Mapping Collection Status

Enabled. A mapping filter is applied so that only standard invoices are captured; the child collections apply their own filters as noted in the Mappings section below.

Trigger Events: The TO iPaaS.com direction supports Zuper webhooks enabled under Inbound Data Flows — the Zuper invoice events, such as new invoice, invoice update, and invoice payment — plus Manual Sync. No automatic transfers occur until the invoice webhook events are enabled.

Duplicate or Conflicting Mappings

These collections all capture Zuper billing records as iPaaS.com transactions and are separated by their filters. Review them together and confirm each is filtered for the records it should own:

  • Add Zuper Invoice TO iPaaS.com captures new standard invoices (invoice number not ending in -D, status not DRAFT).

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

  • Add Zuper Job TO iPaaS.com captures Zuper jobs as transactions.

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

Collision Handling

This collection does not use collision handling. Records are matched by the saved external ID and, before an external-ID link exists, by the transaction number — not by a configurable collision rule.

Supported Child Collections

  • Add Zuper Invoice Line TO iPaaS.com captures the invoice line items.

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

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

  • Add Zuper Invoice Note TO iPaaS.com captures invoice notes.

  • Add Zuper Invoice Payment TO iPaaS.com captures recorded payments on fully paid invoices.

  • Add Zuper Invoice Payment Due TO iPaaS.com records the outstanding balance as a payment entry.

  • Add Zuper Invoice Tax TO iPaaS.com captures the invoice tax.

Each child is captured as part of this invoice transfer and is linked to the transaction it belongs to. The child collections do not run independently of the parent invoice transfer.

Zuper Caveats

Deposit tickets and drafts are excluded: this collection intentionally skips deposit-ticket invoices (invoice number ending in -D) and draft invoices; those are handled by their own collections or excluded by design.

Jobs and invoices share this transaction type: a Zuper job with no invoice number is captured as a transaction of type Job, using the job title as its number.

Webhook events must be enabled to capture changes automatically: until the Zuper invoice events are enabled under Inbound Data Flows, invoice changes are captured only through Manual Sync.

iPaaS.com Caveats

The captured transaction and its child records are created together; the child collections do not run independently of this invoice transfer.

Subtotal, discount, tax, and quantity totals are computed from the invoice's line items and tax entries at capture time, at the time this documentation was written.

Setup Requirements

Enable the Zuper invoice webhook events (such as new invoice, invoice update, and invoice payment) under Inbound Data Flows in the subscription configuration so that billing changes in Zuper flow into iPaaS.com automatically.

Authentication uses a Zuper API key. For the steps to obtain the API key and configure the subscription, see the Zuper Installation Instructions article.

Integration Flow

A single transfer brings the invoice into iPaaS.com:

  1. The integration retrieves the full invoice from Zuper by its identifier, falling back to the Zuper Jobs data when the record is a job rather than a standalone invoice.

  2. The invoice header is mapped to a transaction.

  3. The related line items, addresses, notes, payments, and tax are captured through the child collections and linked to the transaction.

Add Zuper Invoice TO iPaaS.com

This collection maps the Zuper invoice header onto the iPaaS.com transaction.

Mapping Filter

if (InvoiceNo != null && InvoiceStatus != null){
  if (InvoiceNo.EndsWith("-D") || InvoiceStatus == "DRAFT")
    return false;
  else
    return true;
} else {return false;}

The filter captures a record only when it has both an invoice number and an invoice status. Records whose invoice number ends in -D are deposit tickets and are skipped here (they are handled by the Deposit Ticket collection), and records whose status is DRAFT are skipped. All other invoices pass and are captured. Records missing an invoice number or status are skipped.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Dynamic Formula

Dynamic Formula

SystemId

Records which connected system the transaction came from, using the source system identifier: SpaceportSystemId. System-managed; leave as configured.

Dynamic Formula

InvoiceNo / JobTitle

TransactionNumber

Sets the transaction number from the Zuper invoice number, falling back to the job title when there is no invoice number: return InvoiceNo != null ? InvoiceNo : JobTitle;. Required; it identifies the transaction and is used to match it on later transfers.

Dynamic Formula

JobId

Type

Classifies the record: a record with no job identifier is an Order, otherwise a Job: return JobId == null ? "Order" : "Job";. Recommended.

Lookup Translation

InvoiceStatus

Status

Sets the transaction status by translating the Zuper invoice status. Lookup Translation: Zuper Invoice Status To iPaaS. Values not listed in the table below are passed through unchanged. Recommended.

Dynamic Formula

Customer.Email / Organization.Email

EmailAddress

Sets the contact email from the customer's email, or the organization's email when the record belongs to an organization: Customer != null ? Customer.Email : (Organization != null ? Organization.Email : null);. Recommended.

Dynamic Formula

LineItems

DiscountAmount

Totals the discounts across line items, handling fixed and percentage discounts: Decimal myTotalDiscount = 0; foreach (var invoiceLine in LineItems) { var fixedQty = Convert.ToDecimal(invoiceLine.Quantity); if ( invoiceLine.DiscountType == "FIXED") { myTotalDiscount = myTotalDiscount + invoiceLine.Discount; } else if ( invoiceLine.DiscountType == "PERCENTAGE") { var result = (invoiceLine.UnitPrice * fixedQty ) * (invoiceLine.Discount / 100); myTotalDiscount = myTotalDiscount + result; } } return myTotalDiscount;. Optional.

Dynamic Formula

Tax

TaxAmount

Totals the tax across the invoice's tax entries: Decimal myTotalTax = 0; foreach (var invoiceTax in Tax) { myTotalTax = myTotalTax + invoiceTax.TaxAmount; } return myTotalTax;. Optional.

Dynamic Formula

LineItems

Subtotal

Totals the line items before tax, applying each line's fixed or percentage discount: Decimal mySubtotal = 0; foreach (var invoiceLine in LineItems) { var fixedQty = Convert.ToDecimal(invoiceLine.Quantity); if ( invoiceLine.DiscountType == "FIXED") { var result = ( invoiceLine.UnitPrice * fixedQty ) - invoiceLine.Discount; mySubtotal = mySubtotal + result; } else if ( invoiceLine.DiscountType == "PERCENTAGE") { var result = ( invoiceLine.UnitPrice * fixedQty ) - (( invoiceLine.UnitPrice * fixedQty ) * (invoiceLine.Discount / 100)); mySubtotal = mySubtotal + result; } else { var result = invoiceLine.UnitPrice * fixedQty; mySubtotal = mySubtotal + result; } } return mySubtotal;. Recommended.

Field

Total

Total

Sets the transaction total from the Zuper invoice total. Recommended.

Dynamic Formula

LineItems

TotalQty

Totals the quantity across line items: Decimal myTotalQty = 0; foreach (var invoiceLine in LineItems) { var fixedQty = Convert.ToDecimal(invoiceLine.Quantity); myTotalQty = myTotalQty + fixedQty; } return myTotalQty;. Optional.

Dynamic Formula

Dynamic Formula

TransactionCreatedDateTime

Records when the transaction was captured into iPaaS.com, using the current date and time: CurrentDateTimeOffset(). System-managed.

Dynamic Formula

Dynamic Formula

TransactionUpdatedDateTime

Records when the transaction was last updated in iPaaS.com, using the current date and time: CurrentDateTimeOffset(). System-managed.

Lookup Translation Tables

Zuper Invoice Status To iPaaS:

Source Value (Zuper)

Destination Value (iPaaS.com)

Notes

DRAFT

Pending

Draft invoices are captured as Pending.

PAID

Complete

Fully paid invoices are captured as Complete.

AWAIT_PAYMENT

Pending

Invoices awaiting payment are captured as Pending.

An additional rule sets the status to Pending for new or revisit jobs that have no invoice status yet. Subscribers can edit these pairs in the iPaaS.com lookup translation editor.

Add Zuper Invoice Line TO iPaaS.com

This child collection maps each Zuper invoice line item onto an iPaaS.com transaction line as part of the parent invoice transfer.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Field

LocationName

Zuper Fulfillment Location

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

Dynamic Formula

Specification

Serial Number

Captures the serial number or specification into a custom field when the line carries one: if (Specification == null || Specification == ""){return null;} else {return Specification;}. Optional.

Static

"Product"

Type

Marks the line as a Product line. Fixed classification 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

ProductId

Sku

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

Field

Name

Description

Captures the line item description (the product name) from Zuper. Recommended.

Field

Quantity

Qty

Captures the quantity for the line item. Recommended.

Dynamic Formula

UnitPrice, Quantity, Discount, DiscountType

UnitPrice

Calculates the per-unit price after any fixed or percentage line discount: var fixedQty = Convert.ToDecimal(Quantity); if ( DiscountType == "FIXED") { var result = (( UnitPrice * fixedQty ) - Discount ) / fixedQty; return Convert.ToDecimal(result); } else if ( DiscountType == "PERCENTAGE") { var result = (( UnitPrice * fixedQty ) - (( UnitPrice * fixedQty ) * (Discount / 100))) / fixedQty; return Convert.ToDecimal(result); } else { var result = UnitPrice; return Convert.ToDecimal(result); }. Recommended.

Dynamic Formula

UnitPrice, Quantity, Discount, DiscountType

ExtendedPrice

Calculates the line total after any discount, accounting for quantity: var fixedQty = Convert.ToDecimal(Quantity); if ( DiscountType == "FIXED") { var result = ( UnitPrice * fixedQty ) - Discount; return Convert.ToDecimal(result); } else if ( DiscountType == "PERCENTAGE") { var result = ( UnitPrice * fixedQty ) - (( UnitPrice * fixedQty ) * (Discount / 100)); return Convert.ToDecimal(result); } else { var result = UnitPrice * fixedQty; return Convert.ToDecimal(result); }. Recommended.

Field

UnitPrice

OriginalUnitPrice

Captures the original unit price before any discount. Optional.

Dynamic Formula

UnitPrice, Quantity, Discount, DiscountType

DiscountAmount

Calculates the discount applied to the line, based on whether the discount is a fixed amount or a percentage: var fixedQty = Convert.ToDecimal(Quantity); if ( DiscountType == "FIXED") { return Discount; } else if ( DiscountType == "PERCENTAGE") { var result = (UnitPrice * fixedQty ) * (Discount / 100); return result; } else { return 0; }. Optional.

Dynamic Formula

Total, UnitPrice, Quantity, Discount, DiscountType

EstimatedTaxAmount

Calculates the estimated tax for the line, derived from the line total after discount: var fixedQty = Convert.ToDecimal(Quantity); if ( DiscountType == "FIXED") { return Total - (( UnitPrice * fixedQty ) - Discount); } else if ( DiscountType == "PERCENTAGE") { return Total - (( UnitPrice * fixedQty ) - (( UnitPrice * fixedQty ) * (Discount / 100))); } else { return Total - (UnitPrice * fixedQty); }. Optional.

Add Zuper Invoice Billing Address TO iPaaS.com

This child collection maps the invoice customer's billing address onto the iPaaS.com transaction as part of the parent invoice transfer.

Mapping Filter

SourceTypeName == "ParentOnly"

The filter captures this address only from the parent invoice header record (SourceTypeName equals ParentOnly), so a single billing address is captured from the invoice rather than repeated per line item.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Static

"true"

IsPrimaryBilling

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

Dynamic Formula

Parent.CustomerBillingAddress.Street

Address1

Captures the billing street from the invoice's customer billing address: Parent.CustomerBillingAddress.Street. Recommended.

Dynamic Formula

Parent.CustomerBillingAddress.City

City

Captures the billing city from the invoice's customer billing address: Parent.CustomerBillingAddress.City. Recommended.

Dynamic Formula

Parent.CustomerBillingAddress.State

Region

Captures the billing state or region: Parent.CustomerBillingAddress.State. Recommended.

Dynamic Formula

Parent.CustomerBillingAddress.Country

Country

Captures the billing country: Parent.CustomerBillingAddress.Country. Recommended.

Dynamic Formula

Parent.CustomerBillingAddress.ZipCode

PostalCode

Captures the billing postal or zip code: Parent.CustomerBillingAddress.ZipCode. Recommended.

Dynamic Formula

Parent.CustomerBillingAddress.FirstName

FirstName

Captures the billing contact first name: Parent.CustomerBillingAddress.FirstName. Optional.

Dynamic Formula

Parent.CustomerBillingAddress.LastName

LastName

Captures the billing contact last name: Parent.CustomerBillingAddress.LastName. Optional.

Dynamic Formula

Parent.Organization.Name

Company

Captures the company name when the invoice belongs to a Zuper organization: if (Parent.Organization != null) {return Parent.Organization.Name;} else {return null;}. Optional.

Add Zuper Invoice Service Address TO iPaaS.com

This child collection maps the invoice customer's service address onto the iPaaS.com transaction as part of the parent invoice transfer.

Mapping Filter

SourceTypeName == "ParentOnly"

The filter captures this address only from the parent invoice header record (SourceTypeName equals ParentOnly), so a single service address is captured from the invoice rather than repeated per line item.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Static

"true"

IsPrimaryShipping

Marks this address as the transaction's primary service (shipping) address. Fixed value for this collection.

Dynamic Formula

Parent.CustomerServiceAddress.Street

Address1

Captures the service street from the invoice's customer service address: Parent.CustomerServiceAddress.Street. Recommended.

Dynamic Formula

Parent.CustomerServiceAddress.City

City

Captures the service city: Parent.CustomerServiceAddress.City. Recommended.

Dynamic Formula

Parent.CustomerServiceAddress.State

Region

Captures the service state or region: Parent.CustomerServiceAddress.State. Recommended.

Dynamic Formula

Parent.CustomerServiceAddress.Country

Country

Captures the service country: Parent.CustomerServiceAddress.Country. Recommended.

Dynamic Formula

Parent.CustomerServiceAddress.ZipCode

PostalCode

Captures the service postal or zip code: Parent.CustomerServiceAddress.ZipCode. Recommended.

Dynamic Formula

Parent.CustomerServiceAddress.FirstName

FirstName

Captures the service contact first name: Parent.CustomerServiceAddress.FirstName. Optional.

Dynamic Formula

Parent.CustomerServiceAddress.LastName

LastName

Captures the service contact last name: Parent.CustomerServiceAddress.LastName. Optional.

Dynamic Formula

Parent.Organization.Name

Company

Captures the company name when the invoice belongs to a Zuper organization: if (Parent.Organization != null) {return Parent.Organization.Name;} else {return null;}. Optional.

Add Zuper Invoice Note TO iPaaS.com

This child collection maps Zuper invoice notes onto iPaaS.com transaction notes as part of the parent invoice transfer.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Static

"Invoice Note"

Type

Classifies the captured note as an Invoice Note. Fixed value for this collection.

Field

Content

Text

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

Add Zuper Invoice Payment TO iPaaS.com

This child collection maps recorded payments on a fully paid invoice onto iPaaS.com transaction payments as part of the parent invoice transfer.

Mapping Filter

SourceTypeName != "ParentOnly" && Parent.AmountDue == 0 && IsVoid == false

The filter captures a payment when it is a real payment record rather than the invoice header (SourceTypeName is not ParentOnly), the invoice has no remaining balance (Parent.AmountDue equals 0), and the payment is not voided (IsVoid is false). Voided payments and invoices with an outstanding balance are skipped and handled elsewhere.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Dynamic Formula

PaymentMode.PaymentModeName

Method

Captures the payment method from the Zuper payment mode: PaymentMode.PaymentModeName. Recommended.

Dynamic Formula

PaymentMode.PaymentModeName

Description

Sets the payment description from the Zuper payment mode: PaymentMode.PaymentModeName. Optional.

Field

Amount

Amount

Captures the payment amount from the Zuper invoice payment. Required for a payment record.

Static

"Captured"

Status

Marks the payment as Captured, reflecting a completed payment on the invoice. Fixed value for this collection.

Add Zuper Invoice Payment Due TO iPaaS.com

This child collection records the invoice's outstanding balance as an iPaaS.com transaction payment entry as part of the parent invoice transfer.

Mapping Filter

SourceTypeName == "ParentOnly" && Parent.AmountDue > 0

The filter creates this entry from the invoice header only (SourceTypeName equals ParentOnly) and only when the invoice has an outstanding balance greater than zero (Parent.AmountDue > 0). Invoices with no balance due do not produce a payment-due entry.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Static

"amount due"

Method

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

Static

"amount due"

Description

Sets the entry description to amount due. Fixed value for this collection.

Dynamic Formula

Parent.AmountDue

Amount

Sets the entry amount to the invoice's outstanding balance: Parent.AmountDue. Required for this record.

Static

"Authorized"

Status

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

Add Zuper Invoice Tax TO iPaaS.com

This child collection maps Zuper invoice tax entries onto iPaaS.com transaction tax as part of the parent invoice transfer.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Field

TaxName

Authority

Captures the tax authority (the tax name) from the Zuper invoice tax. Recommended.

Field

TaxAmount

Amount

Captures the tax amount from the Zuper invoice tax. Recommended.

Field

TaxPercent

TaxPercent

Captures the tax percentage from the Zuper invoice tax. Optional.

Update Zuper Invoice TO iPaaS.com

This collection updates the header of a transaction already captured in iPaaS.com when the underlying Zuper invoice changes. Line items, addresses, notes, payments, and tax are handled by the capture collections above.

Mapping Filter

if (InvoiceNo != null && InvoiceStatus != null){
  if (InvoiceNo.EndsWith("-D") || InvoiceStatus == "DRAFT")
    return false;
  else
    return true;
} else {return false;}

The filter updates a record only when it has both an invoice number and an invoice status, its number does not end in -D (deposit tickets are handled elsewhere), and its status is not DRAFT. Records missing an invoice number or status, and records that are deposit tickets or drafts, are skipped.

Mapping Type

Source Field (Zuper)

Destination Field (iPaaS.com)

Description

Dynamic Formula

Dynamic Formula

SystemId

Records which connected system the transaction came from, using the source system identifier: SpaceportSystemId. System-managed; leave as configured.

Field

InvoiceNo

TransactionNumber

Sets the transaction number from the Zuper invoice number. Required; it identifies the transaction being updated.

Static

"Order"

Type

Sets the transaction type to Order. Fixed classification for this collection.

Lookup Translation

InvoiceStatus

Status

Updates the transaction status by translating the Zuper invoice status. Lookup Translation: Zuper Invoice Status To iPaaS. Values not listed in the table below are passed through unchanged. Recommended.

Dynamic Formula

Customer.Email

EmailAddress

Updates the contact email from the Zuper customer's email: Customer.Email. Recommended.

Dynamic Formula

LineItems

DiscountAmount

Totals the discounts across line items, handling fixed and percentage discounts: Decimal myTotalDiscount = 0; foreach (var invoiceLine in LineItems) { var fixedQty = Convert.ToDecimal(invoiceLine.Quantity); if ( invoiceLine.DiscountType == "FIXED") { myTotalDiscount = myTotalDiscount + invoiceLine.Discount; } else if ( invoiceLine.DiscountType == "PERCENTAGE") { var result = (invoiceLine.UnitPrice * fixedQty ) * (invoiceLine.Discount / 100); myTotalDiscount = myTotalDiscount + result; } } return myTotalDiscount;. Optional.

Dynamic Formula

Tax

TaxAmount

Totals the tax across the invoice's tax entries: Decimal myTotalTax = 0; foreach (var invoiceTax in Tax) { myTotalTax = myTotalTax + invoiceTax.TaxAmount; } return myTotalTax;. Optional.

Dynamic Formula

LineItems

Subtotal

Totals the line items before tax, applying each line's fixed or percentage discount: Decimal mySubtotal = 0; foreach (var invoiceLine in LineItems) { var fixedQty = Convert.ToDecimal(invoiceLine.Quantity); if ( invoiceLine.DiscountType == "FIXED") { var result = ( invoiceLine.UnitPrice * fixedQty ) - invoiceLine.Discount; mySubtotal = mySubtotal + result; } else if ( invoiceLine.DiscountType == "PERCENTAGE") { var result = ( invoiceLine.UnitPrice * fixedQty ) - (( invoiceLine.UnitPrice * fixedQty ) * (invoiceLine.Discount / 100)); mySubtotal = mySubtotal + result; } else { var result = invoiceLine.UnitPrice * fixedQty; mySubtotal = mySubtotal + result; } } return mySubtotal;. Recommended.

Field

Total

Total

Updates the transaction total from the Zuper invoice total. Recommended.

Dynamic Formula

LineItems

TotalQty

Totals the quantity across line items: Decimal myTotalQty = 0; foreach (var invoiceLine in LineItems) { var fixedQty = Convert.ToDecimal(invoiceLine.Quantity); myTotalQty = myTotalQty + fixedQty; } return myTotalQty;. Optional.

Lookup Translation Tables

Zuper Invoice Status To iPaaS:

Source Value (Zuper)

Destination Value (iPaaS.com)

Notes

DRAFT

Pending

Draft invoices are captured as Pending.

PAID

Complete

Fully paid invoices are captured as Complete.

AWAIT_PAYMENT

Pending

Invoices awaiting payment are captured as Pending.

Error Handling

For the error messages you may see in the iPaaS.com logs for the Zuper integration, what causes them, and how to resolve them, see the Zuper Error Messages article.

Testing & Validation

Test Scenarios

  • Capture a standard invoice through Manual Sync using its invoice_uid and confirm a transaction is created in iPaaS.com with the correct transaction number, type, status, email, and totals.

  • Capture an invoice that has line items and confirm each line is created with the correct SKU, quantity, unit price, extended price, and any discount.

  • Capture an invoice with a billing address and a service address and confirm both are created and marked as primary billing and primary shipping respectively.

  • Capture an invoice with notes and confirm each note is created as an Invoice Note.

  • Capture a fully paid invoice (amount due of zero, payment not voided) and confirm the recorded payment is created with the correct amount, method, and a status of Captured.

  • Capture an invoice with an outstanding balance greater than zero and confirm a payment-due entry is created with the balance amount, a method and description of amount due, and a status of Authorized.

  • Capture an invoice with tax and confirm each tax entry is created with the correct authority, amount, and percentage.

  • Confirm a deposit-ticket invoice (number ending in -D) and a draft invoice are skipped by this collection.

  • Update the header of an already-captured invoice and confirm the Update collection applies the new status, email, and totals to the same transaction.

  • Confirm a job with no invoice number is captured as a transaction of type Job using the job title as its number.

Validation Checklist

  • The transaction number matches the Zuper invoice number (or the job title when there is no invoice number).

  • The transaction type is Order for standard invoices and Job for jobs.

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

  • The total, subtotal, discount, tax, and quantity totals are populated and consistent with the invoice line items and tax entries.

  • The billing and service addresses are present and flagged as primary billing and primary shipping.

  • Line items carry the correct SKU, quantity, unit price, and extended price.

  • Recorded payments appear only for fully paid, non-voided invoices; payment-due entries appear only for invoices with an outstanding balance.

  • Tax entries carry the correct authority, amount, and percentage.

  • The external ID on the transaction matches the Zuper invoice identifier so later updates route to the same transaction.

Additional Notes

Subtotal, discount, tax, and quantity totals are computed from the invoice's line items and tax entries at capture and update time, at the time this documentation was written.

The captured transaction and its child records are created together; the child collections do not run independently of the parent invoice transfer.

Deletion and bulk initialization are out of scope for this collection: it captures invoice creates and updates but does not remove transactions, and it does not support capturing all Zuper invoices in one operation.

Related Documents

Did this answer your question?