Extract Receipt Data with Zapier and Cryvis
Google Drive New File → Cryvis Receipt API → Google Sheets. Map merchant, date, total, currency, and payment method.
Finance teams already dump receipts into a shared Drive folder. The gap is structured data: merchant, date, and total still get typed by hand. This Zap closes that gap with Drive as the source, the Cryvis Receipt API as the extractor, and Google Sheets as the ledger.
Hub: Zapier + Cryvis. Invoices use a different endpoint — extract invoice data. Multipart reference: Send multipart form data.
Workflow
[Google Drive: New File in Folder]
|
v
[Filter: filename / MIME pdf|jpeg|png|webp]
|
v
[Webhooks by Zapier: Custom Request]
POST /v1/documents/receipt
multipart file + Bearer key
|
v
[Filter: success is true]
|
v
[Google Sheets: Create Spreadsheet Row]
merchant | date | total | currency | receipt # | paymentSteps
| Step | App / action | Role |
|---|---|---|
| 1 | Google Drive — New File in Folder | Trigger when a receipt lands |
| 2 | Filter | Keep supported files |
| 3 | Webhooks — Custom Request | Call Cryvis Receipt API |
| 4 | Filter | Drop failed extractions |
| 5 | Google Sheets — Create Spreadsheet Row | Persist merchant and totals |
Watch a dedicated folder such as Finance/Receipts/Inbox. Do not watch the whole Drive — every spreadsheet export will fire the Zap.
What you need
- Zapier + Google Drive + Google Sheets
- Cryvis API key — Receipt API
- Sample receipt PDF or phone photo (JPEG/PNG/WebP)
Credits: 1 per PDF page or image — Credits.
Cryvis HTTP configuration
Required shape for Custom Request:
| Piece | Value |
|---|---|
| Method | POST |
| URL | https://api.cryvis.com/v1/documents/receipt |
| Header | Authorization: Bearer <API_KEY> |
| Body | multipart/form-data |
| Part name | file |
| Part value | Drive file binary |
Store the API key in a place your team controls. Do not paste live keys into public Zap templates.
Supported MIME: application/pdf, image/jpeg, image/png, image/webp. Docs: extractReceipt.
Example response
{
"success": true,
"data": {
"receipt_number": "RCT-88421",
"transaction_date": "2026-09-10",
"merchant": { "name": "North Cafe" },
"payment": { "method": "card" },
"currency": "USD",
"total_amount": 28.40
},
"meta": {}
}Map from data.*. Nested merchant and payment need dotted paths: data.merchant.name, data.payment.method.
Sheets mapping
Headers (row 1):
Receipt Number | Transaction Date | Merchant | Total | Currency | Payment Method | Source File | Processed At
| Column | Source |
|---|---|
| Receipt Number | data.receipt_number |
| Transaction Date | data.transaction_date |
| Merchant | data.merchant.name |
| Total | data.total_amount |
| Currency | data.currency |
| Payment Method | data.payment.method |
| Source File | Drive file name |
| Processed At | current timestamp |
Keep one file per Zap run so you map data directly. Batching multiple files in one request is a different response shape — stick to single-file for this ledger Zap.
Filters and errors
After Drive: filename ends with .pdf, .jpg, .jpeg, .png, or .webp.
After Custom Request: only continue if success is true.
Use Zap history to inspect the Custom Request body when Sheets stays empty — usually a mapping path issue (merchant.name vs top-level) or a failed extraction that skipped the success Filter.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| 401 | Bad Bearer token | Authorization: Bearer … with one space |
| Missing file | Wrong part name | Must be file |
| Merchant blank | Mapped merchant object | Use data.merchant.name |
| Duplicate rows | Drive re-trigger | Move to Processed after success |
| High credit burn | Multi-page PDF “receipts” | Prefer single-page images when possible |
Test
- Drop one known receipt into the inbox folder.
- Confirm Custom Request →
success: truein Zap history. - Check Sheets: merchant, date, total, currency, payment method.
- Move the file to Processed and confirm the Zap does not re-fire.
Optional Paths for expense policy
After the success Filter:
Path A: data.total_amount (Number) greater than or equal to 100
→ Slack #expenses-review with merchant + total
→ Sheets row (same mapping)
Path B: fallback
→ Sheets row onlyUse Formatter to coerce total_amount to a number if Paths treat it as text. Thresholds live in Zapier — Cryvis only returns the extracted total.
Production notes
- Phone photos work; blur and glare still produce nulls — Filter or Slack-alert when
merchant.nameis empty if you want human review. - Archive after success so New File stays quiet.
- Keep the inbox folder free of invoices; invoice PDFs belong on extract invoice data or automate invoice processing.
- Multi-page “receipt” PDFs cost one credit per page — prefer single-page captures for employee expense volume.