# How do you send job changes to a Clay table?

> Source: https://www.rodz.io/en/guides/use-cases/job-changes-to-clay/
> Updated on 2026-10-12 · Peter Cools · Recipe · Job changes · Clay

## Short answer

Rodz has no native Clay app: the link is a webhook. Create a webhook-fed table in Clay, copy its URL, paste it as the webhook of your Rodz Job Changes signal, then send a test lead. Every decision-maker who changes jobs arrives as a Clay row, with the new role, the previous employer and the contact. A lead costs 2 credits.

## Key facts

- A job change costs **2 credits** per lead, plus 0.5 credit per email found (`getEmails`), charged on success only.
- Delivery is **at least once**: a lead can arrive twice after a retry, so de-duplicate on `contact.lead_id`.
- On the Clay side, a webhook source accepts **50,000** submissions at most (Clay documentation): plan a new table beyond that.
- Rodz identifies **400,000+ signals a month** (July to September 2026 average).

Cost: 2 credits per lead (+0.5 credit per email found)

## Before you start

- A Rodz account with credits (the test account includes 100).
- A Clay workspace where you can create a table.
- A Rodz API key (Integrations → API) if you configure through the API.

## Steps

### 1. Create a webhook-fed table in Clay

In a Clay workbook, click **+ Add**, search for **Webhooks** and choose **Monitor webhook**. Copy the webhook **URL**. Clay also offers an optional authentication token sent in a header: Rodz does not send custom headers, so leave it off and keep the URL secret.

### 2. Create the Job Changes signal in Rodz

In **My Signals**, click **Activate Signal** and pick **Job Changes** and set the roles to follow, the size and industry of the new employer, and the person’s location. Keep the signal as a **draft** for now. Tick **Get emails** if you do not want to enrich emails in Clay.

### 3. Paste the Clay URL as the signal’s webhook

In the signal’s **Integrations** tab, set the **webhook** to the Clay URL and save. Through the API, it is the signal’s `webhookUrl` field, on creation (`POST /api/v1/signals/job-changes`) or later with a `PATCH`.

`Same setting through the API`

```bash
curl -X PATCH "https://api.rodz.io/api/v1/signals/$SIGNAL_ID" \
  -H "Authorization: Bearer $RODZ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"webhookUrl": "YOUR_CLAY_WEBHOOK_URL"}'
```

### 4. Send a test lead and create the columns

Send a sample lead with `POST /api/v1/signals/{signal_id}/test-webhook`. The response gives the HTTP status Clay returned and the payload sent, which carries `signal.is_test: true`. The test row appears in Clay: add a column for each nested field you need (`contact.email`, `signal.new_company`...), see the table below.

`Send a test lead to the signal’s webhook`

```bash
curl -X POST "https://api.rodz.io/api/v1/signals/$SIGNAL_ID/test-webhook" \
  -H "Authorization: Bearer $RODZ_API_KEY"
```

### 5. Activate the signal and filter tests and duplicates

Set the signal to **Active**. In Clay, exclude rows where `signal.is_test` is `true` and de-duplicate on `contact.lead_id`: when Clay fails transiently, Rodz retries the delivery, so a lead can arrive twice. If your table was unavailable, `POST /api/v1/signals/{signal_id}/replay-webhook` resends every lead already produced (they carry `signal.is_replay: true`).

## Example payload

What Clay receives for one lead: the JSON is posted as is to the webhook URL (same format as `GET /api/v1/signals/{signal_id}/leads`).

```json
{
  "signal": {
    "id": "d4f5a6b7-c8d9-4e0f-a1b2-c3d4e5f6a7b8",
    "name": "New CTOs in France",
    "type": "job_changes",
    "last_signal": "Job Change",
    "last_signal_date": "2026-10-08",
    "previous_title": "VP Engineering",
    "previous_company": "Northwind Analytics",
    "previous_company_linkedin_url": "https://www.linkedin.com/company/northwind-analytics/",
    "previous_job_started_on": "2021-01",
    "previous_job_ended_on": "2026-08",
    "new_title": "CTO",
    "new_company": "Tech Corp",
    "new_job_started_on": "09/2026",
    "new_job_start_month": "2026-09",
    "change_type": "company"
  },
  "contact": {
    "lead_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "created_at": "2026-10-08T07:12:00+00:00",
    "first_name": "Thomas",
    "last_name": "Bernard",
    "email": "thomas.bernard@techcorp.example",
    "phone": "",
    "title": "CTO",
    "location": "Paris, Île-de-France, France",
    "country_code": "FR",
    "city": "Paris",
    "linkedin_profile_url": "https://www.linkedin.com/in/thomas-bernard-example",
    "sales_navigator_profile_url": "",
    "matched_persona": "CTO"
  },
  "company": {
    "name": "Tech Corp",
    "website": "https://techcorp.example",
    "linkedin_url": "https://www.linkedin.com/company/techcorp-example",
    "industry": "Software Development",
    "employee_count": 320,
    "employee_range": "201-500",
    "hq_country_code": "FR",
    "hq_city": "Paris"
  }
}
```

## Clay columns ← payload fields

| Suggested Clay column           | Payload field                                      |
| ------------------------------- | -------------------------------------------------- |
| Lead ID (unique key)            | `contact.lead_id`                                  |
| First name, Last name           | `contact.first_name`, `contact.last_name`          |
| Email                           | `contact.email`                                    |
| New role                        | `signal.new_title`                                 |
| New company                     | `signal.new_company`, `company.website`            |
| Start month                     | `signal.new_job_start_month`                       |
| Previous role, previous company | `signal.previous_title`, `signal.previous_company` |
| Change type                     | `signal.change_type` (`company`, `title`, `both`)  |
| LinkedIn                        | `contact.linkedin_profile_url`                     |
| Persona                         | `contact.matched_persona`                          |
| Size                            | `company.employee_range`                           |
| Test?                           | `signal.is_test` (present on test sends)           |

## What you can do in Clay

Clay is the workshop here: Rodz detects the change and delivers the contact, Clay runs your own steps.

1. **Qualify**: a scoring column on `company.employee_range`, `company.industry` and `signal.change_type` (a move to a new company is often worth more than an internal promotion).
2. **Personalize**: a first message built from `signal.new_title` and the start month.
3. **Route**: an export column to your CRM or sequencing tool.

If your final destination is HubSpot or lemlist, the native recipe is simpler: see [job changes to HubSpot](/en/guides/use-cases/job-changes-to-hubspot/).

## Troubleshooting

- **The test fails**: the `test-webhook` response gives `statusCode`, `error` and the start of Clay’s response. Check the copied URL.
- **`signed: false` in the test response**: no API key is linked to the signal, so deliveries go out unsigned. No effect for Clay, which does not verify.
- **Nothing arrives after weeks**: the table may have reached Clay’s 50,000-submission limit.

## Frequently asked questions

### Does Rodz have a native Clay integration?

No. Rodz pushes natively to HubSpot, Pipedrive, Google Sheets, lemlist and other sequencing tools; Clay connects through the signal’s webhook. It is reliable and no-code, but you create the columns and handle de-duplication.

### Can Clay verify the Rodz webhook signature?

No. Rodz signs every delivery (`X-Webhook-Signature` and `X-Webhook-Timestamp` headers, HMAC-SHA256), but a Clay table does not verify signatures. Keep the Clay URL secret. If verification is mandatory for you, put a small receiver in between that verifies, then forwards to Clay.

### Why duplicate rows?

Delivery is at least once: after a timeout or a 5xx from Clay, Rodz retries. The same lead keeps the same `contact.lead_id`: use it as the unique key.

### What happens beyond 50,000 rows?

The 50,000-submission cap per webhook source is a Clay limit. Create a new webhook table and update `webhookUrl` on the signal with a `PATCH`.

### Can I read leads without a webhook?

Yes: `GET /api/v1/signals/{signal_id}/leads` returns the signal’s leads, newest first, in the same format. Reading leads is free.

## Sources

- [Rodz API reference: webhooks, signature, test-webhook, replay-webhook](https://api.rodz.io/docs)
- [Clay: Webhooks in Clay](https://university.clay.com/docs/webhook-integration-guide)

## Related guides

- https://www.rodz.io/en/guides/use-cases/job-changes-to-hubspot/
- https://www.rodz.io/en/guides/api/webhook-receiver-hmac/
- https://www.rodz.io/en/guides/use-cases/funding-rounds-to-n8n/
