Crm integration agent
Production-grade AI agent skills & MCP servers for the Israeli market — סקילים
npx -y skills add skillim-hub/skills --skill crm-integration-agentAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Syncs WhatsApp, email, and SMS conversations with Monday, HubSpot, and Salesforce for Israeli businesses using live-validated API paths, normalized contacts, consent checks, redaction, and audit logs.
SKILL.md
9.6 KB, ~2.3k tokens by cl100k_base, as published. Nobody here has run it
CRM Integration Agent
Use this skill to sync WhatsApp, email, and SMS conversations into Monday, HubSpot, or Salesforce for Israeli small businesses, freelancers, and consumer-support teams. Treat the CRM as a customer-service record, not as an unrestricted message archive.
Outcomes
- Create or update a CRM contact or lead from a conversation thread.
- Normalize Israeli phone numbers to E.164 format.
- Preserve service context such as quote requests, invoices, appointments, warranties, complaints, and follow-up tasks.
- Record marketing consent only when explicit evidence exists.
- Redact unnecessary sensitive data before sending notes into CRM.
- Produce an audit trail for retries, troubleshooting, and privacy review.
Source channels
| Channel | Common source | Stable identifier | Notes |
|---|---|---|---|
| WhatsApp Business export, gateway webhook, shared inbox | source_thread_id and source_message_id | Store attachment metadata. Avoid storing private images unless required for the service case. | |
| Gmail, Microsoft 365, helpdesk inbox | message id or thread id | Keep subject, sender, sent time, and summarized body. | |
| SMS | Provider webhook or CSV export | provider message id | Treat opt-out words such as הסר and STOP as immediate suppression signals. |
Destination systems
| CRM | Best fit | Default object |
|---|---|---|
| Monday | Small teams managing boards and service queues | item |
| HubSpot | Sales and service pipeline with email/marketing separation | contact |
| Salesforce | Formal lead management and custom compliance fields | lead |
Data model
Minimum thread input:
{
"source_channel": "whatsapp",
"source_thread_id": "wa-1001",
"subject": "בקשה להצעת מחיר",
"contact": {
"full_name": "דנה כהן",
"phone": "050-123-4567",
"company": "כהן עיצוב"
},
"messages": [
{
"id": "wa-1001-1",
"sent_at": "18/02/2026 09:44:00",
"direction": "inbound",
"body": "אפשר לקבל הצעת מחיר עד ₪2,500?"
}
],
"consent": {
"marketing_opt_in": false,
"evidence": "פנייה יזומה של לקוחה"
},
"business_purpose": "sales"
}
Use DD/MM/YYYY timestamps for localized manual files. Use ISO 8601 when receiving webhook timestamps.
Decision tree: choose write action
graph TD
A[Receive conversation] --> B{Has phone, email, or external id?}
B -- No --> C[Reject and request identifier]
B -- Yes --> D[Normalize identifier]
D --> E{Existing CRM match?}
E -- Exact phone or external id --> F[Update existing record]
E -- Exact email only --> G[Update if business context matches]
E -- Multiple partial matches --> H[Send to manual review]
E -- No match --> I[Create record]
F --> J[Append redacted note]
G --> J
I --> J
J --> K[Write audit event]
Decision tree: service or marketing
graph TD
A[Message content] --> B{Customer requested service?}
B -- Yes --> C[Service context]
B -- No --> D{Explicit marketing opt-in evidence?}
D -- Yes --> E[Marketing allowed]
D -- No --> F[Do not send marketing]
C --> G{Contains opt-out phrase?}
G -- Yes --> H[Suppress marketing and keep service handling]
G -- No --> I[Continue service follow-up]
Field mapping
Common normalized fields
| Field | Rule |
|---|---|
full_name | Trim whitespace. Keep Hebrew spelling as written. |
phone | Convert 050-123-4567 to +972501234567. |
email | Lowercase and trim. |
business_purpose | Classify as sales, support, appointment, admin, or service. |
consent.marketing_opt_in | Set to true only with explicit evidence. |
message.body | Redact ID numbers, payment-card numbers, and verification codes. |
Monday
- Use
create_itemfor new board items. - Store contact details in phone and email columns.
- Store the last redacted message in a text column.
- Store
source_thread_idfor idempotency.
HubSpot
- Use contacts for consumer and small-business contacts.
- Store custom properties such as
crm_source_channel,crm_source_thread_id, andcrm_marketing_opt_in. - Keep marketing subscription status separate from service notes.
Salesforce
- Use Lead for new prospects and Contact for known customers when the org model supports it.
- Store custom fields such as
Source_Channel__c,Source_Thread_ID__c, andMarketing_Opt_In__c. - Require a production
base_urlsuch ashttps://example.my.salesforce.com.
Concrete examples
Freelancer receiving a WhatsApp quote request
Input phrase: אפשר לקבל הצעת מחיר עד ₪2,500?
Action:
- Classify as
sales. - Normalize phone.
- Create or update CRM record.
- Add a note with the redacted conversation summary.
- Add a task for follow-up within business hours.
Clinic receiving an SMS appointment request
Input phrase: אפשר לקבוע תור ל-21/02/2026?
Action:
- Classify as
appointment. - Avoid marketing status changes.
- Add appointment request note.
- Route to scheduling owner.
Retailer receiving an email complaint
Input phrase: המוצר תקול ולא הגיע בזמן
Action:
- Classify as
support. - Add warranty or delivery case note.
- Avoid sending promotional follow-up.
- Keep delivery documents only when required for the complaint.
Edge cases
| Case | Handling |
|---|---|
| Phone exists and email belongs to a different person | Do not merge automatically. Send to manual review. |
| Same phone used by family members | Keep one household record only when the business process supports it. Otherwise create separate records with external ids. |
Customer writes הסר during a service thread | Continue service handling. Suppress marketing. |
| Message contains Israeli ID number | Redact before CRM note. Store full value only in a controlled system when legally required. |
| Customer sends payment-card details | Redact immediately. Instruct staff to use a compliant payment page. |
| Attachment contains medical, legal, or financial data | Store metadata and link to approved storage. Avoid copying the file into CRM by default. |
| Duplicate webhook delivery | Use source_channel, source_thread_id, source_message_id, and provider as idempotency key. |
| Provider rate limit | Retry with exponential backoff and keep a pending audit event. |
Anti-patterns
- Do not sync entire inboxes without filtering by business purpose.
- Do not treat a service conversation as marketing consent.
- Do not store private images in CRM unless required for the case.
- Do not use name-only matching for automatic merges.
- Do not overwrite existing CRM fields with blank values from message exports.
- Do not keep verification codes, payment-card numbers, or Israeli ID numbers in CRM notes.
- VAT is not calculated by this skill. When showing service examples, use the 18% Israeli VAT rate from 01/01/2025 only as current context and verify accounting output in the accounting system.
- Do not run production sync before dry-run review.
Troubleshooting summary
| Symptom | Likely cause | Fix |
|---|---|---|
Contact requires phone, email, or external_id | Missing identifier | Add phone, email, or a source-system customer id. |
Marketing action requires explicit opt-in | Missing consent evidence | Add clear evidence or run as service context only. |
| Salesforce base URL error | Missing instance URL | Set SALESFORCE_BASE_URL or pass --base-url. |
| Duplicate CRM contacts | Weak matching rule | Prefer external id or normalized phone. Run migration dedupe. |
| Hebrew appears escaped | JSON output not using UTF-8 settings | Use json.dumps(..., ensure_ascii=False, indent=2). |
| Provider 429 | Rate limit | Retry later and batch smaller chunks. |
Production checklist
- Confirm the lawful purpose for storing each conversation category.
- Map source identifiers to CRM fields before the first live run.
- Create custom CRM fields for channel, source thread id, consent status, and consent evidence.
- Run sandbox dry-runs on at least 20 representative scenarios.
- Review duplicate contacts manually before enabling automatic merge.
- Verify opt-out handling for
הסר,בטל,STOP, andunsubscribe. - Configure token storage through environment variables or a secrets manager.
- Enable audit JSONL output for every production run.
- Define retention rules for attachments and sensitive notes.
- Test provider rate limits and retry behavior.
- Document owner handoff for unresolved conflicts.
CLI commands
crm-integration-agent normalize-phone "050-123-4567"
crm-integration-agent dry-run --provider hubspot --input thread.json --env sandbox
crm-integration-agent sync --provider hubspot --input thread.json --env production --live --audit-log audit.jsonl
crm-integration-agent classify "אפשר לקבל הצעת מחיר?"
Python usage
from crm_integration_agent import CRMIntegrationClient, load_thread_file, result_to_dict
thread = load_thread_file("thread.json")
client = CRMIntegrationClient.from_env("hubspot", environment="sandbox")
result = client.sync_thread(thread)
print(result_to_dict(result))
Acceptance criteria
A production-ready run must produce a CRM object, a redacted note, a deterministic contact key, and an audit event for each source message. Failed writes must keep enough context for retry without exposing unnecessary personal data.
What ships with it: 25 files
107.9 KB alongside SKILL.md, 11 of them executable
crm_integration_agent/
- client.pyruns30.6 KB
- cli.pyruns5.4 KB
- __init__.pyruns1.1 KB
references/
- api-reference.md8.4 KB
- hebrew-qa-log.md2.0 KB
- migration-checklist.md3.4 KB
- test-scenarios.md3.2 KB
- troubleshooting.md3.6 KB
- verification-log.md7.0 KB
- workflow-guide.md5.0 KB
scripts/
- crm_integration_agent_client.pyruns126 B
- crm_integration_agent_cli.pyruns129 B
- examples/01_sync_whatsapp_to_monday.pyruns1.3 KB
- examples/02_email_to_hubspot.pyruns1.2 KB
- examples/03_sms_to_salesforce.pyruns1.3 KB
- examples/04_dedupe_contact.pyruns767 B
- examples/05_export_audit_report.pyruns693 B
- test_crm_integration_agent_client.pyruns12.1 KB
- CHANGELOG.md2.2 KB
- LICENSE1.0 KB
- metadata.json1.3 KB
- pyproject.toml784 B
- README.md4.2 KB
- requirements-dev.txt65 B
- SKILL_HE.md11.2 KB
Gives 0 of the 12 instructions most context ai engineering skills give in ~2.3k tokens
Counted across 1,193 of the 1,976 authors here whose files we hold, read 2026-08-07
- Dispatch a fresh implementer subagent per taskin 48 of 1193, across 19 files
- Dispatch a final code reviewer after all tasksin 33 of 1193, across 8 files
- Provide full task text to the subagentin 30 of 1193, across 9 files
- Review spec compliance before code qualityin 27 of 1193, across 10 files
- Make the hook script executablein 26 of 1193, across 8 files
- Re-snapshot after navigation or DOM changesin 25 of 1193, across 19 files
- Read files before editing themin 22 of 1193, across 11 files
- Answer subagent questions before proceedingin 22 of 1193, across 7 files
- Mark task complete in TodoWrite after approvalin 22 of 1193, across 6 files
- Merge hook into existing settingsin 21 of 1193, across 3 files
- Ask if installation is global or projectin 20 of 1193, across 2 files
- Copy the hook script to target locationin 20 of 1193, across 2 files
Said here and by no other author read
- normalize Israeli phone numbers to E.164 format
- create or update CRM contacts from conversation threads
- record marketing consent only with explicit evidence
- redact sensitive data before sending CRM notes
- produce an audit event for each source message
- reject conversations missing phone, email, or external id
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.