All API keys are stored encrypted in your local configuration. To get your Copper API key: log into Copper → Settings → Integrations → API Keys → Generate Key. Never share your keys with anyone.
Connected
API Token REQUIRED
Copper → Settings → Integrations → API Keys → Generate Key ↗
Account Email REQUIRED
Must match the email on your Copper account exactly.
Base URL
Rate Limit
Connected
QuickBooks uses OAuth 2.0 — click Connect below to authorize via Intuit's secure login. No manual key entry required.
Company ID (auto-populated after auth)
Access Token
Token Expires
Connected
Get credentials at developers.ringcentral.com ↗ using your Office@Hand login.
Client ID REQUIRED
Client Secret REQUIRED
Account Phone
Server
Partial
API key is set but webhook callback URL has not been registered. Measurements won't push automatically until this is complete.
API Key REQUIRED
MeasureSquare → Account → Developer → API Access
Webhook Callback URL REQUIRED
https://wilkersonfloors.com/api/hooks/measuresquare
Paste this URL into MeasureSquare → Settings → Webhooks to enable automatic measurement sync.
Connected
Catch Hook URL REQUIRED
Paste your new Zapier Catch Hook URL here. It saves automatically when you click away. Keep this URL private — do not share in chat or email.
Trigger Events what will fire this webhook
Not Connected
Gmail uses OAuth 2.0 PKCE for secure, password-less authentication. Click Connect below — you'll be asked to authorize Wilkerson OS to read your inbox on the first setup. No API keys to copy/paste.
Connection Status
Not connected. Click Connect to authorize Gmail access.
Permissions Requested
✓ Read email from your inbox
✓ Get unread message count
✓ Display sender and subject in dashboard
✗ Cannot delete, send, or modify emails
Not Connected
Google Calendar uses OAuth 2.0 PKCE for secure integration. Your job dates and estimates will sync to a private calendar. Click Connect below to authorize access on first setup.
Connection Status
Not connected. Click Connect to authorize Google Calendar access.
What Gets Synced
✓ Job start/end dates as calendar events
✓ Estimate due dates
✓ Team member assignments
✓ Location and job details in event descriptions
✗ Cannot modify your other Google Calendar events
Pending Approval
Wisetack requires merchant approval before API access is granted. Apply at wisetack.com/merchants ↗. Once approved, you'll receive your Merchant ID and API key by email.
Merchant ID
API Key
Environment
Installed Modules
Toggle modules on or off. Dependencies shown where applicable.
👤
CRM · Customers
Requires: Copper CRM API
Enabled
📋
Jobs · Estimates
Requires: MeasureSquare API · Copper CRM
Enabled
📊
Reporting · P&L
Requires: QuickBooks API
Enabled
💬
Communications · SMS
Requires: AT&T Office@Hand API
Enabled
📦
Inventory · Products
No API required · Local data
Disabled
🗓
Scheduling · Calendar
Requires: Google Calendar API (not yet connected)
Disabled
💳
Financing · Wisetack
Requires: Wisetack API (pending approval)
Disabled
Automations · Zapier
Requires: Zapier API (not yet connected)
Disabled
Webhooks let external services push data to your OS instantly when something changes — no polling needed. Copy the URL for each platform and paste it into that platform's webhook settings.
Incoming Webhook Endpoints
Cu
Copper CRM
Triggers on: new lead, contact update, opportunity stage change
Active
https://wilkersonfloors.com/api/hooks/copper
QB
QuickBooks
Triggers on: invoice paid, estimate approved, new transaction
Active
https://wilkersonfloors.com/api/hooks/quickbooks
RC
Office@Hand (RingCentral)
Triggers on: inbound SMS, missed call, voicemail
Active
https://wilkersonfloors.com/api/hooks/ringcentral
MS
MeasureSquare
Triggers on: measurement complete, estimate exported
Not Registered
https://wilkersonfloors.com/api/hooks/measuresquare
Team Members
NameEmailRoleLast LoginAccess
DW
Dave Wilkerson
Owner
[email protected] Admin Today 8:02 AM Full access
NW
Nick
Office Manager
[email protected] Manager Today 7:45 AM CRM · Estimates · Reports
KD
Kendra
Secretarial
[email protected] Staff Yesterday Jobs · Schedule · Messages
Company Details
Business Name
Owner Name
Phone
Email
Address
Website
Business Settings
Min Gross Margin Target
Estimates below this margin show a red warning.
Default Estimate Validity
Default Tax Rate
SMS Auto-Send Rules
Sent from your Office@Hand number
📋
Estimate ready — notify customer
Sends: "Your estimate is ready! Reply YES to approve..."
On
🔔
Day-before job reminder
Sends evening before scheduled install
On
Job complete — thank you message
Sends when job marked complete by crew
On
💳
Invoice payment reminder
Sends 3 days after invoice if unpaid
Off
📞
Lead follow-up (48 hr)
Sends if new lead hasn't been contacted in 48 hours
Off
Recent Activity
TimePlatformEndpointMethodStatusDuration
9:14 AMCopper CRMPOST /people/searchPOST200 OK142ms
9:01 AMOffice@HandPOST /smsPOST200 OK89ms
8:30 AMOffice@HandGET /call-logGET200 OK201ms
6:00 AMQuickBooksGET /invoicesGET200 OK334ms
YesterdayMeasureSquarePOST /products/importPOST206 Partial512ms
Data Export
Customer & Lead Data (Copper CRM)
Exports all contacts, leads, opportunities, and activity notes as CSV
Estimates & Job History
All estimates, job records, line items, and crew assignments
Full Configuration Backup
API config, module settings, user list, automation rules (keys excluded for security)
// ───────────────────────────────────────────────────────────── // USER MENU FUNCTIONS // ───────────────────────────────────────────────────────────── function toggleUserMenu() { const menu = document.getElementById("user-menu"); if (menu) menu.classList.toggle("show"); } function handleLogout() { if (confirm("Are you sure you want to logout?")) { AUTH.logout(); window.location.href = "login.html"; } } function goToSettings() { window.location.href = "wilkerson-admin.html"; } function updateUserMenu() { const userEmail = AUTH.getCurrentUser(); if (userEmail) { const header = document.getElementById("user-email"); if (header) header.textContent = userEmail; } } document.addEventListener("click", function(event) { const menu = document.getElementById("user-menu"); const avatar = document.getElementById("user-avatar"); if (menu && avatar && !menu.contains(event.target) && !avatar.contains(event.target)) { menu.classList.remove("show"); } }); if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", updateUserMenu); } else { updateUserMenu(); }