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
| Step | Module | Role |
|---|---|---|
| 1 | Google Drive — Watch Files in a Folder | Trigger when a new receipt lands |
| 2 | Filter | Keep only supported MIME types |
| 3 | Google Drive — Download a File | Get binary for multipart upload |
| 4 | HTTP — Make a Request | Call Cryvis Receipt API |
| 5 | Google Sheets — Add a Row | Persist merchant and totals |
| 6 | Error 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.
| Setting | Value |
|---|---|
| URL | https://api.cryvis.com/v1/documents/receipt |
| Method | POST |
| Headers | Authorization: Bearer {{API_KEY}} |
| Body type | Multipart/form-data |
| Field name | file |
| File | Map 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 column | Make 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 File | Drive 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
InboxDrive folder and aProcessedfolder. After a successful Sheets write, move the file with Drive — Move a File so the watch trigger does not reprocess it. - Add a
Statuscolumn defaulting toextracted. Downstream finance can change it tobookedwithout re-running OCR. - If the same receipt can be uploaded twice, skip Add a Row when
receipt_number+transaction_datealready 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_itemsmay be empty whiletotal_amountis present. Always trust total over line-item sum when line items are sparse. - Foreign currency:
currencyis 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:
| Condition | Action |
|---|---|
| HTTP 401 / 403 | Stop 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 / 5xx | Enable incomplete executions + exponential backoff |
success: false in body | Treat 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
- Drop one JPEG of a clear retail receipt into the Inbox folder.
- Run the scenario once (or wait for the watch interval).
- Confirm HTTP returns
success: trueanddata.total_amountmatches the paper total. - Confirm Sheets has one new row with merchant and total.
- Drop a
.docxor HEIC file — Filter should discard it. - 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
Failurestab + Slack alert for ops. - Move-to-Processed after success so the Inbox stays empty.
Related guides
- Automate expense tracking (Gmail → Airtable)
- Employee expense workflow with Slack approval
- Receipt to Google Sheets (columns & idempotency)
- Convert receipts to JSON over HTTP
- Make.com hub
CTA
Need structured receipt JSON without building OCR yourself? Use the Cryvis Receipt API — POST /v1/documents/receipt with multipart file, Bearer auth, and predictable fields for merchant, tax, and totals. Full reference: extractReceipt docs.