How do I send a handwritten card from Zapier or Make?
No code needed
Use the public Scribble app on Zapier, currently in beta, or the Scribble app on Make. In Zapier, choose Send Card; in Make, choose Send a handwritten card. Map the recipient's US mailing address and message from your trigger. An inbound hook is another option: create one under Integrations and send the recipient's details to its URL as JSON. The steps below cover that hook setup.
On this page
Choose a connection
Use the native Scribble action in Zapier or Make if it fits your workflow. The steps below use an HTTP hook instead. Both need a full US mailing address and credits.
Create the hook in Scribble
Open Integrations. Under Send a card from anything, choose New hook URL. Name it after the workflow.
Set the design, message template, Signed by and Handwriting. An incoming
messageorhandwritingoverrides the saved value. Choose Create hook URL and copy the private URL.A hook message template Congratulations, {{first_name}} — everyone at {{sender_name}} is glad the {{deal_name}} deal came through.You’ll know it worked when The hook appears in the list with a URL like
https://scribblecards.com/api/v1/hooks/whk_.... Copy it now: it is shown once and stored hashed.Check the hook is live
Paste the URL into a browser. A
GETreturns a small JSON object confirming the hook is live and showing an example payload — some tools verify an endpoint by fetching it before they will let you save it, so this is deliberate.GET on a hook URL { "object": "inbound_hook", "ready": true, "message": "This hook is live. POST a JSON body with a recipient to send a card.", "example": { "name": "Priya Raman", "line1": "1 Fifth Avenue", "city": "New York", "state": "NY", "zip": "10003", "message": "Congratulations from all of us." } }Add a Webhooks by Zapier action
Action event: POST. URL: your hook URL. Payload type: JSON.
Add one data field per value below, mapping each to the right field from your trigger step.
Testing this POST creates a real paid card. Use your own address. For retries, use a Custom Request action if you need to set an
Idempotency-Keyheader; use the same source-event ID on every retry.Zapier data fields name → {{Contact Full Name}} line1 → {{Mailing Street}} line2 → {{Mailing Suite}} (optional) city → {{Mailing City}} state → {{Mailing State}} two letters, e.g. NY zip → {{Mailing Postal Code}} five digits deal_name → {{Deal Name}} used by the template reference → {{Deal ID}} echoed back, for your recordsYou’ll know it worked when Zapier's test returns a
201and a body containing a card code likeSC-2CR9793and anarrives_betweenwindow.Handle the failures you will actually get
Add a filter step before the POST so the Zap only fires when the address fields are present. A
422from Scribble means the card was not created and nothing was charged, but a Zap that fails half the time is a Zap nobody trusts.Turn it on and watch the first few
Scribble's Integrations screen logs every call it receives with the status and the reason. Check it after the first real trigger.
You’ll know it worked when The hook shows a cards sent count and a last fired timestamp.
#The fields a hook accepts
The hook is deliberately forgiving about shape, because Zapier's field mapper is not. All of these work:
| Field | Also accepted as | Required |
|---|---|---|
name | first_name + last_name | Yes |
line1 | address1 | Yes |
line2 | address2 | No |
city | — | Yes |
state | — | Yes, two letters |
zip | postal_code | Yes, five digits or ZIP+4 |
country | — | No, defaults to US |
message | — | Only if the hook has no message template |
arrive_on | — | No, YYYY-MM-DD |
reference | id | No. Echoed back so you can correlate. |
Fields can be at the top level or nested inside a recipient object — both are read, so a flat Zapier field map works without a wrapper. The full contract is in the inbound hook reference.
#When it goes wrong
| Status | Code | What to do |
|---|---|---|
| 401 | invalid_hook | The URL is wrong or the hook was deleted. Copy it again from Integrations. |
| 403 | hook_disabled | The hook was paused. Turn it back on under Integrations. |
| 422 | invalid_recipient | A required address field is missing or malformed. The message names the fields. |
| 422 | template_incomplete | Your payload has no value for a field the message template uses. Send that field, or send a finished message instead. |
| 402 | no_credits | The balance is empty. Nothing was created; top up and re-run the Zap. |
Last checked against the product on . Something wrong or missing? Tell us.
