← Back to blog

Extract Receipt Data with Make.com and Cryvis

Build a Make.com scenario that watches Google Drive for receipts, calls the Cryvis Receipt API, and writes merchant and total into Google Sheets.

Finance teams already dump receipts into a shared Drive folder. The gap is structured data: merchant name, date, and total still get typed by hand. This scenario closes that gap with Drive as the source, the Cryvis Receipt API as the extractor, and Google Sheets as the ledger.

If you are new to Cryvis on Make, start at the Make.com hub. For image-only uploads from forms, see extract receipt data from images. Invoice PDFs use a different endpoint — see extract invoice data with Make.com.

Workflow

[Google Drive: Watch Files]
        |
        v
[Filter: MIME pdf|jpeg|png|webp]
        |
        v
[Google Drive: Download a File]
        |
        v
[HTTP: Make a Request]
   POST /v1/documents/receipt
   multipart file + Bearer key
        |
        v
[Google Sheets: Add a Row]
   merchant | date | total | currency | receipt #

Modules

StepModuleRole
1Google Drive — Watch Files in a FolderTrigger when a new receipt lands
2FilterKeep only supported MIME types
3Google Drive — Download a FileGet binary for multipart upload
4HTTP — Make a RequestCall Cryvis Receipt API
5Google Sheets — Add a RowPersist merchant and totals
6Error Handler (optional)Route 4xx/5xx to Slack or a retry queue

Watch a dedicated folder such as Finance/Receipts/Inbox. Do not watch the whole Drive — every spreadsheet export will fire the scenario.

Cryvis HTTP configuration

Use HTTP — Make a Request (not a generic webhook). Cryvis expects multipart form upload, not a JSON body with a base64 string.

SettingValue
URLhttps://api.cryvis.com/v1/documents/receipt
MethodPOST
HeadersAuthorization: Bearer {{API_KEY}}
Body typeMultipart/form-data
Field namefile
FileMap from Drive Download (binary + filename)

Store the API key in a Make connection or scenario variable. Never hardcode it in a shared blueprint.

Supported MIME types: application/pdf, image/jpeg, image/png, image/webp. One credit is charged per PDF page or image. A three-page PDF costs three credits; a single JPEG costs one.

Docs: extractReceipt. Product overview: Receipt API.

Single-file response shape

For one file, the envelope looks like:

{
  "success": true,
  "data": {
    "receipt_number": "RCT-88421",
    "transaction_date": "2026-09-10",
    "transaction_time": "12:41:03",
    "merchant": { "name": "North Cafe", "tax_id": null },
    "customer": null,
    "location": { "city": "Austin", "country": "US" },
    "payment": { "method": "card", "last4": "4242" },
    "currency": "USD",
    "line_items": [],
    "subtotal": 24.00,
    "tax_total": 1.98,
    "total_amount": 28.40,
    "amount_paid": 28.40,
    "receipt_type": "restaurant",
    "notes": null
  },
  "meta": {}
}

If you ever send multiple files in one request, the response switches to a batch envelope with results[] — each entry has file_name, data, and meta. This Drive flow should send one file per execution so you can map data directly. For batch HTTP patterns, see convert receipts to JSON.

Response mapping to Sheets

Map only what finance needs on day one. You can add line-item expansion later with an Iterator.

Sheets columnMake mapping
Receipt Number{{data.receipt_number}}
Merchant{{data.merchant.name}}
Date{{data.transaction_date}}
Time{{data.transaction_time}}
Currency{{data.currency}}
Subtotal{{data.subtotal}}
Tax{{data.tax_total}}
Total{{data.total_amount}}
Amount Paid{{data.amount_paid}}
Payment Method{{data.payment.method}}
Source FileDrive filename
Processed At{{now}}

Create the spreadsheet headers before you run the scenario. Type totals as numbers in Sheets (not text) so SUM and pivot tables work.

Destination specifics: Google Sheets

Use Add a Row against a named sheet tab (Receipts). Prefer Spreadsheet ID from the URL, not a fragile name search.

Practical conventions:

  • Keep an Inbox Drive folder and a Processed folder. After a successful Sheets write, move the file with Drive — Move a File so the watch trigger does not reprocess it.
  • Add a Status column defaulting to extracted. Downstream finance can change it to booked without re-running OCR.
  • If the same receipt can be uploaded twice, skip Add a Row when receipt_number + transaction_date already exist. The deeper idempotency pattern (Data Store + lookup) is covered in receipt to Google Sheets.

Merchant names vary (STARBUCKS #1234 vs Starbucks Store 1234). Do not normalize in this scenario unless you have a known alias table. Capture raw merchant.name first; normalize in Sheets or a later Router step.

Filters and edge cases

Put a Filter after Watch Files:

  • MIME is one of pdf / jpeg / png / webp
  • File size under your org’s Make limit (large multipage PDFs may need splitting before upload)

Edge cases you will hit in production:

  • Thermal photos: dark or skewed café receipts still extract, but line_items may be empty while total_amount is present. Always trust total over line-item sum when line items are sparse.
  • Foreign currency: currency is ISO (e.g. EUR). Do not assume USD in Sheets formulas.
  • Missing receipt number: some merchants omit it. Leave the cell blank; use Drive file ID as a secondary key for dedupe if needed.
  • Multi-page PDF: charged per page. Prefer one receipt per PDF for expense folders.

Errors

Attach an Error Handler on the HTTP module:

ConditionAction
HTTP 401 / 403Stop scenario; alert that the API key is invalid or expired
HTTP 400 (unsupported MIME / bad multipart)Log filename to a Failures sheet; do not retry blindly
HTTP 429 / 5xxEnable incomplete executions + exponential backoff
success: false in bodyTreat as soft failure; write row to Failures with raw body snippet

Make’s default “Ignore” error setting will silently drop bad receipts. Prefer “Break” or a dedicated error route so finance notices missing days.

Test plan

  1. Drop one JPEG of a clear retail receipt into the Inbox folder.
  2. Run the scenario once (or wait for the watch interval).
  3. Confirm HTTP returns success: true and data.total_amount matches the paper total.
  4. Confirm Sheets has one new row with merchant and total.
  5. Drop a .docx or HEIC file — Filter should discard it.
  6. Re-upload the same JPEG after moving the original to Processed — you should get a second row unless you added dedupe.

Production checklist

  • API key in a Make vaulted connection, scoped to production vs sandbox if you keep both.
  • Watch interval aligned with upload volume (every 5–15 minutes is enough for shared Inbox folders).
  • Incomplete executions enabled for the HTTP module.
  • Credit usage monitored — 1 credit per page/image; burst scan days can spike usage.
  • Separate Failures tab + Slack alert for ops.
  • Move-to-Processed after success so the Inbox stays empty.

CTA

Need structured receipt JSON without building OCR yourself? Use the Cryvis Receipt APIPOST /v1/documents/receipt with multipart file, Bearer auth, and predictable fields for merchant, tax, and totals. Full reference: extractReceipt docs.