Install
$ agentstack add skill-voicenterteam-claude-marketplace-crm-onboarding ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
> Language. Reply in the user's language: detect what they write — Hebrew→Hebrew, English→English — and mirror it, switching if they switch mid-conversation. This shapes your prose, your questions, and your AskUserQuestion option labels only. It does not change the artifacts you produce — identifiers, JSON keys, BCP-47 language codes, API field names, and other data stay exactly as specified.
Guide the team through scoping and specifying a new CRM integration — the full discovery/feasibility process, implementation decisions, and responsibility boundaries for all three core services: Click2Call, Screen Pop, and Call History.
When to use this skill
Use this skill when the team needs to:
- Scope a new CRM integration from scratch
- Run a discovery or feasibility meeting with a customer
- Choose the right implementation path (API / Chrome extension / BAT file)
- Decide who owns the screen pop (CRM vs Voicenter)
- Decide Push vs Pull for call history
- Create a spec or integration requirements document
STEP 0 — CRM type: the first question ⭐
Always ask this first. Is the CRM:
- On-premise — installed software on the customer's machines or server
- Web-based — users work through a browser
Why it matters: this single answer determines which components are available:
| Component | On-Premise | Web-Based | |-----------|-----------|-----------| | Chrome extension (Click2Call button, screen pop) | ❌ | ✅ | | Local BAT file component | ✅ | ❌ | | API-based integration | ✅ | ✅ |
Everything else branches from this answer.
STEP 1 — Entity & field mapping
Before any API decisions, map the CRM's data structure. Every later decision (who gets identified, where a call is logged, where the dial button lives) depends on this.
- Which entities hold phone numbers? Contact, Lead, Account, Opportunity, Ticket, custom?
- Phone format in the CRM: local
05XXXXXXXX, international+9725XXXXXXXX/9725XXXXXXXX, mixed? - Normalize early. Voicenter passes numbers in a specific format. If the CRM stores a different format, screen pop lookups will fail. Decide now: who normalizes — the CRM side or the integration layer?
- CRM API capabilities (verify before committing to any approach):
- Search a record by phone number → required for screen pop
- Create / update a record via API → required for auto-creation on answer
- Accept inbound webhook requests → required for CDR Notification / Real-Time triggers
- Build a direct deep-link URL to a record card
SERVICE 1 — Click2Call
How it works: the CRM fires an HTTP request to Voicenter with three required parameters:
phone— the agent's station code (SIP extension). Different per user. Must be set when the agent logs into the CRM.target— the customer's phone number. Changes per call.code— the account code. Same for all users. Provided by Voicenter during onboarding.
Station code is a prerequisite. The CRM user record must have a dedicated field for the station code. Confirm it exists — or that it can be added — before committing to this integration path.
Scope boundary ⚠️ — Voicenter provides the API and integration guidance. Placing the "Call" button inside the CRM UI is the CRM developers' responsibility, not Voicenter's.
Fallback — no API capability: if the CRM cannot fire an outbound HTTP request, use the Voicenter Chrome extension: users select any phone number in the browser and right-click to dial. This is a browser-only option and is not an API integration.
Discovery questions
- Does a station code field exist on the CRM user, or can one be added?
- How will the station code be populated automatically when the agent logs in?
- Can the CRM fire an outbound HTTP request on a button click?
- Has the CRM integrated with telephony systems before? If yes — how was the PBX user ↔ CRM user mapping handled?
SERVICE 2 — Screen Pop
KEY DECISION: who owns the pop? ⭐
Does the CRM open the customer card, or does Voicenter?
Option A — CRM owns the pop
The CRM receives a trigger from Voicenter and handles opening the card itself. Three delivery methods:
- CRM's own API — Voicenter calls the CRM's documented endpoint per event
- Real-Time webhook — Voicenter POSTs to a URL the CRM exposes on each event
- Socket.IO — the CRM connects to Voicenter's real-time event stream and listens
Requires a mapping field: the CRM user must have a field that holds their PBX extension/user ID, so incoming events can be routed to the right agent. Locate this field early.
Option B — Voicenter owns the pop
- B.1 Chrome extension (web CRM): each agent installs the extension. The CRM builds a URL endpoint that receives phone + call params and returns JSON with customer details + a URL to the card. The extension opens that URL.
- B.2 Local component (on-premise CRM): a locally installed component runs a BAT file to open the record in the local system when the CRM cannot accept an inbound trigger.
Trigger stage rules ⭐
There are three stages where Voicenter can send a trigger: ringing, answer, hangup.
| Stage | What fires | Rule | |-------|------------|------| | Ringing | Fires per ringing station (multiple in parallel) | Notification only — never create entities (duplicates risk) | | Answer | Fires once for the answering station only | Screen pop + entity creation + call association | | Hangup | Fires per station | Use CDR instead — single, comprehensive post-call record |
Key rules:
- Create records on answer, not ring — ring fires per parallel station and causes duplicates
- At hangup, prefer the CDR Notification (arrives once, comprehensive) over a real-time hangup event
No-match behavior (unidentified caller)
Decide what happens when the phone number isn't found:
- Show "unknown caller" bubble — agent handles manually
- Auto-create a record on answer (recommended if auto-create): define entity, name format (
"Unknown customer"), phone field, owner, source, initial status, and de-duplication logic (check by phone before re-creating) - Show a "Create record" button pre-filled with the number
Multiple-match resolution
If a phone number appears on more than one record, decide: first created / last updated / all results (list view) / priority by entity type (e.g., Account before Lead).
Discovery questions
- Who owns the pop — CRM or Voicenter?
- Trigger delivery method (CRM API / webhook / Socket.IO / extension / BAT)?
- Which stages should trigger (ring = notify only / answer = create+pop / hangup = CDR)?
- PBX-user ↔ CRM-user mapping field?
- Which entities and fields to search on incoming call?
- What to display in the pop (entity name, status, owner, last interaction)?
- Multiple-match resolution?
- No-match behavior — and auto-create fields if applicable?
SERVICE 3 — Call History logging
| | CDR Notification (Push) | Call Log API (Pull) | |-|-------------------------|---------------------| | Full Transcription | ✅ (only here) | ❌ | | AI Analysis | ✅ automatic per call | Via GetCallHistory (extra step per CallID; no transcription) | | Storage | Stored in the CRM | Not stored in the CRM | | Best for | Reports, internal triggers, transcription | Display-only, no storage needed | | Disadvantage | Consumes CRM storage | No transcription; AI requires an extra fetch |
Decision rule: if the customer needs transcription, or wants to run reports / fire internal triggers from call data → CDR Notification (Push). Display-only without storage needs → Call Log (Pull) may suffice.
Discovery questions
- CDR Notification (Push) or Call Log API (Pull)?
- Is transcription needed?
- Is AI analysis needed (summary, emotions, insights)?
- Which entity logs the call (Activity / Task / Call Log / Ticket / custom)?
- Which fields to save (recording link, summary, duration, status, agent, queue, DID, custom vars)?
- Who is the call associated to — in what order? (Recommend same entity priority as screen pop search.)
- Should Voicenter update any status or field on the record after logging?
Decision Checklist
- CRM type: on-premise / web
- Entities + phone format + normalization owner
- CRM API capabilities: search / create / update / webhook endpoint / deep-link
- Click2Call: API vs Chrome extension
- Click2Call: station code field exists + auto-populate at login
- Screen Pop: who owns it (CRM / Voicenter)
- Trigger delivery method (CRM API / webhook / Socket.IO / extension / BAT)
- Trigger stages: ring = notify only / answer = create+pop / hangup = CDR
- PBX ↔ CRM user mapping field
- Multiple-match resolution
- No-match behavior + auto-create fields if applicable
- Call history: CDR Push vs Call Log Pull
- Transcription / AI analysis needed?
- Logging entity + association order + fields to save + status updates
Tips
- Start with CRM type (Step 0) — local vs web decides which components are possible before any other discussion.
- Station code is a prerequisite for Click2Call — if the CRM user has no station code field and can't add one, the API path is blocked.
- "Who owns the pop" is the architectural fork in screen pop — answer it before designing anything else.
- Create on answer, not ring — ring is multiplied across parallel stations; answer is a single event.
- CDR over real-time hangup — CDR is a single, complete post-call record; real-time hangup has the same multiplicity problem as ring.
- Ask for the customer's existing telephony docs if they've integrated before — saves significant scoping time.
- Never include credentials or passwords in spec documents — use a separate secure channel.
- Voicenter supplies the extension list and account code during onboarding — they are not the integration team's responsibility to generate.
Related Skills
- Click2Call — full API reference for outbound call initiation
- Screen Pop — Chrome extension screen pop endpoint reference (Option B.1)
- CDR Notification — push webhook with call data + AI + transcription after each call ends
- Call Log — pull API for historical call records (no AI)
- GetCallHistory — pull AI analysis per CallID (no transcription)
- Real-Time Events — Socket.IO / webhook triggers for ring, answer, hangup events
- Extension List — retrieve valid SIP codes / station codes for Click2Call setup
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: VoicenterTeam
- Source: VoicenterTeam/claude-marketplace
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.