theleadrouter-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/admin-guide/SKILL.md +351 -0
- package/.claude/skills/buyer-guide/SKILL.md +405 -0
- package/.claude/skills/partner-guide/SKILL.md +352 -0
- package/.claude/skills/welcome/SKILL.md +351 -0
- package/CLAUDE.md +238 -0
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/api-client.d.ts +10 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +64 -0
- package/dist/api-client.js.map +1 -0
- package/dist/auth-adapter.d.ts +33 -0
- package/dist/auth-adapter.d.ts.map +1 -0
- package/dist/auth-adapter.js +87 -0
- package/dist/auth-adapter.js.map +1 -0
- package/dist/bin/iscale-mcp.d.ts +3 -0
- package/dist/bin/iscale-mcp.d.ts.map +1 -0
- package/dist/bin/iscale-mcp.js +7 -0
- package/dist/bin/iscale-mcp.js.map +1 -0
- package/dist/build-registry.d.ts +3 -0
- package/dist/build-registry.d.ts.map +1 -0
- package/dist/build-registry.js +15 -0
- package/dist/build-registry.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/register.d.ts +4 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +23 -0
- package/dist/register.js.map +1 -0
- package/dist/registry.d.ts +50 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +78 -0
- package/dist/registry.js.map +1 -0
- package/dist/tools/buyers.d.ts +4 -0
- package/dist/tools/buyers.d.ts.map +1 -0
- package/dist/tools/buyers.js +61 -0
- package/dist/tools/buyers.js.map +1 -0
- package/dist/tools/campaigns.d.ts +4 -0
- package/dist/tools/campaigns.d.ts.map +1 -0
- package/dist/tools/campaigns.js +45 -0
- package/dist/tools/campaigns.js.map +1 -0
- package/dist/tools/compliance.d.ts +4 -0
- package/dist/tools/compliance.d.ts.map +1 -0
- package/dist/tools/compliance.js +28 -0
- package/dist/tools/compliance.js.map +1 -0
- package/dist/tools/composite.d.ts +3 -0
- package/dist/tools/composite.d.ts.map +1 -0
- package/dist/tools/composite.js +337 -0
- package/dist/tools/composite.js.map +1 -0
- package/dist/tools/contracts.d.ts +4 -0
- package/dist/tools/contracts.d.ts.map +1 -0
- package/dist/tools/contracts.js +48 -0
- package/dist/tools/contracts.js.map +1 -0
- package/dist/tools/generated/api-keys.gen.d.ts +3 -0
- package/dist/tools/generated/api-keys.gen.d.ts.map +1 -0
- package/dist/tools/generated/api-keys.gen.js +49 -0
- package/dist/tools/generated/api-keys.gen.js.map +1 -0
- package/dist/tools/generated/audit-logs.gen.d.ts +3 -0
- package/dist/tools/generated/audit-logs.gen.d.ts.map +1 -0
- package/dist/tools/generated/audit-logs.gen.js +59 -0
- package/dist/tools/generated/audit-logs.gen.js.map +1 -0
- package/dist/tools/generated/auth.gen.d.ts +3 -0
- package/dist/tools/generated/auth.gen.d.ts.map +1 -0
- package/dist/tools/generated/auth.gen.js +195 -0
- package/dist/tools/generated/auth.gen.js.map +1 -0
- package/dist/tools/generated/blocked-lists.gen.d.ts +3 -0
- package/dist/tools/generated/blocked-lists.gen.d.ts.map +1 -0
- package/dist/tools/generated/blocked-lists.gen.js +146 -0
- package/dist/tools/generated/blocked-lists.gen.js.map +1 -0
- package/dist/tools/generated/buyers.gen.d.ts +3 -0
- package/dist/tools/generated/buyers.gen.d.ts.map +1 -0
- package/dist/tools/generated/buyers.gen.js +153 -0
- package/dist/tools/generated/buyers.gen.js.map +1 -0
- package/dist/tools/generated/calls.gen.d.ts +3 -0
- package/dist/tools/generated/calls.gen.d.ts.map +1 -0
- package/dist/tools/generated/calls.gen.js +106 -0
- package/dist/tools/generated/calls.gen.js.map +1 -0
- package/dist/tools/generated/campaigns.gen.d.ts +3 -0
- package/dist/tools/generated/campaigns.gen.d.ts.map +1 -0
- package/dist/tools/generated/campaigns.gen.js +274 -0
- package/dist/tools/generated/campaigns.gen.js.map +1 -0
- package/dist/tools/generated/catalog.json +7096 -0
- package/dist/tools/generated/compliance.gen.d.ts +3 -0
- package/dist/tools/generated/compliance.gen.d.ts.map +1 -0
- package/dist/tools/generated/compliance.gen.js +119 -0
- package/dist/tools/generated/compliance.gen.js.map +1 -0
- package/dist/tools/generated/consent.gen.d.ts +3 -0
- package/dist/tools/generated/consent.gen.d.ts.map +1 -0
- package/dist/tools/generated/consent.gen.js +109 -0
- package/dist/tools/generated/consent.gen.js.map +1 -0
- package/dist/tools/generated/contacts.gen.d.ts +3 -0
- package/dist/tools/generated/contacts.gen.d.ts.map +1 -0
- package/dist/tools/generated/contacts.gen.js +88 -0
- package/dist/tools/generated/contacts.gen.js.map +1 -0
- package/dist/tools/generated/contracts.gen.d.ts +3 -0
- package/dist/tools/generated/contracts.gen.d.ts.map +1 -0
- package/dist/tools/generated/contracts.gen.js +306 -0
- package/dist/tools/generated/contracts.gen.js.map +1 -0
- package/dist/tools/generated/delivery-test.gen.d.ts +3 -0
- package/dist/tools/generated/delivery-test.gen.d.ts.map +1 -0
- package/dist/tools/generated/delivery-test.gen.js +17 -0
- package/dist/tools/generated/delivery-test.gen.js.map +1 -0
- package/dist/tools/generated/discovery.gen.d.ts +3 -0
- package/dist/tools/generated/discovery.gen.d.ts.map +1 -0
- package/dist/tools/generated/discovery.gen.js +17 -0
- package/dist/tools/generated/discovery.gen.js.map +1 -0
- package/dist/tools/generated/disposition-codes.gen.d.ts +3 -0
- package/dist/tools/generated/disposition-codes.gen.d.ts.map +1 -0
- package/dist/tools/generated/disposition-codes.gen.js +30 -0
- package/dist/tools/generated/disposition-codes.gen.js.map +1 -0
- package/dist/tools/generated/email-templates.gen.d.ts +3 -0
- package/dist/tools/generated/email-templates.gen.d.ts.map +1 -0
- package/dist/tools/generated/email-templates.gen.js +108 -0
- package/dist/tools/generated/email-templates.gen.js.map +1 -0
- package/dist/tools/generated/engagements.gen.d.ts +3 -0
- package/dist/tools/generated/engagements.gen.d.ts.map +1 -0
- package/dist/tools/generated/engagements.gen.js +208 -0
- package/dist/tools/generated/engagements.gen.js.map +1 -0
- package/dist/tools/generated/enrollments.gen.d.ts +3 -0
- package/dist/tools/generated/enrollments.gen.d.ts.map +1 -0
- package/dist/tools/generated/enrollments.gen.js +82 -0
- package/dist/tools/generated/enrollments.gen.js.map +1 -0
- package/dist/tools/generated/events.gen.d.ts +3 -0
- package/dist/tools/generated/events.gen.d.ts.map +1 -0
- package/dist/tools/generated/events.gen.js +20 -0
- package/dist/tools/generated/events.gen.js.map +1 -0
- package/dist/tools/generated/index.d.ts +3 -0
- package/dist/tools/generated/index.d.ts.map +1 -0
- package/dist/tools/generated/index.js +86 -0
- package/dist/tools/generated/index.js.map +1 -0
- package/dist/tools/generated/intake-centers.gen.d.ts +3 -0
- package/dist/tools/generated/intake-centers.gen.d.ts.map +1 -0
- package/dist/tools/generated/intake-centers.gen.js +196 -0
- package/dist/tools/generated/intake-centers.gen.js.map +1 -0
- package/dist/tools/generated/integrations.gen.d.ts +3 -0
- package/dist/tools/generated/integrations.gen.d.ts.map +1 -0
- package/dist/tools/generated/integrations.gen.js +290 -0
- package/dist/tools/generated/integrations.gen.js.map +1 -0
- package/dist/tools/generated/ivr.gen.d.ts +3 -0
- package/dist/tools/generated/ivr.gen.d.ts.map +1 -0
- package/dist/tools/generated/ivr.gen.js +97 -0
- package/dist/tools/generated/ivr.gen.js.map +1 -0
- package/dist/tools/generated/leads.gen.d.ts +3 -0
- package/dist/tools/generated/leads.gen.d.ts.map +1 -0
- package/dist/tools/generated/leads.gen.js +592 -0
- package/dist/tools/generated/leads.gen.js.map +1 -0
- package/dist/tools/generated/number-pool.gen.d.ts +3 -0
- package/dist/tools/generated/number-pool.gen.d.ts.map +1 -0
- package/dist/tools/generated/number-pool.gen.js +62 -0
- package/dist/tools/generated/number-pool.gen.js.map +1 -0
- package/dist/tools/generated/offers.gen.d.ts +3 -0
- package/dist/tools/generated/offers.gen.d.ts.map +1 -0
- package/dist/tools/generated/offers.gen.js +407 -0
- package/dist/tools/generated/offers.gen.js.map +1 -0
- package/dist/tools/generated/organizations.gen.d.ts +3 -0
- package/dist/tools/generated/organizations.gen.d.ts.map +1 -0
- package/dist/tools/generated/organizations.gen.js +161 -0
- package/dist/tools/generated/organizations.gen.js.map +1 -0
- package/dist/tools/generated/partners.gen.d.ts +3 -0
- package/dist/tools/generated/partners.gen.d.ts.map +1 -0
- package/dist/tools/generated/partners.gen.js +121 -0
- package/dist/tools/generated/partners.gen.js.map +1 -0
- package/dist/tools/generated/payouts.gen.d.ts +3 -0
- package/dist/tools/generated/payouts.gen.d.ts.map +1 -0
- package/dist/tools/generated/payouts.gen.js +92 -0
- package/dist/tools/generated/payouts.gen.js.map +1 -0
- package/dist/tools/generated/people.gen.d.ts +3 -0
- package/dist/tools/generated/people.gen.d.ts.map +1 -0
- package/dist/tools/generated/people.gen.js +354 -0
- package/dist/tools/generated/people.gen.js.map +1 -0
- package/dist/tools/generated/posting-log.gen.d.ts +3 -0
- package/dist/tools/generated/posting-log.gen.d.ts.map +1 -0
- package/dist/tools/generated/posting-log.gen.js +150 -0
- package/dist/tools/generated/posting-log.gen.js.map +1 -0
- package/dist/tools/generated/refunds.gen.d.ts +3 -0
- package/dist/tools/generated/refunds.gen.d.ts.map +1 -0
- package/dist/tools/generated/refunds.gen.js +91 -0
- package/dist/tools/generated/refunds.gen.js.map +1 -0
- package/dist/tools/generated/reports.gen.d.ts +3 -0
- package/dist/tools/generated/reports.gen.d.ts.map +1 -0
- package/dist/tools/generated/reports.gen.js +38 -0
- package/dist/tools/generated/reports.gen.js.map +1 -0
- package/dist/tools/generated/sessions.gen.d.ts +3 -0
- package/dist/tools/generated/sessions.gen.d.ts.map +1 -0
- package/dist/tools/generated/sessions.gen.js +90 -0
- package/dist/tools/generated/sessions.gen.js.map +1 -0
- package/dist/tools/generated/settings.gen.d.ts +3 -0
- package/dist/tools/generated/settings.gen.d.ts.map +1 -0
- package/dist/tools/generated/settings.gen.js +473 -0
- package/dist/tools/generated/settings.gen.js.map +1 -0
- package/dist/tools/generated/telephony.gen.d.ts +3 -0
- package/dist/tools/generated/telephony.gen.d.ts.map +1 -0
- package/dist/tools/generated/telephony.gen.js +170 -0
- package/dist/tools/generated/telephony.gen.js.map +1 -0
- package/dist/tools/generated/tenants.gen.d.ts +3 -0
- package/dist/tools/generated/tenants.gen.d.ts.map +1 -0
- package/dist/tools/generated/tenants.gen.js +223 -0
- package/dist/tools/generated/tenants.gen.js.map +1 -0
- package/dist/tools/generated/tracking-numbers.gen.d.ts +3 -0
- package/dist/tools/generated/tracking-numbers.gen.d.ts.map +1 -0
- package/dist/tools/generated/tracking-numbers.gen.js +131 -0
- package/dist/tools/generated/tracking-numbers.gen.js.map +1 -0
- package/dist/tools/generated/transactions.gen.d.ts +3 -0
- package/dist/tools/generated/transactions.gen.d.ts.map +1 -0
- package/dist/tools/generated/transactions.gen.js +62 -0
- package/dist/tools/generated/transactions.gen.js.map +1 -0
- package/dist/tools/generated/users.gen.d.ts +3 -0
- package/dist/tools/generated/users.gen.d.ts.map +1 -0
- package/dist/tools/generated/users.gen.js +339 -0
- package/dist/tools/generated/users.gen.js.map +1 -0
- package/dist/tools/generated/vertical-groups.gen.d.ts +3 -0
- package/dist/tools/generated/vertical-groups.gen.d.ts.map +1 -0
- package/dist/tools/generated/vertical-groups.gen.js +243 -0
- package/dist/tools/generated/vertical-groups.gen.js.map +1 -0
- package/dist/tools/generated/verticals.gen.d.ts +3 -0
- package/dist/tools/generated/verticals.gen.d.ts.map +1 -0
- package/dist/tools/generated/verticals.gen.js +164 -0
- package/dist/tools/generated/verticals.gen.js.map +1 -0
- package/dist/tools/leads.d.ts +4 -0
- package/dist/tools/leads.d.ts.map +1 -0
- package/dist/tools/leads.js +69 -0
- package/dist/tools/leads.js.map +1 -0
- package/dist/tools/offers.d.ts +4 -0
- package/dist/tools/offers.d.ts.map +1 -0
- package/dist/tools/offers.js +33 -0
- package/dist/tools/offers.js.map +1 -0
- package/dist/tools/partners.d.ts +4 -0
- package/dist/tools/partners.d.ts.map +1 -0
- package/dist/tools/partners.js +30 -0
- package/dist/tools/partners.js.map +1 -0
- package/dist/tools/people.d.ts +4 -0
- package/dist/tools/people.d.ts.map +1 -0
- package/dist/tools/people.js +42 -0
- package/dist/tools/people.js.map +1 -0
- package/dist/tools/reports.d.ts +4 -0
- package/dist/tools/reports.d.ts.map +1 -0
- package/dist/tools/reports.js +67 -0
- package/dist/tools/reports.js.map +1 -0
- package/dist/tools/ui.d.ts +3 -0
- package/dist/tools/ui.d.ts.map +1 -0
- package/dist/tools/ui.js +108 -0
- package/dist/tools/ui.js.map +1 -0
- package/dist/tools/verticals.d.ts +4 -0
- package/dist/tools/verticals.d.ts.map +1 -0
- package/dist/tools/verticals.js +25 -0
- package/dist/tools/verticals.js.map +1 -0
- package/dist/types.d.ts +19 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: buyer-guide
|
|
3
|
+
description: "Buyer guide for iSCALE lead routing — managing contracts, filters, caps, delivery, dedup, balance, returns, dispositions, the buyer portal. Use when configuring how you receive leads, troubleshooting delivery, or managing your buyer account."
|
|
4
|
+
user_invocable: true
|
|
5
|
+
allowed_tools:
|
|
6
|
+
- Bash
|
|
7
|
+
- Read
|
|
8
|
+
- Grep
|
|
9
|
+
- Glob
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# iSCALE Buyer Guide
|
|
13
|
+
|
|
14
|
+
Guide for buyers (advertisers, clients, law firms, agencies) who purchase leads from iSCALE. Covers contracts, filters, delivery, dedup, billing, returns, and the buyer portal.
|
|
15
|
+
|
|
16
|
+
## When to use
|
|
17
|
+
- Setting up or modifying how you receive leads
|
|
18
|
+
- Configuring filters (geo, demographic, custom)
|
|
19
|
+
- Setting caps and schedules
|
|
20
|
+
- Configuring delivery to your CRM or endpoint
|
|
21
|
+
- Understanding dedup and how duplicates are handled
|
|
22
|
+
- Managing balance and billing
|
|
23
|
+
- Returning leads or handling dispositions
|
|
24
|
+
- Using the buyer portal
|
|
25
|
+
- Troubleshooting delivery issues
|
|
26
|
+
|
|
27
|
+
## How You Receive Leads
|
|
28
|
+
|
|
29
|
+
Partners submit leads → the routing engine evaluates your contracts → if your filters match, the lead is delivered to your endpoint.
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
Lead submitted → Routing Engine checks your contract → Filters pass? → Caps ok? → No dupe? → Delivered to you
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
You only pay for leads that pass all checks and are successfully delivered.
|
|
36
|
+
|
|
37
|
+
## Contracts — Your Lead Agreements
|
|
38
|
+
|
|
39
|
+
A contract defines exactly what leads you want, how many, at what price, and where to deliver them. You can have multiple contracts for different verticals or different criteria within the same vertical.
|
|
40
|
+
|
|
41
|
+
### Key Contract Settings
|
|
42
|
+
|
|
43
|
+
**What leads you want:**
|
|
44
|
+
|
|
45
|
+
| Setting | Purpose | Example |
|
|
46
|
+
|---------|---------|---------|
|
|
47
|
+
| verticalId | Lead category | Solar, Medicare, Auto Insurance |
|
|
48
|
+
| geoFilters | Geographic restrictions | Only leads from CA, TX, FL |
|
|
49
|
+
| demographicFilters | Age/gender requirements | Age 25-65 |
|
|
50
|
+
| customFilters | Vertical-specific criteria | homeOwner = true, utilityBill > $100 |
|
|
51
|
+
|
|
52
|
+
**How many:**
|
|
53
|
+
|
|
54
|
+
| Setting | Purpose |
|
|
55
|
+
|---------|---------|
|
|
56
|
+
| dailyLeadCap | Max leads per day |
|
|
57
|
+
| weeklyLeadCap | Max leads per week |
|
|
58
|
+
| monthlyLeadCap | Max leads per month |
|
|
59
|
+
| dailySpendCap | Max spend per day |
|
|
60
|
+
| weeklySpendCap | Max spend per week |
|
|
61
|
+
| monthlySpendCap | Max spend per month |
|
|
62
|
+
|
|
63
|
+
**At what price:**
|
|
64
|
+
|
|
65
|
+
| Setting | Purpose |
|
|
66
|
+
|---------|---------|
|
|
67
|
+
| pricingModel | `fixed` (set price) or `ping_post` (bid per lead) |
|
|
68
|
+
| pricePerLead | Amount you pay per lead |
|
|
69
|
+
| exclusiveMultiplier | Price multiplier for exclusive leads (default: 1.0) |
|
|
70
|
+
| allowMultiSale | Whether you accept shared/multisell leads |
|
|
71
|
+
|
|
72
|
+
**When:**
|
|
73
|
+
|
|
74
|
+
| Setting | Purpose |
|
|
75
|
+
|---------|---------|
|
|
76
|
+
| scheduleTimezone | Your timezone (default: America/Los_Angeles) |
|
|
77
|
+
| scheduleHours | Operating hours per day of week |
|
|
78
|
+
| expiresAt | Contract end date |
|
|
79
|
+
|
|
80
|
+
Empty scheduleHours = leads delivered 24/7. If hours are set, leads outside your hours are rejected (not queued for later).
|
|
81
|
+
|
|
82
|
+
## Filters — Controlling What You Receive
|
|
83
|
+
|
|
84
|
+
### Geographic Filters
|
|
85
|
+
|
|
86
|
+
```json
|
|
87
|
+
{
|
|
88
|
+
"states": ["CA", "TX", "FL"],
|
|
89
|
+
"zipCodes": ["902*", "100*", "330*"]
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- States use 2-letter abbreviations ("CA" not "California")
|
|
94
|
+
- Zip codes support wildcards ("902*" matches 90201-90299)
|
|
95
|
+
- Leave empty to accept all locations
|
|
96
|
+
|
|
97
|
+
### Demographic Filters
|
|
98
|
+
|
|
99
|
+
```json
|
|
100
|
+
{
|
|
101
|
+
"minAge": 25,
|
|
102
|
+
"maxAge": 65
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Custom Filters (Vertical-Specific)
|
|
107
|
+
|
|
108
|
+
These depend on the vertical. Examples for Solar:
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"homeOwner": true,
|
|
113
|
+
"utilityBill": { "min": 100 }
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### How Filters Are Evaluated
|
|
118
|
+
|
|
119
|
+
All filters must pass for a lead to reach you. If any filter fails, the lead is rejected for your contract (but may still go to other buyers).
|
|
120
|
+
|
|
121
|
+
Order of evaluation:
|
|
122
|
+
1. Contract status active?
|
|
123
|
+
2. Your account status active?
|
|
124
|
+
3. Your balance within credit limit?
|
|
125
|
+
4. Within your schedule hours?
|
|
126
|
+
5. Geo filters match?
|
|
127
|
+
6. Demographic filters match?
|
|
128
|
+
7. Custom filters match?
|
|
129
|
+
8. Caps not exceeded?
|
|
130
|
+
9. Dedup check passed?
|
|
131
|
+
|
|
132
|
+
## Delivery — How Leads Reach You
|
|
133
|
+
|
|
134
|
+
Leads are delivered to your system via the method configured on your contract or intake center.
|
|
135
|
+
|
|
136
|
+
### Delivery Methods
|
|
137
|
+
|
|
138
|
+
| Method | Description |
|
|
139
|
+
|--------|-------------|
|
|
140
|
+
| `http_post` | POST JSON to your endpoint |
|
|
141
|
+
| `http_get` | GET request with data as query params |
|
|
142
|
+
| `email` | Lead data sent via email |
|
|
143
|
+
|
|
144
|
+
### Delivery Configuration
|
|
145
|
+
|
|
146
|
+
**On the contract directly:**
|
|
147
|
+
- `deliveryUrlOverride` — your endpoint URL
|
|
148
|
+
- `deliveryMethodOverride` — POST, GET, or email
|
|
149
|
+
- `deliveryConfig` — field mapping, custom headers, auth
|
|
150
|
+
|
|
151
|
+
**Via Intake Center (recommended for CRM integration):**
|
|
152
|
+
- Link your contract to an intake center
|
|
153
|
+
- Intake center defines delivery URL, auth, field mapping
|
|
154
|
+
- Multiple contracts can share the same intake center
|
|
155
|
+
|
|
156
|
+
### Delivery Config Example
|
|
157
|
+
|
|
158
|
+
```json
|
|
159
|
+
{
|
|
160
|
+
"url": "https://your-crm.com/api/leads",
|
|
161
|
+
"method": "POST",
|
|
162
|
+
"headers": {
|
|
163
|
+
"X-API-Key": "your-key"
|
|
164
|
+
},
|
|
165
|
+
"fieldMapping": {
|
|
166
|
+
"first_name": "{{firstName}}",
|
|
167
|
+
"last_name": "{{lastName}}",
|
|
168
|
+
"email_address": "{{email}}",
|
|
169
|
+
"phone_number": "{{phone}}"
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Delivery Statuses
|
|
175
|
+
|
|
176
|
+
| Status | Meaning |
|
|
177
|
+
|--------|---------|
|
|
178
|
+
| `pending` | Waiting to be delivered |
|
|
179
|
+
| `delivering` | Delivery in progress |
|
|
180
|
+
| `delivered` | Successfully delivered to your endpoint |
|
|
181
|
+
| `failed` | Delivery failed (will retry) |
|
|
182
|
+
| `returned` | Lead was returned (refunded) |
|
|
183
|
+
|
|
184
|
+
## Dedup — Duplicate Prevention
|
|
185
|
+
|
|
186
|
+
Dedup prevents you from receiving the same person twice within a time window.
|
|
187
|
+
|
|
188
|
+
### How It Works
|
|
189
|
+
|
|
190
|
+
1. When a lead is routed to you, iSCALE hashes the dedup fields (default: email + phone)
|
|
191
|
+
2. Checks if that hash exists in your dedup history within the window
|
|
192
|
+
3. If found → lead is rejected as duplicate for your contract
|
|
193
|
+
4. If not found → lead is delivered, hash is stored
|
|
194
|
+
|
|
195
|
+
### Settings
|
|
196
|
+
|
|
197
|
+
| Setting | Default | Purpose |
|
|
198
|
+
|---------|---------|---------|
|
|
199
|
+
| dedupEnabled | false | Turn on duplicate checking |
|
|
200
|
+
| dedupFields | ["email", "phone"] | Which fields to check |
|
|
201
|
+
| dedupWindowDays | 30 | How many days to remember |
|
|
202
|
+
|
|
203
|
+
### Important Notes
|
|
204
|
+
|
|
205
|
+
- Dedup is **per-buyer** — if you and another buyer both have contracts, you can both receive the same person
|
|
206
|
+
- Cross-partner dedup (same person from different partners) is configured at the **offer level**, not the buyer level
|
|
207
|
+
- Dedup records expire after `dedupWindowDays` — after that, the same person can be sent again
|
|
208
|
+
|
|
209
|
+
## Balance & Billing
|
|
210
|
+
|
|
211
|
+
### How Balance Works
|
|
212
|
+
|
|
213
|
+
- Your **balance** increases each time you receive a lead (you owe more)
|
|
214
|
+
- Your **creditLimit** is the maximum you can owe before leads stop routing to you
|
|
215
|
+
- When balance >= creditLimit, all your contracts are skipped during routing
|
|
216
|
+
|
|
217
|
+
### Balance Fields
|
|
218
|
+
|
|
219
|
+
| Field | Purpose |
|
|
220
|
+
|-------|---------|
|
|
221
|
+
| balance | Current amount owed |
|
|
222
|
+
| creditLimit | Max allowed balance |
|
|
223
|
+
| autoRecharge | Automatically add funds? |
|
|
224
|
+
| autoRechargeAmount | How much to add |
|
|
225
|
+
| autoRechargeThreshold | Balance level that triggers recharge |
|
|
226
|
+
|
|
227
|
+
### If Leads Stop Coming
|
|
228
|
+
|
|
229
|
+
Check your balance — if it's at or near your credit limit, that's why. Either make a payment (reduces balance) or ask your admin to increase the credit limit.
|
|
230
|
+
|
|
231
|
+
## Returns
|
|
232
|
+
|
|
233
|
+
You can return leads within the return window if they don't meet quality standards.
|
|
234
|
+
|
|
235
|
+
### How Returns Work
|
|
236
|
+
|
|
237
|
+
1. You identify a low-quality lead
|
|
238
|
+
2. Submit a return request with the lead ID and reason
|
|
239
|
+
3. If within the return window, the lead is refunded
|
|
240
|
+
4. Your balance is reduced by the lead's price
|
|
241
|
+
5. The partner's balance is also adjusted
|
|
242
|
+
|
|
243
|
+
### Return via API
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
POST /api/buyer/leads/{leadId}/return
|
|
247
|
+
Authorization: Bearer lr_your_buyer_api_key
|
|
248
|
+
|
|
249
|
+
{
|
|
250
|
+
"reason": "Invalid phone number"
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Dispositions
|
|
255
|
+
|
|
256
|
+
Dispositions track what happened to a lead after delivery — did the buyer close the deal? Did the lead answer the phone?
|
|
257
|
+
|
|
258
|
+
### How Dispositions Work
|
|
259
|
+
|
|
260
|
+
1. Lead is delivered to you
|
|
261
|
+
2. You process the lead in your CRM
|
|
262
|
+
3. You send back a disposition (status update) via postback or API
|
|
263
|
+
4. iSCALE records the disposition and may trigger CPA payments
|
|
264
|
+
|
|
265
|
+
### Common Dispositions
|
|
266
|
+
|
|
267
|
+
| Disposition | Meaning |
|
|
268
|
+
|-------------|---------|
|
|
269
|
+
| contacted | Lead was contacted |
|
|
270
|
+
| qualified | Lead is qualified |
|
|
271
|
+
| converted | Lead became a customer (triggers CPA if configured) |
|
|
272
|
+
| not_interested | Lead declined |
|
|
273
|
+
| bad_data | Data was incorrect |
|
|
274
|
+
| duplicate | You already had this person |
|
|
275
|
+
|
|
276
|
+
### CPA (Cost Per Acquisition)
|
|
277
|
+
|
|
278
|
+
If your contract has CPA configured:
|
|
279
|
+
- **cpaAmount:** Bonus payment triggered when lead converts
|
|
280
|
+
- **cpaWindowDays:** Days to wait for conversion before expiring
|
|
281
|
+
- When you send a "converted" disposition within the window, the CPA payment is processed
|
|
282
|
+
|
|
283
|
+
## Intake Centers — CRM Integration
|
|
284
|
+
|
|
285
|
+
An intake center represents your CRM or backend system. It centralizes delivery config so multiple contracts can share it.
|
|
286
|
+
|
|
287
|
+
### What Intake Centers Provide
|
|
288
|
+
|
|
289
|
+
| Feature | Purpose |
|
|
290
|
+
|---------|---------|
|
|
291
|
+
| Delivery config | URL, auth, method — shared across contracts |
|
|
292
|
+
| Disposition mapping | Your CRM status codes → iSCALE dispositions |
|
|
293
|
+
| Program cascades | Your program codes → specific contracts |
|
|
294
|
+
|
|
295
|
+
### Disposition Mapping Example
|
|
296
|
+
|
|
297
|
+
Your CRM returns status codes like "SOLD", "DNC", "CALLBACK". The intake center maps these:
|
|
298
|
+
|
|
299
|
+
| Your CRM Code | iSCALE Disposition |
|
|
300
|
+
|---------------|-------------------|
|
|
301
|
+
| SOLD | converted |
|
|
302
|
+
| DNC | not_interested |
|
|
303
|
+
| CALLBACK | contacted |
|
|
304
|
+
| BAD_NUM | bad_data |
|
|
305
|
+
|
|
306
|
+
## Buyer Portal
|
|
307
|
+
|
|
308
|
+
The buyer portal gives you a dashboard to view your leads, track spending, and manage settings.
|
|
309
|
+
|
|
310
|
+
### Accessing the Portal
|
|
311
|
+
|
|
312
|
+
- **URL:** Your iSCALE instance URL + `/buyer` (e.g., `https://leads.iscale.com/buyer`)
|
|
313
|
+
- **Auth:** Login with your buyer account credentials
|
|
314
|
+
|
|
315
|
+
### What You Can See
|
|
316
|
+
|
|
317
|
+
| Section | Information |
|
|
318
|
+
|---------|-------------|
|
|
319
|
+
| Dashboard | Today's leads, spending, cap utilization |
|
|
320
|
+
| Leads | All leads received, with status and delivery info |
|
|
321
|
+
| Contracts | Your active contracts and their settings |
|
|
322
|
+
| Transactions | Financial history — charges, credits, payments |
|
|
323
|
+
| Settings | Account profile, API keys |
|
|
324
|
+
|
|
325
|
+
### Buyer API Keys
|
|
326
|
+
|
|
327
|
+
Create API keys in Settings to access the buyer API programmatically.
|
|
328
|
+
|
|
329
|
+
```
|
|
330
|
+
GET /api/buyer/leads
|
|
331
|
+
Authorization: Bearer lr_your_buyer_api_key
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
## Ping-Post (Auction Model)
|
|
335
|
+
|
|
336
|
+
If your contract uses ping-post pricing, here's how it works:
|
|
337
|
+
|
|
338
|
+
1. **Ping:** iSCALE sends you lead attributes (no PII — just vertical data, geo, demographics)
|
|
339
|
+
2. **You bid:** Return a bid price (or decline)
|
|
340
|
+
3. **Post:** If you win the auction, iSCALE delivers the full lead with PII
|
|
341
|
+
4. **You pay:** The bid price, not the contract's fixed price
|
|
342
|
+
|
|
343
|
+
### Ping Request (What You Receive)
|
|
344
|
+
|
|
345
|
+
```json
|
|
346
|
+
{
|
|
347
|
+
"pingId": "abc-123",
|
|
348
|
+
"vertical": "solar",
|
|
349
|
+
"state": "CA",
|
|
350
|
+
"zipCode": "90210",
|
|
351
|
+
"homeOwner": true,
|
|
352
|
+
"utilityBill": 150
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Your Bid Response
|
|
357
|
+
|
|
358
|
+
```json
|
|
359
|
+
{
|
|
360
|
+
"pingId": "abc-123",
|
|
361
|
+
"bid": 25.00,
|
|
362
|
+
"accepted": true
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
Or to decline:
|
|
367
|
+
```json
|
|
368
|
+
{
|
|
369
|
+
"pingId": "abc-123",
|
|
370
|
+
"accepted": false
|
|
371
|
+
}
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
## Troubleshooting
|
|
375
|
+
|
|
376
|
+
### Not receiving any leads
|
|
377
|
+
1. Check your account status is `active`
|
|
378
|
+
2. Check your balance hasn't exceeded creditLimit
|
|
379
|
+
3. Check your contracts are `active`
|
|
380
|
+
4. Check your contracts are linked to an offer
|
|
381
|
+
5. Check filter settings aren't too restrictive
|
|
382
|
+
6. Check schedule — are you within operating hours?
|
|
383
|
+
|
|
384
|
+
### Receiving leads you don't want
|
|
385
|
+
1. Tighten your geo filters (add specific states/zips)
|
|
386
|
+
2. Add demographic filters
|
|
387
|
+
3. Add custom filters for vertical-specific criteria
|
|
388
|
+
4. Contact your admin to adjust contract settings
|
|
389
|
+
|
|
390
|
+
### Delivery failures
|
|
391
|
+
1. Check your delivery URL is correct and accepting requests
|
|
392
|
+
2. Check auth configuration matches your endpoint
|
|
393
|
+
3. Check your endpoint is returning 200 status codes
|
|
394
|
+
4. Review delivery response in lead detail for error messages
|
|
395
|
+
|
|
396
|
+
### Duplicate leads
|
|
397
|
+
1. Enable dedupEnabled on your buyer account
|
|
398
|
+
2. Set dedupFields to the fields you want to check (default: email + phone)
|
|
399
|
+
3. Set dedupWindowDays to your preferred lookback window
|
|
400
|
+
4. Note: dedup only prevents duplicates to YOUR account — other buyers may still get the same person
|
|
401
|
+
|
|
402
|
+
### Balance too high
|
|
403
|
+
1. Make a payment to reduce your balance
|
|
404
|
+
2. Ask your admin to increase your creditLimit
|
|
405
|
+
3. Consider enabling autoRecharge to automatically fund your account
|