Written By William Bowen
Last updated About 1 month ago
Intro
This AI agent on Clerk Chat automatically checks each contact card for a full name and email address whenever a contact messages in. If any details are missing, it intelligently scans the conversation history to extract them and creates a new contact or asks the user for these details if necessary.
For example, if a user types "Hi, I'm Jane Doe and my email is jane@example.com," the agent will update the contact card with that information before moving on to its next task.
Use cases
New Contact Initialization β The AI agent auto-generates a contact entry from a user's message by extracting the name and email if the contact card is empty. For example, when someone writes, "Hi, I'm John Smith, my email is john.smith@example.com," the agent creates a new contact with that information.
Data Recovery from Incomplete Profiles β It identifies missing contact details by reviewing previous conversation history to fill gaps in the contact card. For example, if a contact card only has an email but no name, and the chat includes "This is Sarah Connor," the agent adds the name accordingly.
Error Handling in Contact Creation β The agent detects inconsistencies or missing data in a contact card and prompts the user for clarification. For instance, if a conversation only includes "email: mike@example.com" without a name, the AI asks, "Could you please provide your full name?"
Automated Follow-Up β Once the contact is fully populated, the agent immediately moves to the next logical step in the workflow. For example, after confirming "Emily Rose" and "emily.rose@example.com," it asks, "What service are you interested in today?"
CRM Data Integrity β It ensures every new conversation has complete and accurate data in the CRM, improving overall data quality. For example, during a multi-channel chat session, the agent confirms and updates the contact details for every message thread.
Pre-Screening for Customer Support β The agent quickly gathers essential contact information before routing to a human agent. For example, in a support chat, it ensures the contact card includes "Alex Turner" and "alex.turner@example.com" before transferring the chat.
Personalized User Engagement β It uses the contactβs name to create a personalized conversation experience. For example, once it confirms "Olivia Brown," the follow-up message might read, "Hi Olivia, how can I assist you today?"
Multi-Channel Consistency β The agent consolidates data across various messaging channels to maintain a single, unified contact profile. For example, if a user sends an email and a chat message from the same person, the agent ensures both interactions are recorded under one complete contact profile.
Marketing List Enrichment β Complete contact details enable effective segmentation and targeted marketing campaigns. For example, after verifying "Liam Davis" and "liam.davis@example.com," the agent flags the contact for a promotional email campaign.
Pre-Call Preparation β The agentβs collection of full contact information helps sales teams prepare for calls with a detailed profile. For example, before a scheduled call, the system shows the representative that the contact is "Sophia Miller" with "sophia.miller@example.com," ensuring a smoother engagement.
Screenshots



Template
Example{
"$schema": "https://web-api.clerk.chat/pipeline-schema",
"name": "Email and name",
"nodes": [
{
"type": "ai_bot",
"name": "Ask appropriate next question",
"triggeredBy": [
"unreadMessage.fromAny"
],
"responseType": "user_message",
"nodeConfig": {
"modelProvider": "openai",
"modelVersion": null,
"maxTokens": null,
"temperature": null,
"variables": {},
"prompt": "Your job is to read the conversation history and ask a suitable next question to the lead. It should be conversational and related to the lead's incoming message. \n\nYour output should be less than 30 words.",
"promptSections": [],
"sectionTemplates": {},
"responseSchema": {
"type": "object",
"required": [],
"properties": {}
},
"opts": {
"sendStructuredConvo": true
}
}
},
{
"type": "tool_runner",
"name": "Set email",
"triggeredBy": [
"unreadMessage.fromAny"
],
"responseType": "json",
"nodeConfig": {
"type": "contact_tools",
"config": {},
"enabledTools": [
"set_attribute"
],
"tools": {
"set_attribute": {
"paramValues": {
"attributeName": {
"type": "fixed",
"value": "email"
},
"attributeValue": {
"path": "email",
"type": "pipeline-variable"
}
}
}
}
}
},
{
"type": "tool_runner",
"name": "Set name",
"triggeredBy": [
"unreadMessage.fromAny"
],
"responseType": "json",
"nodeConfig": {
"type": "contact_tools",
"config": {},
"enabledTools": [
"set_attribute"
],
"tools": {
"set_attribute": {
"paramValues": {
"attributeName": {
"type": "fixed",
"value": "name"
},
"attributeValue": {
"path": "full_name",
"type": "pipeline-variable"
}
}
}
}
}
},
{
"type": "ai_bot",
"name": "Extract name + email",
"triggeredBy": [
"unreadMessage.fromAny"
],
"responseType": "json",
"nodeConfig": {
"modelProvider": "openai",
"modelVersion": null,
"maxTokens": null,
"temperature": null,
"variables": {},
"prompt": "Your job is to read the conversation history and extract the user's full name and email address. \n\nOutput their full name under: \"full_name\"\n\nOutput their email address under: \"email\"\n\nIf either of both of these are not present in the conversation, leave these variables plank (e.g. \"\").",
"promptSections": [],
"sectionTemplates": {},
"responseSchema": {
"type": "object",
"required": [
"email",
"full_name"
],
"properties": {
"email": {
"type": "string"
},
"full_name": {
"type": "string"
}
}
},
"opts": {
"sendStructuredConvo": true
}
}
},
{
"type": "template",
"name": "Ask for name and email",
"triggeredBy": [
"unreadMessage.fromAny"
],
"responseType": "user_message",
"nodeConfig": {
"template": "Thanks for reaching out! To start, could I get your full name & email address?"
}
},
{
"type": "trigger",
"name": "Start",
"triggeredBy": [
"userMessage"
],
"responseType": "json"
}
],
"edges": [
{
"name": null,
"sourceNode": "Set name",
"destinationNode": "Set email",
"sourceVariables": null,
"filters": []
},
{
"name": "If they are both filled",
"sourceNode": "Set email",
"destinationNode": "Ask appropriate next question",
"sourceVariables": null,
"filters": [
{
"type": "rule",
"config": {
"syntax": {
"and": [
{
"!": [
{
"isEmpty": [
{
"var": "context.full_name"
}
]
}
]
},
{
"!": [
{
"isEmpty": [
{
"var": "context.email"
}
]
}
]
}
]
}
}
}
]
},
{
"name": null,
"sourceNode": "Extract name + email",
"destinationNode": "Set name",
"sourceVariables": null,
"filters": []
},
{
"name": "If either is still empty",
"sourceNode": "Set email",
"destinationNode": "Ask for name and email",
"sourceVariables": null,
"filters": [
{
"type": "rule",
"config": {
"syntax": {
"or": [
{
"isEmpty": [
{
"var": "context.full_name"
}
]
},
{
"isEmpty": [
{
"var": "context.email"
}
]
}
]
}
}
}
]
},
{
"name": "If name or email are empty",
"sourceNode": "Start",
"destinationNode": "Extract name + email",
"sourceVariables": null,
"filters": [
{
"type": "rule",
"config": {
"syntax": {
"or": [
{
"isEmpty": [
{
"var": "context.contact.name"
}
]
},
{
"isEmpty": [
{
"var": "context.contact.email"
}
]
}
]
}
}
}
]
}
]
}