WINGCODE • PROFILER

Bygg framtidens säljteam
med AI‑drivna Wingcode‑profiler.

Se hur varje medarbetare utvecklas i realtid. Wingcode kopplar ihop träning, poäng och progress till en levande AI‑profil som gör det omöjligt att inte växa – varje dag.

+37%snabbare ramp‑up på nya säljare*
24/7AI‑driven feedback & träning
1 vyför alla profiler och team
Gå till ditt team Eller logga in som individ via “Logga in” uppe till höger.
function wcHandleLogin(e){ e.preventDefault(); const usernameInput = document.getElementById("wc-login-username"); const passwordInput = document.getElementById("wc-login-password"); const errorBox = document.getElementById("wc-login-error"); const username = (usernameInput.value || "").trim(); const password = (passwordInput.value || "").trim(); const validPassword = "Wingman123"; let targetUrl = null; if(password === validPassword){ if(username === "BosseAI"){ targetUrl = "https://wingcode-vw-profiler.carrd.co/#bosse"; }else if(username === "Ture"){ targetUrl = "https://wingcode-vw-profiler.carrd.co/#ture"; }else if(username === "Henrik"){ targetUrl = "https://wingcode-vw-profiler.carrd.co/#henrik"; } } if(targetUrl){ errorBox.style.display = "none"; window.location.href = targetUrl; }else{ errorBox.style.display = "block"; } return false; }

Varmt välkommen din Wingcode profil Ture!

Wingcode

Träna separat

Första kundkontakt0/9
Behovsanalys0/9
Offert0/9
Avslut0/9
Prisförhandling0/9
T

Ture

Sales performance • AI tracking
Poäng0
Nivå1
const storageKey_ture = "wingdata_ture"; const levelXP_ture = [ 0,1000,2500,3800,5000,6250,7500,10000,15000,22500, 30000,38750,48750,60000,75000,93000,112500,122500, 145000,175000,200000,220000,230000,245000,260000, 275000,285000,298000,310000 ]; const botXP_ture = { Gustav:1000, Elin:1000, Magnus:2500, Jacob:2500, Ingrid:5000, Johan:5000, Patrik:10000 }; // Koder per steg const trainingCodes_ture = { 1010:{step:"kontakt",xp:1000}, 2356:{step:"behov",xp:1000}, 4545:{step:"offert",xp:1000}, 6767:{step:"avslut",xp:1000}, 8989:{step:"pris",xp:1000} }; let data_ture = JSON.parse(localStorage.getItem(storageKey_ture)) || { xp:0, progress:{kontakt:0,behov:0,offert:0,avslut:0,pris:0} }; let xp_ture = data_ture.xp; let progress_ture = data_ture.progress; function save_ture(){ localStorage.setItem(storageKey_ture, JSON.stringify({xp: xp_ture, progress: progress_ture})); } function getLevel_ture(){ for(let i = levelXP_ture.length-1; i >= 0; i--){ if(xp_ture >= levelXP_ture[i]) return i+1; } return 1; } function updateProfile_ture(){ let level = getLevel_ture(); document.getElementById("xp_ture").innerText = xp_ture; document.getElementById("level_ture").innerText = level; let nextXP = levelXP_ture[level] || levelXP_ture[levelXP_ture.length-1]; let percent = (xp_ture - levelXP_ture[level-1]) / (nextXP - levelXP_ture[level-1]); if(percent < 0) percent = 0; if(percent > 1) percent = 1; document.getElementById("xpBar_ture").style.width = (percent*100) + "%"; } function checkWing_ture(){ let bot = document.getElementById("wingBot_ture").value; if(!bot) return; xp_ture += botXP_ture[bot] || 0; updateProfile_ture(); save_ture(); document.getElementById("wingMsg_ture").innerText = "Rätt kod!"; } function checkTrain_ture(){ let code = document.getElementById("trainCode_ture").value; if(trainingCodes_ture[code]){ let d = trainingCodes_ture[code]; xp_ture += d.xp; progress_ture[d.step]++; updateBars_ture(); updateProfile_ture(); save_ture(); document.getElementById("trainMsg_ture").innerText = "Rätt kod!"; } else { document.getElementById("trainMsg_ture").innerText = "Fel kod"; } } function updateBars_ture(){ document.getElementById("p1_ture").style.width = (progress_ture.kontakt/9*100) + "%"; document.getElementById("p2_ture").style.width = (progress_ture.behov/9*100) + "%"; document.getElementById("p3_ture").style.width = (progress_ture.offert/9*100) + "%"; document.getElementById("p4_ture").style.width = (progress_ture.avslut/9*100) + "%"; document.getElementById("p5_ture").style.width = (progress_ture.pris/9*100) + "%"; document.getElementById("c1_ture").innerText = progress_ture.kontakt; document.getElementById("c2_ture").innerText = progress_ture.behov; document.getElementById("c3_ture").innerText = progress_ture.offert; document.getElementById("c4_ture").innerText = progress_ture.avslut; document.getElementById("c5_ture").innerText = progress_ture.pris; } updateProfile_ture(); updateBars_ture();

Varmt välkommen din Wingcode profil Bosse!

Wingcode

Träna separat

Första kundkontakt0/9
Behovsanalys0/9
Offert0/9
Avslut0/9
Prisförhandling0/9
B

Bosse

Sales performance • AI tracking
Poäng0
Nivå1
const storageKey_bosse = "wingdata_bosse"; const levelXP_bosse = [ 0,1000,2500,3800,5000,6250,7500,10000,15000,22500, 30000,38750,48750,60000,75000,93000,112500,122500, 145000,175000,200000,220000,230000,245000,260000, 275000,285000,298000,310000 ]; const botXP_bosse = { Gustav:1000, Elin:1000, Magnus:2500, Jacob:2500, Ingrid:5000, Johan:5000, Patrik:10000 }; const trainingCodes_bosse = { 1010:{step:"kontakt",xp:1000}, 2356:{step:"behov",xp:1000}, 4545:{step:"offert",xp:1000}, 6767:{step:"avslut",xp:1000}, 8989:{step:"pris",xp:1000} }; let data_bosse = JSON.parse(localStorage.getItem(storageKey_bosse)) || { xp:0, progress:{kontakt:0,behov:0,offert:0,avslut:0,pris:0} }; let xp_bosse = data_bosse.xp; let progress_bosse = data_bosse.progress; function save_bosse(){ localStorage.setItem(storageKey_bosse, JSON.stringify({xp: xp_bosse, progress: progress_bosse})); } function getLevel_bosse(){ for(let i = levelXP_bosse.length-1; i >= 0; i--){ if(xp_bosse >= levelXP_bosse[i]) return i+1; } return 1; } function updateProfile_bosse(){ let level = getLevel_bosse(); document.getElementById("xp_bosse").innerText = xp_bosse; document.getElementById("level_bosse").innerText = level; let nextXP = levelXP_bosse[level] || levelXP_bosse[levelXP_bosse.length-1]; let percent = (xp_bosse - levelXP_bosse[level-1]) / (nextXP - levelXP_bosse[level-1]); if(percent < 0) percent = 0; if(percent > 1) percent = 1; document.getElementById("xpBar_bosse").style.width = (percent*100) + "%"; } function checkWing_bosse(){ let bot = document.getElementById("wingBot_bosse").value; if(!bot) return; xp_bosse += botXP_bosse[bot] || 0; updateProfile_bosse(); save_bosse(); document.getElementById("wingMsg_bosse").innerText = "Rätt kod!"; } function checkTrain_bosse(){ let code = document.getElementById("trainCode_bosse").value; if(trainingCodes_bosse[code]){ let d = trainingCodes_bosse[code]; xp_bosse += d.xp; progress_bosse[d.step]++; updateBars_bosse(); updateProfile_bosse(); save_bosse(); document.getElementById("trainMsg_bosse").innerText = "Rätt kod!"; } else { document.getElementById("trainMsg_bosse").innerText = "Fel kod"; } } function updateBars_bosse(){ document.getElementById("p1_bosse").style.width = (progress_bosse.kontakt/9*100) + "%"; document.getElementById("p2_bosse").style.width = (progress_bosse.behov/9*100) + "%"; document.getElementById("p3_bosse").style.width = (progress_bosse.offert/9*100) + "%"; document.getElementById("p4_bosse").style.width = (progress_bosse.avslut/9*100) + "%"; document.getElementById("p5_bosse").style.width = (progress_bosse.pris/9*100) + "%"; document.getElementById("c1_bosse").innerText = progress_bosse.kontakt; document.getElementById("c2_bosse").innerText = progress_bosse.behov; document.getElementById("c3_bosse").innerText = progress_bosse.offert; document.getElementById("c4_bosse").innerText = progress_bosse.avslut; document.getElementById("c5_bosse").innerText = progress_bosse.pris; } updateProfile_bosse(); updateBars_bosse();

Varmt välkommen din Wingcode profil Henrik!

Wingcode

Träna separat

Första kundkontakt0/9
Behovsanalys0/9
Offert0/9
Avslut0/9
Prisförhandling0/9
H

Henrik

Sales performance • AI tracking
Poäng0
Nivå1
const storageKey_henrik = "wingdata_henrik"; const levelXP_henrik = [ 0,1000,2500,3800,5000,6250,7500,10000,15000,22500, 30000,38750,48750,60000,75000,93000,112500,122500, 145000,175000,200000,220000,230000,245000,260000, 275000,285000,298000,310000 ]; const botXP_henrik = { Gustav:1000, Elin:1000, Magnus:2500, Jacob:2500, Ingrid:5000, Johan:5000, Patrik:10000 }; // Samma koder som övriga profiler const trainingCodes_henrik = { 1010:{step:"kontakt",xp:1000}, 2356:{step:"behov",xp:1000}, 4545:{step:"offert",xp:1000}, 6767:{step:"avslut",xp:1000}, 8989:{step:"pris",xp:1000} }; let data_henrik = JSON.parse(localStorage.getItem(storageKey_henrik)) || { xp:0, progress:{kontakt:0,behov:0,offert:0,avslut:0,pris:0} }; let xp_henrik = data_henrik.xp; let progress_henrik = data_henrik.progress; function save_henrik(){ localStorage.setItem(storageKey_henrik, JSON.stringify({ xp: xp_henrik, progress: progress_henrik })); } function getLevel_henrik(){ for(let i = levelXP_henrik.length-1; i >= 0; i--){ if(xp_henrik >= levelXP_henrik[i]) return i+1; } return 1; } function updateProfile_henrik(){ let level = getLevel_henrik(); document.getElementById("xp_henrik").innerText = xp_henrik; document.getElementById("level_henrik").innerText = level; let nextXP = levelXP_henrik[level] || levelXP_henrik[levelXP_henrik.length-1]; let percent = (xp_henrik - levelXP_henrik[level-1]) / (nextXP - levelXP_henrik[level-1]); if(percent < 0) percent = 0; if(percent > 1) percent = 1; document.getElementById("xpBar_henrik").style.width = (percent*100) + "%"; } function checkWing_henrik(){ let bot = document.getElementById("wingBot_henrik").value; if(!bot) return; xp_henrik += botXP_henrik[bot] || 0; updateProfile_henrik(); save_henrik(); document.getElementById("wingMsg_henrik").innerText = "Rätt kod!"; } function checkTrain_henrik(){ let code = document.getElementById("trainCode_henrik").value; if(trainingCodes_henrik[code]){ let d = trainingCodes_henrik[code]; xp_henrik += d.xp; progress_henrik[d.step]++; updateBars_henrik(); updateProfile_henrik(); save_henrik(); document.getElementById("trainMsg_henrik").innerText = "Rätt kod!"; } else { document.getElementById("trainMsg_henrik").innerText = "Fel kod"; } } function updateBars_henrik(){ document.getElementById("p1_henrik").style.width = (progress_henrik.kontakt/9*100) + "%"; document.getElementById("p2_henrik").style.width = (progress_henrik.behov/9*100) + "%"; document.getElementById("p3_henrik").style.width = (progress_henrik.offert/9*100) + "%"; document.getElementById("p4_henrik").style.width = (progress_henrik.avslut/9*100) + "%"; document.getElementById("p5_henrik").style.width = (progress_henrik.pris/9*100) + "%"; document.getElementById("c1_henrik").innerText = progress_henrik.kontakt; document.getElementById("c2_henrik").innerText = progress_henrik.behov; document.getElementById("c3_henrik").innerText = progress_henrik.offert; document.getElementById("c4_henrik").innerText = progress_henrik.avslut; document.getElementById("c5_henrik").innerText = progress_henrik.pris; } updateProfile_henrik(); updateBars_henrik();

Teamets försäljningsresa

Samlad vy över hur långt Ture, Bosse och Henrik kommit i Wingcode‑spelet. Varje hjul visar teamets totala progress i respektive steg, och under ser du varje personlig profil.

LIVE • WINGCODE PROGRESS
0%
Första kundkontakt
0/27 genomförda
0%
Behovsanalys
0/27 genomförda
0%
Offert
0/27 genomförda
0%
Avslut
0/27 genomförda
0%
Prisförhandling
0/27 genomförda
T
Ture
Wingcode‑profil
Nivå 1XP 0
B
Bosse
Wingcode‑profil
Nivå 1XP 0
H
Henrik
Wingcode‑profil
Nivå 1XP 0
// --- Hjälpfunktioner för att läsa samma data som profilerna använder --- function wcLoadProfile(key){ try{ const raw = localStorage.getItem(key); if(!raw) return null; return JSON.parse(raw); }catch(e){ return null; } } function wcSafeProgress(obj){ return { kontakt: obj?.progress?.kontakt || 0, behov: obj?.progress?.behov || 0, offert: obj?.progress?.offert || 0, avslut: obj?.progress?.avslut || 0, pris: obj?.progress?.pris || 0 }; } // Samma level‑tabell som profilerna const wcLevelXP = [ 0,1000,2500,3800,5000,6250,7500,10000,15000,22500, 30000,38750,48750,60000,75000,93000,112500,122500, 145000,175000,200000,220000,230000,245000,260000, 275000,285000,298000,310000 ]; function wcGetLevel(xp){ for(let i = wcLevelXP.length - 1; i >= 0; i--){ if(xp >= wcLevelXP[i]) return i + 1; } return 1; } function wcXPPercent(xp){ const level = wcGetLevel(xp); const nextXP = wcLevelXP[level] || wcLevelXP[wcLevelXP.length - 1]; const baseXP = wcLevelXP[level - 1] || 0; if(nextXP === baseXP) return 0; let p = (xp - baseXP) / (nextXP - baseXP); if(p < 0) p = 0; if(p > 1) p = 1; return Math.round(p * 100); } // --- Rita hjul --- function wcUpdateWheel(idBase, count, max){ const percent = max > 0 ? Math.round((count / max) * 100) : 0; const wheel = document.getElementById("wc-wheel-" + idBase); const pSpan = document.getElementById("wc-wheel-" + idBase + "-percent"); const cSpan = document.getElementById("wc-wheel-" + idBase + "-count"); if(wheel){ wheel.style.background = "conic-gradient(#ff6a00 0deg " + (3.6 * percent) + "deg, #0f172a " + (3.6 * percent) + "deg 360deg)"; } if(pSpan) pSpan.textContent = percent; if(cSpan) cSpan.textContent = count; } // --- Initiera vy --- (function wcInitTeamDashboard(){ const tureData = wcLoadProfile("wingdata_ture") || {xp:0,progress:{}}; const bosseData = wcLoadProfile("wingdata_bosse") || {xp:0,progress:{}}; const henrikData = wcLoadProfile("wingdata_henrik") || {xp:0,progress:{}}; const ture = wcSafeProgress(tureData); const bosse = wcSafeProgress(bosseData); const henrik = wcSafeProgress(henrikData); // Summera steg (hjulen) const kontaktTotal = ture.kontakt + bosse.kontakt + henrik.kontakt; const behovTotal = ture.behov + bosse.behov + henrik.behov; const offertTotal = ture.offert + bosse.offert + henrik.offert; const avslutTotal = ture.avslut + bosse.avslut + henrik.avslut; const prisTotal = ture.pris + bosse.pris + henrik.pris; const maxPerStep = 27; // 3 profiler × 9 pass wcUpdateWheel("kontakt", kontaktTotal, maxPerStep); wcUpdateWheel("behov", behovTotal, maxPerStep); wcUpdateWheel("offert", offertTotal, maxPerStep); wcUpdateWheel("avslut", avslutTotal, maxPerStep); wcUpdateWheel("pris", prisTotal, maxPerStep); // Profiler – level + XP + XP‑bar const profiles = [ {key:"ture", data:tureData}, {key:"bosse", data:bosseData}, {key:"henrik", data:henrikData} ]; profiles.forEach(p=>{ const xp = p.data.xp || 0; const level = wcGetLevel(xp); const xpPct = wcXPPercent(xp); const lvlSpan = document.getElementById("wc-prof-" + p.key + "-level"); const xpSpan = document.getElementById("wc-prof-" + p.key + "-xp"); const bar = document.getElementById("wc-prof-" + p.key + "-xpbar"); if(lvlSpan) lvlSpan.textContent = level; if(xpSpan) xpSpan.textContent = xp; if(bar) bar.style.width = xpPct + "%"; }); })();
Vapi Chat Widget
function wcHandleManagerLogin(e){ e.preventDefault(); const usernameInput = document.getElementById("wc-login-username-chef"); const passwordInput = document.getElementById("wc-login-password-chef"); const errorBox = document.getElementById("wc-login-error-chef"); const username = (usernameInput.value || "").trim(); const password = (passwordInput.value || "").trim(); const validUser = "Fredrik Barkman"; const validPassword = "Barko0510"; const targetUrl = "https://wingcode-vw-profiler.carrd.co/#team-vy"; if(username === validUser && password === validPassword){ errorBox.style.display = "none"; window.location.href = targetUrl; }else{ errorBox.style.display = "block"; } return false; }