Add or Update Contacts
sendgrid.upsert_contacts
ActionEmailconnection required
Calls the SendGrid API with the connection's credentials.
Queue an add-or-update of marketing contacts, optionally adding them to one or more lists, and return the job id SendGrid assigns.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- SendGrid
- Secret shape
- {"api_key": "…"}, or the API key on its own
- Config it needs
- from_email, from_name
- Resolved by
- config.connection_id, else node.connection_id
Configuration
2 fields, 1 required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
contacts Contact objects, each with at least an email, external_id, anonymous_id or phone_number_id. | array | Yes | — | array of object | [{"email":"ada@example.com","first_name":"Ada"}] |
list_ids Marketing list ids to add the contacts to, separated by commas. | string | No | — | — | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"contacts": [
{
"email": "ada@example.com",
"first_name": "Ada"
}
]
}Output
One shape.
result
| Field | Type | Example |
|---|---|---|
job_id The asynchronous import job SendGrid queued. | string | — |
queued Always true: the write is queued, not yet applied. | boolean | — |
submitted How many contact objects were sent. | number | — |
{
"job_id": "",
"queued": false,
"submitted": 0
}Notes
- SendGrid processes contact writes asynchronously: the call answers with a job_id and the contacts are queued, not yet stored. Poll SendGrid's import job status endpoint if you need to know the job finished.
- A single call accepts at most 30,000 contacts or 6 MB.
Templates that use SendGrid
See Add or Update Contacts run in a workflow.
In a technical demo we add the SendGrid connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.