Developers
Send gifts from a Clay table
Turn a Clay table of prospects or customers into shipped gifts: one HTTP API enrichment sends a gift per row, the recipient enters their own address through a private link, and a second column (or a webhook) shows when each gift was claimed, shipped and delivered.
Clay finds and enriches the person; Printonic makes and ships the gift. The bridge is Clay's HTTP API enrichment, which sends one request per row to the Printonic Partner API. The endpoint it calls takes a flat body (name, email, the gift, a message, a row id) and answers a flat row (team order id, claim status, tracking), so nothing in Clay has to build nested JSON.
Every gift is a one-recipient team order: the same pricing, claim link, printed card and manifest as team orders in the dashboard, charged to your Printonic account through your partner key's billing mode.
- 1
Printonic partner team
Get a partner key with the team_orders capability
Partner keys (pk_live_...) are issued by Printonic and bound to your Printonic account, the wallet or net-terms balance gifts are charged against. New keys carry the team_orders capability; ask us to enable it on an older key. You send it as Authorization: Bearer on every request.
Keep the key in Clay's header account store (next step), never in a table cell. - 2
Clay table > Add enrichment > HTTP API > Configure
Add the HTTP API enrichment
Set the HTTP method to POST and the API endpoint URL to https://printonic.com/api/external/team-orders/quick. Under Header fields choose Select header account, then + Add account, and enter key Authorization with value Bearer pk_live_... (your key); name it and save. Clay stores the header encrypted at the workspace level and reuses it across columns.
A header typed straight into the column is visible to everyone who can open the table. Content type is set by Clay to application/json. - 3
Configure > JSON body
Write the JSON body with your columns
Type / inside a value to reference a column. The body needs idempotency_key (a stable row id or the contact's CRM id), recipient_name, recipient_email, and the gift: collection set to thank-you, welcome, milestone or executive, or sku_code for a product of your own. Add message for the personal line, sender for the name the recipient sees (defaults to your team name), printed_card: true to print the message on a card, and recipient_company if you have it.
Put quotes around every column reference; Clay treats them as strings. The recipient picks options such as size on the claim page, so nothing about sizes goes in the body. - 4
Configure > Field paths to return > Test
Pick what the column shows and test one row
Under Field paths to return enter team_order_id, claim_status and charged_cents (or leave it empty and use Add as column from the cell details later). Click Test with a row that has a colleague's email: the claim email arrives within a minute and the cell shows the team order id. Then run the column on the rows you mean to send.
Money moves on every 201. Keep the table's auto-run off, or add an Only run if formula that checks a Send column, so a new row cannot send a gift on its own. - 5
idempotency_key
Re-run safely
Clay re-runs cells when their inputs change or when you update out-of-date cells, and it does not promise automatic retries. The idempotency_key makes that harmless: the same row id answers the original result (200, already_existed: true) instead of a second gift; a 402 (insufficient funds, credit limit, daily cap) leaves the gift created but unpaid until you fund the account and run the row again with the same key.
Never use a timestamp or a formula that changes as the key. The same key with a different gift is a 409. - 6
Second HTTP API enrichment > GET
Show claimed, shipped and delivered in the table
Add another HTTP API enrichment with method GET and the URL https://printonic.com/api/external/team-orders/<team_order_id>/quick, inserting the team_order_id column into the path, with the same header account. Return claim_status, shipment_stage, tracking_url, shipped_at and delivered_at. Under the table's Run settings, re-run the column on a schedule (daily on every plan, hourly on Enterprise) and give it an Only run if formula that runs while delivered_at is empty.
Prefer webhooks when you want the update without polling: register a Clay Monitor webhook table with POST /api/external/webhooks for team_order.claimed, team_order.shipped and team_order.delivered, then join it to the sending table with a Lookup single row column on data.team_order.reference (your row id). - 7
POST /api/external/team-orders/{id}/cancel
Cancel before production
A gift can be canceled while the recipient has not entered an address or the parcel is not yet in production; the charge goes back to the wallet (on net terms it reduces the balance). Once a label is printed, contact Printonic.
Good to know
- Start with the thank-you collection and a short message; it is the lightest gift and the fastest way to see the whole loop.
- Use the contact's CRM id as the idempotency_key when the table is fed from HubSpot or Salesforce: it survives table rebuilds.
- Set the column's rate limit (for example 30 requests per 60000 ms) below your key's limit so a big table never trips a 429.
- Clay does not document escaping inside JSON bodies; keep the message free of double quotes or clean it with a formula column first.
Common questions
Who pays, and how much?
Your Printonic account, through the partner key's billing mode (prepaid wallet then the saved card, or net terms). The answer's charged_cents is the exact amount for that row; a collection's per-recipient price is listed on printonic.com/teams.
Where does the recipient's address come from?
From the recipient. Printonic emails a private claim link; they enter their address and choose options such as size. Nothing ships until they do, and the link expires after claim_expiry_days (30 by default).
Can Clay see the claim link?
Only if the body sets return_claim_link: true. The link is the recipient's only credential, so leave it out of tables other people can open.
Which countries can recipients be in?
United States by default; add destination_countries with any of CA, GB, AU, DE, FR, NL, IT and ES. International gifts are priced per destination and duties are paid by the recipient on delivery.
Related guides
Team orders and webhooks over the Partner API
For gifting platforms and agencies: create a team order for your client with one call (a bundle, many recipients, claim links, printed card, event date), pay through your partner billing mode, follow every gift with signed webhooks, and cancel before production.
Send one gift to many people with a team order
Pick a gift, add your recipients, pay once. Send each person a link so they enter their own shipping address and pick a size, or upload a spreadsheet of addresses in the US, Canada, the UK, Australia, Germany, France, the Netherlands, Italy or Spain. Add a printed card to every parcel, download a quote with your PO number, and export the manifest for finance.
Send a gift to contacts from your CRM
Pick one HubSpot or Salesforce contact or several at once (or type a name and email), pick the gift, write a line, send. Each contact enters their own address through a private link, every gift is paid from the team balance within your monthly budget, and the activity is written back to each contact record when it is sent, addressed, shipped and delivered. Rules can send gifts on their own when a record is created or moves to a stage.