- Add email-read-pixel config parameter to enable/disable tracking
- Implement tracking pixel injection in HTML emails
- Add sent_email_tracking table with migration
- Create 4 new API endpoints:
- GET /api/email/tracking/pixel/{id} - serve pixel & record read
- GET /api/email/tracking/status/{id} - get email read status
- GET /api/email/tracking/list - list all tracked emails
- GET /api/email/tracking/stats - get aggregate statistics
- Store tracking data: read_at, read_count, IP, user_agent
- Integrate with send_email() to auto-inject pixel when enabled
|
||
|---|---|---|
| .. | ||
| contacts.gbdialog | ||
| contacts.gbot | ||
| README.md | ||
CRM Contacts Template (contacts.gbai)
A General Bots template for managing contact directories with search, add, update, and company management capabilities.
Overview
The Contacts template provides a complete contact management system with natural language interaction. Users can add new contacts, search the directory, manage company records, and track contact history through conversational AI.
Features
- Contact Management - Add, update, search, and delete contacts
- Company Records - Automatic company creation and association
- Flexible Search - Search by name, email, company, or phone
- Activity Tracking - Log all contact interactions
- Tag System - Organize contacts with custom tags
- Export Capabilities - Export contact lists in various formats
Package Structure
contacts.gbai/
├── README.md
├── contacts.gbdialog/
│ ├── start.bas # Main entry point and tool registration
│ ├── add-contact.bas # Add new contacts
│ └── search-contact.bas # Search contact directory
├── contacts.gbkb/ # Knowledge base for contact help
└── contacts.gbot/
└── config.csv # Bot configuration
Scripts
| File | Description |
|---|---|
start.bas |
Initializes tools, sets context, and displays welcome menu |
add-contact.bas |
Creates new contact records with validation |
search-contact.bas |
Searches directory by multiple fields |
Available Tools
The template registers these tools for LLM access:
| Tool | Description |
|---|---|
add-contact |
Add a new contact to the directory |
search-contact |
Search contacts by any field |
update-contact |
Modify existing contact information |
list-contacts |
List all contacts with optional filters |
add-company |
Create a new company record |
contact-history |
View interaction history for a contact |
Data Schema
Contacts Table
| Field | Type | Description |
|---|---|---|
contactid |
String | Unique identifier (CON-YYYYMMDD-XXXX) |
firstname |
String | Contact's first name |
lastname |
String | Contact's last name |
fullname |
String | Combined full name |
email |
Email address | |
phone |
Phone | Phone number |
companyname |
String | Associated company |
jobtitle |
String | Job title or role |
tags |
String | Comma-separated tags |
notes |
String | Additional notes |
createdby |
String | User who created the record |
createdat |
DateTime | Creation timestamp |
Companies Table
| Field | Type | Description |
|---|---|---|
companyid |
String | Unique identifier |
name |
String | Company name |
createdat |
DateTime | Creation timestamp |
Activities Table
| Field | Type | Description |
|---|---|---|
contactid |
String | Related contact ID |
action |
String | Action description |
createdby |
String | User who performed action |
createdat |
DateTime | Activity timestamp |
Usage
Adding a Contact
Users can add contacts naturally:
- "Add John Smith from Acme Corp"
- "Create a new contact for jane@company.com"
- "Add contact: Mike Johnson, Sales Manager at TechCo"
Or provide structured input:
First Name: John
Last Name: Smith
Email: john.smith@acme.com
Phone: +1-555-123-4567
Company: Acme Corporation
Job Title: VP of Sales
Tags: customer, vip
Notes: Met at trade show
Searching Contacts
Search using natural language:
- "Find contacts at Acme"
- "Search for John"
- "Look up john.smith@acme.com"
- "Find all VIP contacts"
Search filters:
| Filter | Example |
|---|---|
| By name | "search John Smith" |
| By email | "search john@company.com" |
| By company | "find contacts at Microsoft" |
| By phone | "lookup +1-555-1234" |
| By tag | "show all VIP contacts" |
Managing Companies
Companies are auto-created when adding contacts:
' When adding a contact with a new company
IF companyname THEN
existingcompany = FIND "companies.csv", "name=" + companyname
IF COUNT(existingcompany) = 0 THEN
' Auto-create company record
SAVE "companies.csv", companyid, companyname, createdat
END IF
END IF
Configuration
Configure in contacts.gbot/config.csv:
| Parameter | Description | Example |
|---|---|---|
Theme Color |
UI accent color | blue |
Default Tags |
Auto-applied tags | new,prospect |
Require Email |
Email required? | true |
Duplicate Check |
Check for duplicates | true |
Customization
Adding Custom Fields
Extend the contact schema in add-contact.bas:
PARAM department AS STRING LIKE "Engineering" DESCRIPTION "Department name" OPTIONAL
PARAM linkedin AS STRING LIKE "linkedin.com/in/john" DESCRIPTION "LinkedIn profile" OPTIONAL
' Include in save
SAVE "contacts.csv", contactid, firstname, lastname, fullname, email, phone,
companyname, jobtitle, department, linkedin, tags, notes, createdby, createdat
Custom Search Filters
Add specialized search in search-contact.bas:
IF searchby = "department" THEN
results = FIND "contacts.csv", "department LIKE " + searchterm
END IF
IF searchby = "recent" THEN
cutoff = DATEADD(NOW(), -7, "day")
results = FIND "contacts.csv", "createdat >= " + cutoff
END IF
Integration with Email
Send welcome emails to new contacts:
' In add-contact.bas after SAVE
IF email THEN
subject = "Thank you for connecting!"
body = "Hi " + firstname + ", we look forward to working with you."
SEND EMAIL email, subject, body
END IF
Integration with CRM Pipeline
Connect contacts to leads:
' Convert contact to lead
PARAM convert_to_lead AS BOOLEAN DESCRIPTION "Create lead from contact" OPTIONAL
IF convert_to_lead THEN
WITH new_lead
id = FORMAT(GUID())
name = fullname
email = email
phone = phone
company = companyname
source = "contact_conversion"
status = "new"
created_at = NOW()
END WITH
SAVE "leads.csv", new_lead
TALK "Lead created from contact: " + fullname
END IF
Example Conversations
Adding a Contact
User: Add a new contact
Bot: I'll help you add a new contact. What is their first name?
User: Sarah
Bot: And their last name?
User: Johnson
Bot: What is Sarah's email address?
User: sarah.johnson@techstartup.io
Bot: Phone number? (optional)
User: 555-987-6543
Bot: What company does Sarah work for?
User: TechStartup Inc
Bot: What is her job title?
User: CTO
Bot: ✅ Contact added: Sarah Johnson
ID: CON-20240115-4821
Email: sarah.johnson@techstartup.io
Phone: 555-987-6543
Company: TechStartup Inc
Title: CTO
Searching Contacts
User: Find contacts at TechStartup
Bot: Found 2 contact(s):
---
**Sarah Johnson**
sarah.johnson@techstartup.io
555-987-6543
TechStartup Inc
CTO
ID: CON-20240115-4821
---
**Mike Chen**
mike.chen@techstartup.io
TechStartup Inc
Developer
ID: CON-20240110-3392
Best Practices
- Validate input - Use
PARAMtype validation for email and phone - Check duplicates - Search before creating to avoid duplicates
- Log activities - Track all changes for audit trail
- Use tags - Organize contacts with meaningful tags
- Keep notes - Add context about how/where you met contacts
- Regular cleanup - Archive inactive contacts periodically
Troubleshooting
| Issue | Solution |
|---|---|
| Duplicate contacts | Enable duplicate checking in config |
| Search returns nothing | Try broader search terms |
| Company not linked | Ensure company name matches exactly |
| Missing activities | Check activity logging is enabled |
Related Templates
crm.gbai- Full CRM with leads, opportunities, and pipelinemarketing.gbai- Marketing automation with contact segmentationoffice.gbai- Office productivity with contact directory
Use Cases
- Sales Teams - Manage prospect and customer contacts
- HR Departments - Employee and candidate directories
- Event Management - Attendee and speaker contacts
- Networking - Professional contact management
- Customer Support - Customer contact lookup
License
AGPL-3.0 - Part of General Bots Open Source Platform.
Pragmatismo - General Bots