Custom JavaScript Developer - Telnyx Call Button Integration for GHL CRM

Please login or register as jobseeker to apply for this job.

TYPE OF WORK

Gig

SALARY

15

HOURS PER WEEK

TBD

DATE UPDATED

Aug 27, 2025

JOB OVERVIEW

Overview:
We need a skilled JavaScript developer to create a simple, reliable script that injects a "Call" button into our GoHighLevel (GHL) CRM. The button should allow users to make outbound calls through our Telnyx VoIP service directly from the browser, using the contact's phone number. The button must appear in three specific locations: the individual contact page, the opportunity stage, and the contacts smart list. Additionally, if feasible, include a multi-dialer feature (like Wavv's power dialer) that allows initiating up to 3 simultaneous calls for efficient dialing. The script should integrate with our existing n8n workflow (on a DigitalOcean VPS) and Supabase database for fetching dynamic Telnyx credentials (API key, connection ID, caller number) per client. No external apps or downloads should be required—everything must be browser-based using Telnyx WebRTC SDK.
Project Goals:

Ensure the button always appears on every relevant page.
Make calls dynamically using client-specific Telnyx data from Supabase.
Provide a softphone-like interface with call status, mute, end call, and transfer buttons during active calls.
Add multi-dialer action for power dialing (optional but preferred).

Specific Tasks:

Button Injection:

Use JavaScript to inject a "Call" button with a phone icon next to the native GHL action bar on:

Individual contact pages (/contacts/detail/).
Opportunity stage pages.
Contacts smart list pages.


Button styling: Match GHL’s UI (e.g., background #f0f4f8, border 1px solid #ccc, border-radius 5px, inline-flex, z-index 10000).
Use a MutationObserver and window.load event to handle GHL’s SPA dynamics.


Call Initiation:

On button click, pre-fill the contact’s phone number.
Fetch dynamic Telnyx credentials from n8n webhook ( ---------- ) using a clientId (GHL user ID or locationID).
Use Telnyx WebRTC SDK ---------- to make browser-based calls without external apps.
Display a fixed softphone panel (bottom-left, z-index 10000) with:

Call status ("Call Live").
Mute button (toggle audio).
End call button (hang up via Telnyx API).
Transfer button (prompt for number and transfer via Telnyx API).


Handle microphone permissions with a toast message.


Multi-Dialer Action (Optional):

Add a "Power Dial" button to initiate up to 3 simultaneous calls (like Wavv).
Use Telnyx API to parallel dial, connect to the first answer, and hang up others.


n8n/Supabase Integration:

n8n webhook fetches credentials from Supabase clients table based on clientId.
Use Telnyx API for call creation ( ---------- ).

VIEW OTHER JOB POSTS FROM:
SHARE THIS POST
facebook linkedin
  BENCHMARKS  
Loading Time: Base Classes  0.0010
Controller Execution Time ( Jobseekers / Job )  0.0169
Total Execution Time  0.0187
  GET DATA  
No GET data exists
  MEMORY USAGE  
1,509,904 bytes
  POST DATA  
No POST data exists
  URI STRING  
jobseekers/job/Custom-JavaScript-Developer-Telnyx-Call-Button-Integration-for-GHL-CRM-1456695
  CLASS/METHOD  
jobseekers/job
  DATABASE:  onlinejobs (Jobseekers:$db)   QUERIES: 13 (0.0101 seconds)  (Hide)
0.0003   SELECT *
                                
FROM exrates
                                WHERE rate_name 
'USD-PHP' 
0.0004   SELECT *
FROM `employer_jobs`
WHERE `job_id` = 1456695
 LIMIT 1 
0.0010   SELECT *
FROM `employers`
WHERE `employer_id` = 690698
 LIMIT 1 
0.0009   SELECT COUNT(*) AS `numrows`
FROM `t_thread` `t`
LEFT JOIN `t_thread_misc` `miscON `t`.`id` = `misc`.`thread_id`
WHERE `t`.`job_id` = 1456695
AND `misc`.`idIS NULL 
0.0004   SELECT e.business_namee.logoe.websitee.rebill_datee.date_added member_datehitsDATEDIFF('2026-04-21',ej.date_added) duration_daysDATEDIFF('2026-04-21',e.rebill_date) duration_rebillej.*, e.deactivate FROM employers eemployer_jobs ej WHERE e.employer_id ej.employer_id AND
                                   ((
e.user_level >= '500' AND ej.date_added <= e.rebill_date)
                                   OR 
e.employer_id '' OR (ej.date_approved <> '2000-01-01' and DATEDIFF('2026-04-21',ej.date_added) <= 14 ))
                                   AND 
e.deactivate != AND ej.deleted AND job_id '1456695' 
0.0003   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1456695 
0.0020   UPDATE employer_jobs SET hit_counts '***Aug-27-2025=22***Aug-28-2025=120***Aug-29-2025=6***Aug-30-2025=2***Aug-31-2025=3***Sep-01-2025=3***Sep-02-2025=1***Sep-03-2025=3***Sep-04-2025=2***Sep-05-2025=2***Sep-06-2025=1***Sep-07-2025=1***Sep-10-2025=6***Sep-11-2025=1***Sep-13-2025=1***Sep-15-2025=1***Sep-17-2025=3***Sep-18-2025=3***Sep-19-2025=2***Sep-20-2025=1***Sep-21-2025=2***Sep-22-2025=2***Sep-25-2025=1***Sep-26-2025=1***Sep-27-2025=1***Sep-28-2025=2***Sep-29-2025=1***Oct-01-2025=1***Oct-03-2025=2***Oct-04-2025=1***Oct-05-2025=2***Oct-11-2025=1***Oct-13-2025=1***Oct-17-2025=1***Oct-24-2025=3***Nov-03-2025=1***Nov-08-2025=1***Nov-12-2025=1***Nov-13-2025=1***Nov-14-2025=2***Nov-15-2025=1***Nov-21-2025=1***Nov-22-2025=1***Nov-24-2025=2***Nov-25-2025=1***Nov-26-2025=1***Dec-01-2025=1***Dec-02-2025=1***Dec-04-2025=2***Dec-05-2025=3***Dec-08-2025=6***Dec-13-2025=1***Dec-15-2025=1***Dec-17-2025=1***Dec-24-2025=1***Dec-25-2025=1***Dec-28-2025=1***Dec-29-2025=1***Jan-01-2026=1***Jan-06-2026=2***Jan-07-2026=2***Jan-10-2026=2***Jan-14-2026=1***Jan-15-2026=1***Jan-16-2026=1***Jan-22-2026=1***Jan-23-2026=1***Jan-24-2026=1***Jan-27-2026=1***Jan-29-2026=1***Feb-07-2026=1***Feb-13-2026=3***Feb-14-2026=1***Feb-16-2026=1***Feb-17-2026=1***Feb-19-2026=2***Feb-20-2026=1***Feb-21-2026=1***Feb-24-2026=1***Mar-05-2026=2***Mar-08-2026=1***Mar-10-2026=1***Mar-16-2026=1***Mar-17-2026=2***Mar-18-2026=1***Mar-19-2026=1***Mar-26-2026=4***Mar-29-2026=1***Apr-03-2026=2***Apr-06-2026=2***Apr-07-2026=3***Apr-14-2026=1***Apr-18-2026=2***Apr-21-2026=1' WHERE job_id'1456695'  
0.0008   UPDATE employer_jobs SET monthly_hits '***Aug-2025=153***Sep-2025=41***Oct-2025=12***Nov-2025=13***Dec-2025=20***Jan-2026=15***Feb-2026=12***Mar-2026=14***Apr-2026=11' WHERE job_id'1456695'  
0.0010   SELECT date_sent FROM jobseeker_sent_emails WHERE jobseeker_id '' AND job_id '1456695' AND status LIKE 'sent%' ORDER BY id DESC  
0.0002   SELECT *
FROM `employer_jobs_skills` `ejs`
LEFT JOIN `skills_categories` `scON `ejs`.`skill_id` = `sc`.`id`
WHERE `job_id` = 1456695 
0.0023   SELECT COUNT(*) AS `numrows`
FROM `employer_jobs`
WHERE `employer_id` = '690698'
AND `date_added` >= '2022-06-08' 
0.0003   select from teasers 
0.0002   SELECT FROM skill_categories WHERE skill_cat_id='' 
  HTTP HEADERS  (Show)
  SESSION DATA  (Show)
  CONFIG VARIABLES  (Show)