Resources
LLM Prompt
A single-file reference of all Converc documentation. Paste it into any LLM to give it full context about the product.
Plain text · 472 lines
# Getting Started
## Create your site
Start in the Converc dashboard and add your website domain. This creates the public key used by the widget and ensures calls are linked to the right organization.
## Install the widget
Paste the widget script on every page where you want the badge to appear.
```html
<script
src="https://api.converc.com/widget.js"
data-ic-public-key="<your-key-here>"
defer>
</script>
```
If you use a tag manager, add it as a custom HTML tag and publish.
## Configure the badge
Open **Widget Settings** and set the placement, theme, and welcome copy. Save changes and refresh your site to see the badge update. Use **Widget Theme** to customize colors and fonts, and **Qualification Questions** to collect visitor details before the call.
## Take a test call
Set yourself to **Available** in the dashboard, open your site in a second browser or private window, and click the badge to start a call. You should see the incoming call immediately.
## Next steps
Add teammates, connect calendar or Slack notifications, and wire up Zapier to automate follow-ups after calls end.
Having issues? Email hello@converc.com.
---
# Installing the Widget
## Add the widget script
Place this script on every page where you want the badge to appear.
```html
<script
src="https://api.converc.com/widget.js"
data-ic-public-key="<your-key-here>"
defer>
</script>
```
## Verify it loads
Open your site and confirm the badge appears. If it doesn't:
- Make sure the **public key** matches the site in Converc.
- Ensure the script is not blocked by a CSP or ad blocker.
## Inline embed
Want the widget inline (instead of the floating badge)? Add the embed container where you want it to appear and include the embed script.
```html
<div id="ic-embed"></div>
<script
src="https://api.converc.com/embed.js"
data-ic-public-key="<your-key-here>"
data-ic-container="ic-embed"
data-ic-embed-style="0"
async>
</script>
```
You can change the container id — just keep the data-ic-container attribute in sync.
## Add with a tag manager
If you use Google Tag Manager or another tag manager, add it as a **Custom HTML** tag and publish.
Having issues? Email hello@converc.com.
---
# Widget Settings
## Where to find it
Open **Widget → Widget Settings** in the sidebar.
## What you can change
- Badge label and welcome copy.
- Collect contact details (email, phone, or both).
- Countries to show the badge in.
- Open the widget on page load.
- Hide when no one is available.
- Pause incoming calls.
- Add a calendar link fallback.
## Save and verify
Save changes and refresh your site to see the badge update.
Having issues? Email hello@converc.com.
---
# Widget Theme
## Where to find it
Open **Widget → Theme** in the sidebar.
## What you can change
- Colors for the widget and buttons.
- Font and border radius.
- Copy on every step of the widget flow.
## Save and verify
Save changes and refresh your site to see the theme update.
Having issues? Email hello@converc.com.
---
# Qualification Questions
## Where to find it
Open **Widget → Qualifications** in the sidebar.
## What you can change
- Add or remove questions.
- Control the answer type (text, number, select, multi-select).
- Choose what happens when a visitor qualifies or not.
## Save and verify
Save changes and refresh your site to see the flow update.
Having issues? Email hello@converc.com.
---
# Availability
## How availability works
Converc only shows the badge when at least one rep is available. A rep is available when:
- Their **manual schedule** says they are available right now.
- If Google Calendar is connected, they are **not busy** in the selected calendar.
## Configure hours
Go to **Settings → Availability** and set your weekly schedule and timezone.
## Common gotchas
- A calendar event marked **Busy** will block availability, even if it's a meeting you plan to take.
- If no reps are available and **Hide when unavailable** is enabled, the widget stays hidden.
Having issues? Email hello@converc.com.
---
# Common Issues
## Widget not showing
- Confirm the domain matches exactly (for example `www.example.com` vs `example.com`).
- Check that the public key is correct.
- Verify your reps are available.
## Widget loads but badge is hidden
- **Hide when unavailable** is enabled and there are no available reps.
- A connected calendar has a **Busy** event at the current time.
## Calls not connecting
- Ensure camera and microphone permissions are allowed.
- Check that the browser isn't blocking third-party iframes.
## Still stuck?
Open DevTools → Network and verify:
- `https://api.converc.com/widget.js` returns 200.
- `https://api.converc.com/widget/config?public_key=...&domain=...` returns 200.
Having issues? Email hello@converc.com.
---
# Zapier
## Connect Converc to Zapier
In Zapier, add a new **Converc** account and paste your API key from **Settings → Integrations → API Keys**. Zapier uses this key to subscribe to live call events on your behalf.
## Available triggers
- **Call Ended** — fired when the call finishes.
- **Call Recording Ready** — fired after the recording is processed.
- **Call Transcript Ready** — fired once the transcript is ready.
## Tips for testing
Recordings and transcripts can take a few minutes after a call ends. If a sample does not appear immediately, wait a moment and click **Find new records** in Zapier.
## Suggested automations
- Create a CRM contact after a call ends.
- Post a Slack summary when a transcript arrives.
- Save recordings to Drive or Notion for review.
Having issues? Email hello@converc.com.
---
# Google Calendar
## Connect Google Calendar
Sync your rep calendar so Converc knows when someone is available to take calls.
## How to connect
1. Open **Settings → Integrations → Google Calendar**.
2. Click **Connect Google Calendar** and choose the account you use for availability.
3. Select the calendar to sync and save.
## Tips
- Use a single shared calendar for the team if availability is pooled.
- If events don't show up right away, refresh the dashboard after a minute.
Having issues? Email hello@converc.com.
---
# Slack
## Connect Slack
Send call notifications to your team's Slack channel so you never miss an incoming request.
## How to connect
1. Open **Settings → Integrations → Slack**.
2. Choose your workspace and approve the Slack permissions.
3. Pick the channel for alerts and save.
## Tips
- Use a dedicated channel so alerts stay visible.
- You can change the channel anytime in Integrations.
Having issues? Email hello@converc.com.
---
# Discord
## Connect Discord
Route call notifications to a Discord channel for quick visibility.
## How to connect
1. Open **Settings → Integrations → Discord**.
2. Select the server and channel where you want updates.
3. Save to enable notifications.
## Tips
- Use a private channel for internal call routing.
- If a message fails to post, recheck channel permissions.
Having issues? Email hello@converc.com.
---
# Managing Webhooks
## Quickstart
1. Create an API key in Settings → Integrations → API Keys.
2. Create a webhook endpoint with the events you want.
3. Verify signatures using your webhook secret.
## Create a webhook endpoint
Use the API to register an endpoint that receives call events. If you omit `events`, the webhook receives every event type.
```bash
curl -X POST "https://api.converc.com/integrations/webhooks" \
-H "Authorization: Bearer <your-key-here>" \
-H "Content-Type: application/json" \
-d '{
"url": "https://yourapp.com/webhooks",
"events": ["call.ended", "call.recording_ready", "call.transcript_ready"]
}'
```
Response:
```json
{
"webhook": {
"id": "11111111-1111-1111-1111-111111111111",
"url": "https://yourapp.com/webhooks",
"events": ["call.ended", "call.recording_ready", "call.transcript_ready"],
"isActive": true,
"createdAt": "2024-01-01T00:00:00.000Z",
"updatedAt": "2024-01-01T00:00:00.000Z"
},
"secret": "your-signing-secret"
}
```
Store the `secret` securely. It is used to verify webhook signatures and is only returned when the endpoint is created.
## List webhook endpoints
```bash
curl -H "Authorization: Bearer <your-key-here>" \
"https://api.converc.com/integrations/webhooks"
```
## Disable a webhook
```bash
curl -X DELETE \
-H "Authorization: Bearer <your-key-here>" \
"https://api.converc.com/integrations/webhooks/11111111-1111-1111-1111-111111111111"
```
## Test a webhook
```bash
curl -X POST "https://api.converc.com/integrations/webhooks/test" \
-H "Authorization: Bearer <your-key-here>" \
-H "Content-Type: application/json" \
-d '{ "webhookId": "11111111-1111-1111-1111-111111111111" }'
```
The test payload uses the `webhook.test` event type.
Having issues? Email hello@converc.com.
---
# Authentication
## API key authentication
Create an API key in Settings → Integrations → API Keys. Send it as a Bearer token in the `Authorization` header.
```bash
curl -H "Authorization: Bearer <your-key-here>" \
https://api.converc.com/integrations/webhooks
```
Keep API keys private and rotate them if you suspect exposure.
Having issues? Email hello@converc.com.
---
# Events & Payload
## Event types
- `call.requested` — visitor starts a call and enters the queue.
- `call.accepted` — a rep accepts the call.
- `call.canceled` — visitor leaves before a rep accepts.
- `call.missed` — no rep accepts before the ring timeout.
- `call.ended` — a call ends.
- `call.transcript_ready` — call transcript is ready.
- `call.recording_ready` — recording has finished uploading.
- `webhook.test` — fired when you use the test endpoint.
## Event payload
Every event uses the same envelope:
```json
{
"id": "event-uuid",
"type": "call.ended",
"createdAt": "2024-01-02T00:00:00.000Z",
"organizationId": "org-uuid",
"data": {
"call": {
"id": "call-uuid",
"status": "ended",
"mediaType": "video",
"requestedAt": "2024-01-02T00:00:00.000Z",
"acceptedAt": "2024-01-02T00:00:10.000Z",
"endedAt": "2024-01-02T00:00:35.000Z",
"acceptedBy": "user-uuid",
"sessionId": "session-uuid",
"siteId": "site-uuid",
"visitorFingerprint": "fp",
"qualificationFlowId": null
},
"contact": {
"identityId": "identity-uuid",
"fingerprint": "fp",
"email": "visitor@example.com",
"phone": "+1 512 555 0100",
"name": "Visitor Name",
"lastSeenAt": "2024-01-02T00:00:00.000Z",
"location": {
"city": "Austin",
"region": "TX",
"country": "United States",
"countryCode": "US",
"timezone": "America/Chicago",
"latitude": 30.2672,
"longitude": -97.7431
}
},
"qualificationAnswers": [],
"transcript": null,
"recording": {
"available": false,
"videoUrl": null,
"audioUrl": null,
"expiresInSeconds": null
}
}
}
```
## Notes
- All timestamps are ISO-8601.
- `contact.location` can be `null` if no geo data is available.
- `contact.phone` is `null` unless the visitor shared a phone number.
- `transcript` is `null` until a transcript is available.
- `recording.available` is `false` until a recording has been saved.
- `call.ended` fires for any call end; use `call.canceled` or `call.missed` to distinguish queue exits.
- `recording.videoUrl` and `recording.audioUrl` are only populated on `call.recording_ready`, and they are signed URLs.
- `recording.expiresInSeconds` is the URL expiry in seconds.
- `events` on a webhook endpoint acts as a filter. If empty, all event types are delivered.
## Delivery behavior
- Webhooks are delivered with a POST request.
- Requests time out after 8 seconds.
- Any 2xx response counts as success.
- No automatic retries are sent today.
- Use the `id` field (or `X-IC-Id`) to dedupe events.
Having issues? Email hello@converc.com.
---
# Signature Verification
## Signature header
Each webhook includes an `X-IC-Signature` header:
```
t=timestamp,v1=signature
```
Compute an HMAC SHA-256 of:
```
timestamp + "." + raw_body
```
Then compare the result to `v1`. Use the raw request body (not JSON-parsed) to avoid signature mismatch.
We also send:
- `X-IC-Event` (event type)
- `X-IC-Id` (event id)
## Example verification (Node)
```ts
import crypto from 'node:crypto'
const signature = req.headers['x-ic-signature']
const timestamp = signature?.match(/t=(\d+)/)?.[1]
const provided = signature?.match(/v1=([a-f0-9]+)/)?.[1]
const payload = \`\${timestamp}.\${rawBody}\`
const expected = crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex')
const valid =
provided &&
crypto.timingSafeEqual(
Buffer.from(provided),
Buffer.from(expected)
)
```
Optionally reject signatures older than a few minutes to reduce replay risk.
Having issues? Email hello@converc.com.
---
# Error Codes
## Common errors
- `400` — Invalid input. This covers malformed payloads, invalid query params, or invalid webhook URLs.
- `401` — Unauthorized. The API key is missing or invalid.
- `403` — Webhooks are not enabled for the org or plan.
- `404` — Webhook or call not found.
- `500` — Server error while creating or delivering a webhook.
If you continue to see errors after correcting the request, contact support with the request id from the response headers.
Having issues? Email hello@converc.com.