A step-by-step guide: how to connect a QR vCard Pro webhook to Zapier, and Zapier to your CRM — without writing code.
contact.received (or all, *).Three events: contact.received (a lead came in — the key one for CRM), card.created and scan.recorded.
Tip: run the test first — Zapier then "learns" the fields (data.email…) and offers them for mapping.
Add an Action step and pick your CRM. Map the webhook fields (prefixed data.):
Action Create or Update Contact: data.email → Email, data.name → Name, data.phone → Phone, data.company → Company.
Action Create Person: data.name → Name, data.email → Email, data.phone → Phone.
Action Create Lead: data.name → Last Name, data.email → Email, data.company → Company (required).
Action Create Spreadsheet Row: each lead becomes a row.
Turn the Zap on (Publish). From then on, every new contact.received flows into your CRM automatically, in real time.
Every webhook is an HTTP POST with a JSON body. The useful data is in the data field.
| Event | Key fields in data |
|---|---|
contact.received | contact_id, card_id, name, email, phone, company, message, consent_given, acquisition_method, received_at |
card.created | card_id, title, slug, landing_url, created_at, updated_at, meta |
scan.recorded | card_id, action, scanned_at |
X-QRVP-Event | the event name |
X-QRVP-Signature | sha256=<HMAC> |
X-QRVP-Delivery | unique delivery ID |
X-QRVP-Attempt | retry attempt number |
Every call carries X-QRVP-Signature as sha256=<hash> — the HMAC-SHA256 of the body, signed with the secret. The receiver can thus confirm the call comes from your site.
Zapier's Catch Hook needn't verify the signature (the URL is secret). Verification matters for your own endpoint:
| Symptom | Cause & fix |
|---|---|
| Zapier doesn't catch the test | URL pasted wrong, or the webhook isn't subscribed. Check the URL and that contact.received is selected. |
| No "Webhooks" page | Tier is below Unlimited. Webhooks start at the Unlimited plan. |
| CRM fields empty | Mapping uses the wrong path — fields are under data (e.g. data.email). |
| Calls are delayed | Delivery is async (WP-Cron). For instant delivery, set a real system cron. |