A complete automation template for keeping your CRM updated automatically and triggering personalised follow-up sequences based on lead behaviour.
| Event | Data Written to CRM | Trigger |
|---|---|---|
| Form submission | Contact created/updated, source, form data | Webhook from form provider |
| Email open | Email activity log, last_opened date | Email platform webhook |
| Email link click | Click activity, which link, interest score +5 | Email platform webhook |
| Pricing page visit | Page visit logged, score +20, sales alert | Segment / GA4 event |
| Call completed (voice AI) | Call transcript, duration, outcome, intent | Vapi call_ended webhook |
| WhatsApp reply | Message logged, sentiment, reply intent | WhatsApp webhook |
| Calendly booking | Meeting created, notes, stage updated | Calendly webhook |
Automated scoring triggers the right sequence without manual review. Adjust thresholds to match your average deal cycle:
| Action | Score Change | Running Total → Action |
|---|---|---|
| Form submitted | +20 | — |
| Business email domain | +10 | — |
| All form fields completed | +5 | — |
| Opens email within 1h | +10 | — |
| Clicks pricing page link | +20 | >60 → Hot lead alert |
| Visits pricing page (tracked) | +25 | >60 → Hot lead alert |
| Replies to email | +15 | — |
| Books Calendly call | +40 | >80 → Priority sales queue |
| Free email (gmail/yahoo) | −10 | — |
| No email open in 7 days | −15 | <20 → Move to cold nurture |
Each CRM stage change or score threshold triggers the right automation:
Create these custom fields in your CRM (HubSpot, Salesforce, or Pipedrive):
| Field Name | Type | Populated By |
|---|---|---|
| lead_source | Dropdown | Automation — form/ad/referral/call |
| lead_score | Number | Automation — recalculated on each event |
| sequence_status | Dropdown | Automation — Active/Paused/Completed |
| last_touchpoint | Date | Automation — updated on every event |
| call_transcript_url | URL | Vapi webhook |
| sentiment_last_call | Dropdown | AI classification — Positive/Neutral/Negative |
| intent_signals | Multi-select | Automation — Pricing interest/Demo request/etc. |
Universal Lead Event Handler
Webhook trigger (any lead event source)
→ Parse event type + lead identifier (email)
→ Lookup lead in CRM by email
→ If exists: PATCH contact, log activity, recalculate score
→ If new: POST create contact with full context
→ Score threshold check:
→ >60: Slack alert + create sales task
→ >80: Priority queue + manager notification
→ Sequence check:
→ Not in sequence: enroll based on score tier
→ In sequence: log event, adjust next send timing
| CRM | API Auth | Contact Upsert Endpoint | Notes |
|---|---|---|---|
| HubSpot | Private app token | POST /crm/v3/objects/contacts/upsert | Use email as idProperty for deduplication |
| Salesforce | OAuth 2.0 (connected app) | POST /sobjects/Contact/ | Use External ID field for upsert via PATCH |
| Pipedrive | API key or OAuth | POST /persons — find_duplicates first | Persons API, no native upsert — check first |