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.

8 minUpdated 2026-09-04

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. 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. 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. 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. 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. 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. 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. 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.