Create or Update Contact
keap.upsert_contact
ActionCRM & salesconnection required
Calls the Keap API with the connection's credentials.
Create a contact in Keap, or update the existing contact Keap matches as a duplicate, and return the resulting record.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- OAuth 2.0
- Providers
- Keap
- Secret shape
- {"client_id": "…", "client_secret": "…", "refresh_token": "…"}
- Config it needs
- base_url, default_user_id
- 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 |
|---|---|---|---|---|---|
contact The contact as Keap's own field names; the email address or name is what Keap matches an existing record on. | object | Yes | — | — | {"email_addresses":[{"email":"ada@example.com","field":"EMAIL1"}],"given_name":"Ada"} |
duplicate_option How Keap decides an existing contact is the same person: by email address alone, or by email address and name. | string | No | — | one of "Email", "EmailAndName" | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"contact": {
"email_addresses": [
{
"email": "ada@example.com",
"field": "EMAIL1"
}
],
"given_name": "Ada"
}
}Output
One shape.
result
The provider's response object, as returned.
Extra keys beyond the ones listed can appear.
{}Notes
- Keap answers with the resulting contact either way and never says whether it created or updated it, so this node does not claim one.
- A new contact still needs at least one email_addresses or phone_numbers entry.
See Create or Update Contact run in a workflow.
In a technical demo we add the Keap connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.