ℹ This view is ranked by net sales and based on known-state leads only.
Dashboard V3
Performance analytics, state breakdown, and hourly insights
Campaign Performance Funnel
State Performance Breakdown
#
State
SMS Sent
Clicks
CTR
Leads
Partials
Checkout Abandoned
Gross Sales
Refunds
Net Sales
Checkout Conversion
Status
Hourly Performance
Hour
SMS Sent
Clicks
CTR
Leads
Partials
Checkout Abandoned
Gross Sales
Refunds
Net Sales
Conv. Rate
Eastern Time, summed across every day in the range.
! Underperforming States
#
State
Conv. Rate
Net Sales
Key Issue
ℹ Leads are known-state only and dated by sale date, matching Dashboard V2. SMS by state comes from ClickText blast names; a click's state comes from its blast name, else its IP location.
The lists we went out to, as opposed to the leads that came in. Drop a day's CSVs here — the
filename says which state and which day, so ar0831-ready.csv and
ar0831-ready-2.csv both file themselves under Arkansas on the 31st. Every number is
matched against the CRM on the phone number, so a file can be judged on the sales it produced
rather than on how many rows it had.
Pull a follow-up list
Yesterday's list again, minus everyone who bought, everyone on the blacklist, and every number
that was in the day's files twice. A sale counts from the moment the lead reaches
Paid, Pending Info, Need Info, Completed, Refunded, Reversal or Error — the same
set the Dashboard calls Total Sales — so someone who paid this morning is already out of
tonight's send.
Pick a day to see what is left to send.
By state
State
Leads
Sold
Rate
Left
By carrier
Carrier
Leads
Sold
Rate
Left
Files
Day
State
File
Rows
Sold
Rate
Left to send
Dropped
Uploaded
Direct Mail
Upload a file of filings and it is mailed. Before anything goes to PostGrid the file is scrubbed:
any business whose name has reached the website (a lead at any stage, or a tracked click), any
business already mailed from an earlier file, repeats within the file, and rows without a usable
address are taken out. Everything left is sent as a letter straight away.
Upload & send
CSV with Filing State, Business Name, Entity ID, Formation Date, Respond Date, First Name,
Last Name, Address, City, State, Zip. The same file uploaded twice is refused, so nothing is mailed twice.
Files
File
Rows
Scrubbed
To mail
Sent
Failed
PostGrid
Status
Results
File
Pieces
Leads
Sales
Refunds
Net sales
Net / 1k pieces
PostGrid settings
Email
Templates
Automations
Recent Sends
Automatic Notifications
Notify your team by email when a lead hits a trigger. These go to internal recipients — not to the lead.
Notification Rules
Recent Notifications
Click Tracker
🔗 How to send clicks here
1. Tracking link (for SMS / ClickSend): put this URL in your messages — it logs the click and instantly redirects the visitor.
Parameters: m = message label, b = business, u = destination URL (only your own domains allowed), cid = optional custom click id.
2. API postback (from the Vercel site):
Latest Clicks
Time
Msg
Business
IP
Location
ISP
Device
Browser
Click ID
New Notification Rule
Separate multiple recipients with commas.
"New Lead" fires when a lead is created. Stage triggers fire when a lead enters that stage.
Custom Message (optional)
Leave blank to send the built-in lead summary (all lead details in a table).
Every product needs at least one live gateway. Weights are relative shares inside a product —
70 and 30 split traffic 70/30, and so do 7 and 3. Set a weight to 0 or flip a gateway off to
pull it out of rotation without losing the link.
Routing endpoint
Your funnel fetches this and picks a gateway itself — no key needed, and it changes the
moment you save a weight here.
GET/api/merchants/config
Live response
{}
Picking a gateway on the front end
const cfg = await fetch('/api/merchants/config').then(r => r.json());
const p = cfg.products[serviceType]; // 'standard' | 'extended'
// One random draw, one winner — the ranges already encode the weights.
const r = Math.random() * p.total_weight;
const gateway = p.gateways.find(g => r >= g.range_start && r < g.range_end) || p.gateways[0];
window.location = gateway.url; // gateway.merchant tells you who took it
Settings
ClickText — Messages Sent
Feeds the Messages Sent cards on both dashboards from ClickText’s Daily Messages API.
The user needs API access switched on in ClickText (Settings → Team).
ClickText only has data from June 10, 2026 onward.
Delivery API — Vendor Spend
Daily Accurate Append and BellesLink cost for the Financial tab, from the soscc.io delivery API.
The key is stored encrypted and never shown again.
Stripe Reconciliation
Every succeeded Stripe charge in the range against every CRM lead in a sales stage
(Paid, Pending Info, Need Info, Completed, Refunded, Reversal, Error), dated the same way the
Dashboard dates a sale. Anything that exists on one side and not the other is listed below.
Nothing here changes a stage — the only write is Link, which records the Stripe id on the lead.
Where the two sides stand
Issue
Stripe
CRM lead
What to check
Pick a range to run the reconciliation.
User Management
Create and remove CRM logins, and choose which of them need an emailed code to sign in.
Only administrators can see this tab.
Test the sign-in code email
Two-factor sign-in fails closed: if this email cannot be delivered, an account
with 2FA on cannot sign in at all. Prove delivery here before switching it on for anyone.
Create User
Existing Users
Roles & Permissions
A role is a set of permissions. Every protected route checks them on each request, so what
you switch off here is refused by the server — not just hidden in the interface.
Roles
Permission matrix✓ granted· not granted destructive or spends money
Activity Log
Every change to a lead, its notes and its documents — who made it, when, and what moved.
Entries are append-only: nothing in the CRM edits or removes them, and deleting a lead
leaves its history behind. Automated postbacks are recorded too; use People only
to see just what staff did.
When
Who
Action
Lead
Details
✅ Complete & Send EIN
Attach the EIN confirmation document. The lead will be marked Completed and a fulfillment email will be sent to the customer with the document attached.
Leave blank and the CRM generates a private download page for this order number and includes it in the email. Only fill this in to point the customer somewhere else.
API Documentation
Postback Endpoint
Send a POST request to create or update a lead. Matches by lead_id first, then email.
POST/api/postback
Headers
Content-Type: application/json
x-api-key: YOUR_API_KEY (optional when API_KEY=changeme)
Body Fields
Field
Type
Description
lead_id
string
Optional. Reuse existing lead UUID to update it.
email
string
Used for dedup if lead_id not provided.
first_name
string
last_name
string
phone
string
company
string
stage
string
One of the pipeline stages below.
source
string
e.g. "google", "facebook"
domain
string
Landing page domain
campaign
string
Campaign name or ID
utm_source
string
utm_medium
string
utm_campaign
string
utm_term
string
utm_content
string
subid1 … subid4
string
Sub-IDs from the landing URL. First-touch; max 255 chars
Order status by number. Query: order (API key auth)
GET
/api/leads
List leads. Query: stage, search, source, campaign, from, to, page, limit
GET
/api/leads/:id
Get single lead + stage history
PUT
/api/leads/:id
Edit lead fields (admin). Body: any of email, first_name, last_name, phone, company, order_number, payment_transaction, ein_number, source, domain, campaign, utm_*, notes
PUT
/api/leads/:id/stage
Manually update stage. Body: {"stage": "Paid"}
DELETE
/api/leads/:id
Delete lead
GET
/api/finance
Financial overview: revenue and fees from Stripe, spend from the expense ledger. Query: from, to, refresh (admin)
GET
/api/finance/expenses
Expense ledger; POST/PUT/DELETE to manage it. Query: from, to (admin)
GET
/api/analytics
Dashboard analytics
GET
/api/merchants/config
Checkout routing map per product. Query: product (no key needed)
Lead Tracker
Sign in
Enter your CRM credentials to continue.
🔒 Two-factor sign-in
We sent a 6-digit code to
your inbox.
It expires in 10 minutes.
✉ Send Test Email
New Merchant
Add Expense
Stripe fees are read from Stripe and must not be entered here — they would be counted twice.
Leave blank to keep charging it every month.
New Role
Lowercase letters, numbers, hyphens. Cannot be changed later.
Granting a permission automatically grants what it depends on — a role that can write
notes can read them.
Tabs this role will see
Edit User
✎ Edit Lead
Blank a field to clear it. Every change is recorded in the Activity log with your name against it.
The stage is changed from the lead's own panel, and the tracking data the visitor generated
(IP, browser, referrer, form completion) is not editable.
Contact
Order
The customer's download link and documents follow this number when it changes.
Attribution
Funnel Notes
The single free-text field the funnel posts into — the timestamped
notes staff write live in the lead's Notes panel and are not touched here.
Upload lead lists
Drop the whole day at once. Each file's state and date are read from its name —
ar0831-ready.csv is Arkansas on the 31st, -2 on the end is that
state's second file. Anything the name doesn't say can be filled in below before importing.
File
Loading…
Blacklist — do not contact
Numbers here never go out again, whether or not they are leads — most opt-outs come from
people the CRM has never heard of. Matching ignores formatting, so
(305) 555-1234 and +13055551234 are the same entry.