💰

Select a category above to set prices

Date Customer Device Condition Timing Offer Notes Status Actions

Add New Model

Current Devices

Appt Date Time Customer Device Offer Notes Status Actions
Date Lead Device Offer Status Viewed Appointment Decline Reason
Loading offers...
Cron Jobs
2
System Status
Active
Reminders Sent
--
Upcoming Appts
--
💬
Abandoned Form Follow-Up
Texts people who started the form but didn't finish
CRON · Every 2 min
Trigger
Lead enters name + phone but never completes the condition/timing step
Delay
5 minutes after form abandon
Guard
Only once per lead (sms_followup_sent)
Message Sent
"Hey {name}! You started getting a quote for your {device} but didn't finish. Tap here to get your cash offer — takes 30 seconds: {resume_link}"
Edge function: tradein-sms-followup  |  Cron: pg_cron every 2 min  |  SMS via: GoHighLevel
📅
No-Appointment Follow-Up
Texts people who got an offer but never booked an appointment
CRON · Scheduled
Trigger
Lead completes form + gets offer, but never books appointment
Delay
5+ minutes after offer shown
Guard
Only once per lead (appt_followup_sent)
Message Sent (from "Kate")
"Hey {name}! This is Kate with BuyCellCleveland. I saw you got a quote for your {device} but didn't book your appointment. Did you have any questions or need the address? We're at 6571 Pearl Rd, Parma Heights, OH 44130 — takes about 5 minutes and you walk out with cash!"
Edge function: tradein-appt-followup  |  SMS via: GoHighLevel  |  Alt message if no price shown (invites to free 5-min appraisal)
Appointment Reminders
Sends 24hr and 1hr reminder texts before booked appointments
CRON · Every 15 min
24-Hour Reminder
"Hi {name}! Just a reminder — you have an appointment tomorrow at {time} at BuyCellCleveland. See you there!"
Skip rule: Not sent if booked within 24hrs of appointment
1-Hour Reminder
"Hi {name}! Your appointment is in 1 hour ({time}). We're at 6571 Pearl Rd, Parma Heights — see you soon!"
Skip rule: Not sent if booked within 1hr of appointment
Edge function: ghl-tradein-appt-reminder  |  Cron: pg_cron every 15 min  |  Guard: Each type sent once per appointment
💰
Make Offer → SMS
When you send an offer from admin, customer gets a text with the offer link
MANUAL TRIGGER
Offer Accept / Decline
Handles when a customer taps Accept or Decline on the offer page
WEBHOOK
👤
GHL Contact Sync
Auto-creates or finds a GHL contact when someone submits the trade-in form
AUTO
🏆
Trade-In Won
Marks a trade-in lead as "won" when the GHL workflow fires
GHL WORKFLOW
Database Triggers
Auto-run inside Postgres whenever rows are inserted or updated
ALWAYS ON

Reminder Log

Sent Customer Appt Date Appt Time Reminder
Loading...
Legend: User Action System Action Decision / Timer Abandoned SMS

Trade-In Lead Flow

🌐
Customer Opens Trade-In Form
Lands on trade-in.html from ad, link, or QR code
📱
Selects Device
Category → Type/Brand → Model → Connectivity/Size
👤
Submits Name & Phone
Lead created in Supabase with status "new"
5-Minute Follow-Up Timer Starts
sms_followup_at set to NOW + 5 min on the lead row
Does user complete "More Info" step?
Condition, timing, desired price
✓ YES
🗸
Form Completed
Timer cancelled (sms_followup_at = null). Lead fully captured.
🔍
Price in System?
Looks up tradein_prices by device key
YES
💰
Instant Cash Offer
Shows price + "Book Appointment"
NO
🛠
5-Min Appraisal
"Book a Free 5-Minute Appraisal"
📅
Books Appointment
Picks date + time slot
💬
Confirmation SMS
Date, time, store address sent via GHL
🎯
Customer Walks In
5-minute appraisal → cash in hand
✗ NO
🚶
User Abandoned
Closed tab or left without finishing
🕐
5 Minutes Pass
pg_cron checks every 2 min for overdue leads
💬
Follow-Up SMS
"You started a quote for your {device} — tap to finish in 30 seconds"
🔗
Resume Link
trade-in.html?resume={id} → drops them at "More Info" with picks pre-loaded
🔒
Duplicate Guard
sms_followup_sent = true → only 1 follow-up per lead, ever

Technical Details

⏱ Follow-Up Timer
Set on contact submit (sms_followup_at = NOW + 5 min).
Cancelled if user completes "More Info" step before timer fires.
⚡ Edge Function
tradein-sms-followup
Runs every 2 min via pg_cron. Queries leads where sms_followup_at ≤ now AND condition IS NULL AND sms_followup_sent = false.
📩 GHL SMS
Searches contact by phone, creates if new. Sends SMS via GoHighLevel conversations API. Both confirmation & follow-up use same pattern.

f Facebook Ads Setup

1

Install the Facebook Pixel

  1. Go to Facebook Events Managerbusiness.facebook.com/events_manager
  2. Click Connect Data SourcesWebFacebook Pixel
  3. Name it "BuyCellCleveland Pixel" and create it
  4. Copy your Pixel ID (looks like 123456789012345)
  5. Add this code to the <head> of your trade-in page:
<!-- Facebook Pixel -->
<script>
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){
n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;t.src=v;
s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}
(window,document,'script','https://connect.facebook.net/en_US/fbevents.js');
fbq('init', 'YOUR_PIXEL_ID');
fbq('track', 'PageView');
</script>
2

Add Conversion Events to the Form

Add these event calls to your trade-in form so Facebook can track what matters:

When Code to Add
Contact info submitted fbq('track', 'Lead');
Offer shown fbq('track', 'ViewContent', {content_name: 'Trade-In Offer'});
Appointment booked fbq('track', 'Schedule');
3

Set Up UTM Parameters on Your Ads

  1. Go to Ads Manager → Edit your ad
  2. Scroll to "Tracking" section at the bottom of the ad
  3. Click "Build a URL Parameter"
  4. Fill in these fields:
Field Value to Enter
Campaign Source facebook
Campaign Medium paid_social
Campaign Name {{campaign.name}}
Campaign Content {{ad.name}}
Campaign Term {{adset.name}}
Tip: The {{campaign.name}}, {{ad.name}}, and {{adset.name}} are Facebook dynamic parameters — they auto-fill with the actual names from your campaigns. No need to type them manually for each ad.
4

Enable Auto-Appended Parameters

Facebook automatically adds fbclid to your URLs — this is the most important parameter for conversion tracking. Make sure it's not getting stripped:

  1. Go to Events Manager → your Pixel → Settings
  2. Scroll to "Automatic Advanced Matching" and turn it ON
  3. Enable at least: Phone Number and Name
Why this matters: Advanced Matching lets Facebook match your leads back to the person who clicked the ad, even if cookies get blocked. Your form already captures name + phone — this connects them.
5

Create a Custom Conversion for "Appointment Booked"

  1. In Events Manager, click Custom Conversions (left sidebar)
  2. Click Create Custom Conversion
  3. Set the rule to: Event = Schedule
  4. Name it "Trade-In Appointment Booked"
  5. Set category to Schedule
  6. Click Create
Now use this for ad optimization: In your ad set, under Optimization & Delivery, set the conversion event to "Trade-In Appointment Booked". Facebook will automatically find more people like the ones who book appointments.
6

Verify Your Domain

  1. Go to Business SettingsBrand SafetyDomains
  2. Click Add → enter buycellcleveland.com
  3. Choose DNS Verification (easiest) or Meta Tag
  4. Follow the instructions to verify
Important: Without domain verification, iOS 14+ users won't trigger your conversion events. This step is required for proper attribution.
7

Configure Aggregated Event Measurement

After domain verification, you need to prioritize which events Facebook tracks for iOS users (you get 8 max):

  1. Go to Events ManagerAggregated Event Measurement
  2. Click Configure Web Events → select your domain
  3. Add and prioritize your events (highest priority first):
    1 Schedule (appointment booked)
    2 Lead (contact info submitted)
    3 ViewContent (offer viewed)
    4 PageView

G Google Ads Setup

1

Install Google Tag (gtag.js)

  1. Go to Google AdsTools & SettingsConversions
  2. Or go to Google Tag Manager (recommended)
  3. Get your Conversion ID (looks like AW-123456789)
  4. Add this to the <head> of your trade-in page:
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-YOUR_ID"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'AW-YOUR_ID');
</script>
2

Create Conversion Actions

  1. In Google Ads, go to GoalsConversions+ New conversion action
  2. Choose Website
  3. Create these conversion actions:
Conversion Name Category Code to Add
Trade-In Lead Submit lead form gtag('event', 'conversion', {send_to: 'AW-YOUR_ID/LABEL'});
Appointment Booked Book appointment gtag('event', 'conversion', {send_to: 'AW-YOUR_ID/LABEL'});
Where to find the label: After creating each conversion action, Google gives you a snippet. The send_to value looks like AW-123456789/AbCdEf — the part after the slash is your label. Each conversion action has a unique label.
3

Enable Auto-Tagging (gclid)

  1. In Google Ads, go to AdminAccount Settings
  2. Find "Auto-tagging"
  3. Check "Tag the URL that people click through from my ad"
  4. Click Save
What this does: Google will automatically append gclid=xxxx to every click URL. Your trade-in form already captures this and stores it with the lead — this is how you tie a lead back to the exact keyword and ad that generated it.
4

Set Up UTM Parameters on Your Ads

  1. Edit your ad → expand "Ad URL options"
  2. In the "Tracking template" field, paste:
{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={creative}&utm_term={keyword}
Parameter What It Auto-Fills
{campaignid} Your campaign ID number
{creative} The ad creative ID
{keyword} The keyword that triggered the ad
{lpurl} Your landing page URL (auto)
5

Link Google Ads to Google Analytics

  1. In Google Ads, go to Tools & SettingsLinked accounts
  2. Find Google Analytics (GA4) and click Link
  3. Select your GA4 property and confirm
Why: Linking lets you see Google Ads data in your Analytics reports and import GA4 audiences back into Google Ads for remarketing. You'll be able to see the full journey from ad click to appointment.

What Your System Already Captures

Your trade-in form automatically grabs these parameters from the URL when someone lands on it. No extra setup needed — this is already live.

Facebook Parameters
fbclid — Facebook Click ID
fb_ad_id — Ad ID
fb_adset_id — Ad Set ID
fb_campaign_id — Campaign ID
_fbp / _fbc — Pixel cookies
Google Parameters
gclid — Google Click ID
gbraid / wbraid — iOS click IDs
gad_source — Ads source
dclid — DoubleClick ID
_gcl_aw / _gcl_dc — Google cookies
Shared UTM Parameters
utm_source — facebook / google
utm_medium — paid_social / cpc
utm_campaign — Campaign name/ID
utm_content — Ad name/creative
utm_term — Ad set / keyword
All parameters are stored as JSON on each lead in your database. When you view a lead in the Leads tab, the ad source data is attached — so you can always trace which ad brought in which customer.

Quick Checklist

Change Admin Password

GHL Webhook Integration

Connect GoHighLevel workflows to automatically update trade-in lead statuses. Set up a Custom Webhook action in your GHL workflow and point it to the URL below.

Won Mark Lead as Won
GHL Setup Instructions
  1. Go to AutomationWorkflows in GHL
  2. Create or edit a workflow with the trigger "Pipeline Stage Changed" or "Deal Won"
  3. Add a Custom Webhook action
  4. Set method to POST
  5. Paste the URL above
  6. Set the body to send the contact's phone number (see example below)
Webhook JSON Body
{
  "phone": "{{contact.phone}}",
  "name": "{{contact.name}}"
}
How it works: When GHL fires the webhook, the function matches the phone number to the most recent trade-in lead and automatically updates its status to Won. No auth headers needed — the function handles authentication on the Supabase side.

Data Management

Export or reset your data. Be careful with reset - it cannot be undone.

Lead Details