← Back to blog

Map Cryvis JSON Fields in Make.com

Map nested Cryvis JSON in Make.com—seller.name, line_items arrays, nullables, and ifempty—without flattening by hand.

Cryvis returns nested JSON: parties as objects, line items as arrays, missing values as null. Make’s mapper understands collections and arrays—if you click into them instead of pasting guessed paths.

This guide covers nested access, iterators, and nulls for invoice/custom-style payloads. Envelope first: Parse API JSON responses. Hub: Make.com + Cryvis.

Collections (objects)

Invoice seller is a collection:

"seller": {
  "name": "Acme Cloud Services",
  "tax_id": "US12-3456789"
}

In Make map:

  • data.seller.name → Vendor column
  • data.seller.tax_id → Tax ID column

Same pattern for buyer, receipt merchant, passport mrz.line1, custom nested groups you defined in schema.

data
 └─ seller          (collection)
      ├─ name       → Sheets Vendor
      └─ tax_id     → Sheets Tax ID

If you map data.seller into a text cell, you often get [Collection] or a useless string—map leaves.

Arrays

line_items is an array of collections:

"line_items": [
  {
    "description": "Cloud hosting - Pro plan",
    "quantity": 2,
    "unit_price": 499.99,
    "amount": 999.98
  }
]

Option A — Iterator (one destination row per line)

HTTP
  → Iterator (data.line_items)
  → Sheets Add Row (description, quantity, amount)

Also map parent fields (data.invoice_number) from the HTTP module while inside the iterator—Make allows mapping earlier modules.

Option B — Collapse into one cell

Use map() + join():

  • Descriptions: join mapped descriptions with ;
  • Total check: prefer data.total_amount over summing in Make unless you need a reconciliation column

Option C — Skip arrays

If the destination only needs header fields, do not iterate—map invoice_number, seller.name, total_amount only (specific fields).

Nullables

Cryvis nullable fields return JSON null. In Make:

ApproachFormula idea
Blank cellifempty(data.due_date; )
Fallback textifempty(data.seller.tax_id; "missing")
Skip rowFilter: data.invoice_number is not empty / not null

Do not coerce amount null to 0 unless your ledger rules require it—zeros hide “not extracted.”

Custom extractor paths

Your schema keys hang under data:

  • data.account_number
  • data.vendor.name (if nested)
  • data.defects → Iterator

Whatever you did not declare does not exist—do not map invoice paths onto custom responses. Custom extractors, Custom API.

Batch results paths

Inside an Iterator on results:

  • file_name
  • data.merchant.name (receipt)
  • meta for that file

Top-level meta.request_id still refers to the whole HTTP call.

Type coercion

Cryvis typeMake tip
numberMap to number columns; use formatNumber only for display
booleanMap to checkbox / TRUE FALSE
date strings (YYYY-MM-DD)parseDate if the destination needs Date type

Debugging empty mappings

  1. Run once; open the HTTP module output bubble.
  2. Expand data → confirm key names (snake_case).
  3. Remap from the picker—typos like seller.Name fail silently as empty.
  4. Confirm you are not on a results[] payload while mapping data.

Errors vs empty data: Handle API errors. Invoice HTTP setup: Send PDF to OCR API.

Checklist

  • Leaves mapped, not whole collections (unless JSON destination)
  • Arrays iterated or intentionally collapsed
  • ifempty for soft nullables
  • Custom vs built-in key names verified against a live run
  • Parent fields available inside iterators

Product references while mapping: Invoice, Receipt, Passport.