| AUTO-108 |
Add create_contact node to flow |
Logged in as Agent, flow builder is open |
1. Open flow builder for a draft flow 2. Click on empty canvas area 3. Select node type dropdown 4. Select "Create Contact" 5. Click to place node on canvas |
Create Contact node appears on canvas with default configuration. Node has two output handles: "success" and "error" |
High |
| AUTO-109 |
Configure create_contact node with phone session variable |
Logged in as Agent, flow builder open with create_contact node |
1. Click on create_contact node to open config panel 2. In "Phone session key" field, enter "phone" 3. Leave other fields empty 4. Click Save |
Node config persists. phone_session_key="phone" stored |
High |
| AUTO-110 |
Configure create_contact node with name session variable |
Logged in as Agent, create_contact node in builder |
1. Click node to open config panel 2. In "Name session key" field, enter "user_name" 3. Click Save |
Node stores name_session_key="user_name" |
Medium |
| AUTO-111 |
Configure create_contact node with email session variable |
Logged in as Agent, create_contact node in builder |
1. Click node 2. Enter "user_email" in "Email session key" field 3. Click Save |
Node stores email_session_key="user_email" |
Medium |
| AUTO-112 |
Configure create_contact node with tags session variable |
Logged in as Agent, create_contact node in builder |
1. Click node 2. Enter "user_tags" in "Tags session key" field 3. Click Save |
Node stores tags_session_key="user_tags". Tags can be comma-separated string or JSON array string |
Medium |
| AUTO-113 |
Configure create_contact node output variable |
Logged in as Agent, create_contact node in builder |
1. Click node 2. In "Output Contact ID key" field, enter "created_contact_id" 3. Click Save |
Node stores output_contact_id_key="created_contact_id". On success, new contact's ID stored in session as this key |
Medium |
| AUTO-114 |
Configure merge_on_duplicate setting |
Logged in as Agent, create_contact node in builder |
1. Click node to open config 2. Check "Merge on duplicate phone" toggle 3. Click Save |
Node stores merge_on_duplicate=true. If phone exists, contact is updated instead of error |
High |
| AUTO-115 |
Configure contact assignment to user |
Logged in as Agent, create_contact node in builder |
1. Click node 2. Select "Assign to User" from assignment dropdown 3. Select a user from the list 4. Click Save |
Node stores contact_assignment_mode="user" and assigned_user_id. Created contact assigned to selected user |
High |
| AUTO-116 |
Configure contact assignment to team |
Logged in as Agent, create_contact node in builder |
1. Click node 2. Select "Assign to Team" from assignment dropdown 3. Select a team from the list 4. Click Save |
Node stores contact_assignment_mode="team" and assigned_team_id. Created contact assigned to team |
Medium |
| AUTO-117 |
Configure contact assignment to conversation agent |
Logged in as Agent, create_contact node in builder |
1. Click node 2. Select "Assign to Conversation Agent" from assignment dropdown 3. Click Save |
Node stores contact_assignment_mode="conversation_agent". Created contact assigned to whoever is assigned to current conversation |
Medium |
| AUTO-118 |
Create contact node success path |
Logged in as Agent, flow running with create_contact node |
1. Flow receives WhatsApp message with phone number in phone session key 2. Create contact node executes with valid phone and merge_on_duplicate=false 3. New contact created successfully 4. Flow connects success output to next message node |
Contact created with provided phone, name, email, tags. output_contact_id_key populated with new ID. Flow advances via success path. Log entry "flow_create_contact_started" |
High |
| AUTO-119 |
Create contact node missing phone error |
Logged in as Agent, flow running with create_contact node |
1. Flow receives message but phone session key is empty or missing 2. Create contact node executes |
Node logs warning "create_contact_missing_phone" with org_id. Flow advances via error path (if connected) |
High |
| AUTO-120 |
Create contact node duplicate phone without merge |
Logged in as Agent, contact with phone "+1234567890" exists, create_contact node with merge_on_duplicate=false |
1. Flow attempts to create contact with existing phone 2. Node executes |
ValueError raised. Node logs "create_contact_duplicate_phone" with org_id and merge_on_duplicate flag. Flow advances via error path |
High |
| AUTO-121 |
Create contact node merge on duplicate |
Logged in as Agent, contact "+1234567890" exists with name "John", merge_on_duplicate=true |
1. Flow receives new data: phone="+1234567890", name="Jonathan", tags=["Premium"] 2. Create contact node executes with merge_on_duplicate=true |
Existing contact updated. Name changed to "Jonathan" (only if contact had no name before, or updated if configured). Tags merged: ["Premium", ...existing tags]. output_contact_id_key set to existing ID. Flow advances via success |
High |
| AUTO-122 |
Create contact node with tags parsing from comma-separated string |
Logged in as Agent, session contains tags_key="Premium, VIP, Support" |
1. Create contact node configured with tags_session_key="tags_key" 2. Node executes |
Tags parsed as ["Premium", "VIP", "Support"] (whitespace trimmed). Contact created with these tags |
Medium |
| AUTO-123 |
Create contact node with tags parsing from JSON array |
Logged in as Agent, session contains tags_key='["Early", "Adopter"]' |
1. Create contact node with tags_session_key="tags_key" 2. Node executes |
Tags parsed as ["Early", "Adopter"] from JSON array. Contact created with these tags |
Medium |
| AUTO-124 |
Create contact node with empty tags |
Logged in as Agent, tags_session_key points to empty string or missing key |
1. Create contact node with tags_session_key set 2. Node executes with valid phone |
Contact created with no tags. Empty tag list handled gracefully |
Medium |
| AUTO-125 |
Create contact node assignment to user succeeds |
Logged in as Agent, create_contact node with contact_assignment_mode="user", assigned_user_id set |
1. Create contact node executes successfully 2. New contact is created |
Contact created and immediately assigned to specified user. Assignment visible in contact detail view |
High |
| AUTO-126 |
Create contact node assignment to conversation agent |
Logged in as Agent, conversation assigned to User "Alice", create_contact node with mode="conversation_agent" |
1. Create contact node executes in this conversation context 2. New contact created |
Contact assigned to "Alice" (conversation's assigned user). Assignment copied from conversation context |
Medium |
| AUTO-127 |
Create contact node assignment with invalid UUID |
Logged in as Agent, create_contact node with contact_assignment_mode="user" but assigned_user_id is invalid format |
1. Create contact node executes 2. Invalid UUID cannot be parsed |
Warning logged "create_contact_assignment_invalid_user_id". Contact created but assignment skipped. Flow continues |
Medium |
| AUTO-128 |
Create contact node assignment mode none |
Logged in as Agent, contact_assignment_mode="none" |
1. Create contact node executes and creates contact |
Contact created with no assignment. Not assigned to user or team |
Medium |
| AUTO-129 |
Create contact normalizes phone number |
Logged in as Agent, phone_session_key contains "+1 (234) 567-8900" |
1. Create contact node executes with this phone value |
Phone normalized via conversation_service.normalize_phone(). Variations like spaces, dashes, parentheses standardized |
Medium |
| AUTO-130 |
Create contact skips phone normalization if empty |
Logged in as Agent, phone_session_key is empty string after strip() |
1. Create contact node executes |
Phone treated as empty. Error path triggered. No contact created |
Medium |
| AUTO-131 |
Create contact name field optional |
Logged in as Agent, name_session_key set but not populated in session |
1. Create contact node with name_session_key but session has no value or empty string 2. Phone is valid 3. Node executes |
Contact created with name=None (no name set). Email and tags applied if provided. Flow continues on success |
Medium |
| AUTO-132 |
Create contact email field optional |
Logged in as Agent, email_session_key set but session has no value |
1. Create contact node executes with valid phone, no email 2. Node executes |
Contact created with email=None. Other fields applied. Flow continues |
Medium |
| AUTO-133 |
Create contact exception handling |
Logged in as Agent, database error or unexpected exception occurs during contact creation |
1. Create contact node executes 2. Unhandled exception raised in contact_service.create_contact() |
Exception logged with "flow_create_contact_failed_persist" including org_id, flow_id, node_id, and error_type. Error path triggered. Flow continues |
Medium |
| AUTO-134 |
Create contact output variable populated on success |
Logged in as Agent, output_contact_id_key="new_cid", contact created successfully |
1. Create contact node executes 2. Contact created with ID "12345678-abcd-..." 3. Subsequent node uses {{new_cid}} |
Session variable new_cid set to string UUID of created contact. Subsequent nodes can access via {{new_cid}} |
High |
| AUTO-135 |
Create contact output variable not set on error |
Logged in as Agent, output_contact_id_key="new_cid", phone is invalid/missing |
1. Create contact node executes 2. Error path triggered |
Session variable new_cid NOT set. Flow advances via error path |
Medium |
| AUTO-136 |
Configure mark_as_lead setting on create_contact node |
Logged in as Agent, create_contact node in builder |
1. Click create_contact node to open config panel 2. Locate "Mark as Lead" checkbox 3. Check the checkbox 4. Click Save |
Node config persists. mark_as_lead=true stored |
High |
| AUTO-137 |
Create contact with mark_as_lead enabled |
Logged in as Agent, flow running with create_contact node where mark_as_lead=true |
1. Flow receives WhatsApp message with phone number 2. Create contact node executes with valid phone and mark_as_lead=true 3. New contact created successfully |
Contact created with provided phone, name, email, tags. Contact automatically marked as lead. Lead record created with source="chatbot". "lead" tag added to contact tags. System logs "create_contact_mark_as_lead" |
High |
| AUTO-138 |
Create contact with mark_as_lead disabled |
Logged in as Agent, flow running with create_contact node where mark_as_lead=false |
1. Flow receives message with valid phone 2. Create contact node executes with mark_as_lead=false or unchecked |
Contact created without lead record. No "lead" tag automatically added. Contact treated as regular contact |
High |
| AUTO-139 |
Mark as lead on duplicate contact merge |
Logged in as Agent, existing contact without "lead" tag, create_contact node with merge_on_duplicate=true and mark_as_lead=true |
1. Flow attempts to create contact with existing phone 2. Create contact node executes with merge_on_duplicate=true and mark_as_lead=true |
Existing contact merged with new data. If contact is not already tagged as "lead", "lead" tag added. Lead record created for contact if not already a lead. Flow advances via success |
High |
| AUTO-140 |
Mark as lead on duplicate with existing lead tag |
Logged in as Agent, existing contact already tagged as "lead", create_contact node with merge_on_duplicate=true and mark_as_lead=true |
1. Flow attempts to create contact with existing phone and existing lead tag 2. Create contact node executes |
Contact updated with merge. No duplicate "lead" tag added (idempotent). Lead record already exists. Flow advances via success |
Medium |
| AUTO-141 |
Flow simulation shows mark_as_lead note |
Logged in as Agent, flow builder is open with create_contact node configured with mark_as_lead=true |
1. Open flow builder with create_contact node 2. Click Simulate or Preview button 3. Observe simulation panel or builder UI showing node details |
Node configuration description or simulation notes include "; mark as lead" text indicating the option is enabled |
Medium |
| AUTO-142 |
[REMOVED] Create contact node with mark_as_lead syncs lead assignees to contact |
[REMOVED] |
[REMOVED] |
[REMOVED] |
[REMOVED] |
| AUTO-143 |
[REMOVED] Create contact node with mark_as_lead syncs team assignees to lead |
[REMOVED] |
[REMOVED] |
[REMOVED] |
[REMOVED] |
| AUTO-144 |
[REMOVED] Create contact node with mark_as_lead and no assignment |
[REMOVED] |
[REMOVED] |
[REMOVED] |
[REMOVED] |
| AUTO-145 |
[REMOVED] Create contact node mark_as_lead updates existing lead assignees on merge |
[REMOVED] |
[REMOVED] |
[REMOVED] |
[REMOVED] |
| AUTO-146 |
Create contact node assignment to conversation agent with "current_agent" alias |
Logged in as Agent, create_contact node in builder with contact_assignment_mode="current_agent" |
1. Open flow builder with create_contact node 2. Click node to open config panel 3. Select "Assign to Conversation Agent" from assignment dropdown 4. Observe the assignment configuration is saved |
Node stores contact_assignment_mode="current_agent". Flow engine treats "current_agent" as alias for conversation agent assignment |
High |
| AUTO-147 |
Create contact node assignment to conversation agent with "same_as_conversation" alias |
Logged in as Agent, create_contact node in builder with contact_assignment_mode="same_as_conversation" |
1. Flow builder is open 2. Create contact node configured with contact_assignment_mode="same_as_conversation" 3. Flow executes in conversation context where assigned_user_id="alice-123" |
Node stores contact_assignment_mode="same_as_conversation". During execution, contact assigned to same user as conversation. contact.assigned_user_id="alice-123" |
High |
| AUTO-148 |
Create contact node assignment to conversation agent with "same_conversation" alias |
Logged in as Agent, create_contact node configured with contact_assignment_mode="same_conversation" |
1. Flow runs in conversation with assigned_user_id="bob-456" 2. Create contact node executes |
contact_assignment_mode="same_conversation" recognized as conversation agent mode. Contact assigned to "bob-456" |
Medium |
| AUTO-149 |
Create contact node assignment to conversation agent with "same_as_this_conversation" alias |
Logged in as Agent, create_contact node with contact_assignment_mode="same_as_this_conversation" |
1. Flow executes in conversation context with assigned_user_id="charlie-789" 2. Create contact node executes |
contact_assignment_mode="same_as_this_conversation" recognized. Contact assigned to "charlie-789" from conversation context |
Medium |
| AUTO-150 |
Flow simulation shows conversation agent assignment note for multiple aliases |
Logged in as Agent, flow builder open with create_contact node configured with contact_assignment_mode="current_agent" |
1. Open flow builder with create_contact node 2. Click Simulate or Preview button 3. Observe simulation showing node details with assignment info |
Node configuration description includes "; assign like conversation assignee" note for all conversation agent modes: "conversation_agent", "current_agent", "same_as_conversation", "same_conversation", "same_as_this_conversation" |
Medium |
| AUTO-151 |
Lead assignee no longer synced from create_contact node to Lead record |
Logged in as Agent, flow running with create_contact node where mark_as_lead=true and contact_assignment_mode="user" |
1. Flow receives WhatsApp message with phone number 2. Create contact node executes with valid phone, mark_as_lead=true, assigned to user "alice-123" 3. New contact and lead created |
Contact created and assigned to user "alice-123". Lead record created with source="chatbot". Lead's assigned_user_id is NOT set from contact assignment (assignment ownership is Contact only). Lead remains unassigned or with default value. sync_assignees NOT passed to lead upsert |
High |
| AUTO-152 |
Lead record ownership consolidated to Contact after mark_as_lead |
Logged in as Agent, flow running with mark_as_lead=true, contact assigned to user |
1. Flow executes create_contact node with mark_as_lead=true 2. Contact created and assigned to user 3. Lead created and linked to contact |
Contact and Lead both exist. Contact.assigned_user_id="alice-123". Lead has no independent assignee sync from node config. Assignment is read from Contact only. Future assignee changes on Contact will apply to Lead |
High |
| AUTO-158 |
Configure create_contact node with custom field static value |
Logged in as Agent, flow builder open with create_contact node, org has custom contact field "company" |
1. Click create_contact node to open config panel 2. Click "Add Custom Field" 3. Select "company" field from dropdown 4. Select "Static Value" as source 5. Enter "TechCorp Inc" 6. Click Save |
Node stores custom_fields array with entry: {field_id: "...", value_source: "static", static_value: "TechCorp Inc"}. Custom field configuration persists |
High |
| AUTO-159 |
Configure create_contact node with custom field session variable |
Logged in as Agent, flow builder open with create_contact node, org has custom field "designation" |
1. Click create_contact node 2. Click "Add Custom Field" 3. Select "designation" field 4. Select "Session Variable" as source 5. Enter "user_job_title" in "Session Key" field 6. Click Save |
Node stores custom_fields: {field_id: "...", value_source: "session", session_key: "user_job_title"}. Session variable mapping persists |
High |
| AUTO-160 |
Configure multiple custom fields on create_contact node |
Logged in as Agent, create_contact node in builder, org has custom fields "company", "designation", "industry" |
1. Click node 2. Click "Add Custom Field" 3. Add "company" with static value "TechCorp" 4. Click "Add Custom Field" again 5. Add "designation" with session variable "user_job" 6. Click "Add Custom Field" again 7. Add "industry" with static "Technology" 8. Click Save |
Node stores three custom field entries. All configurations persisted in custom_fields array |
High |
| AUTO-161 |
Create contact applies custom field static value |
Logged in as Agent, flow running with create_contact node with custom field "company" = "TechCorp Inc" (static) |
1. Flow receives message with valid phone 2. Create contact node executes 3. Node applies custom field mapping |
Contact created. Custom field "company" set to "TechCorp Inc" on new contact. Log entry "flow_create_contact_custom_fields_applied" with field_count=1 |
High |