12. September 2024
3
minutter lesetid

SpotOn automatiserte bonusprogrammet og økte salget med 20%

André Swensen
Daglig Leder i SpotOn

SpotOn er eid av Elektroimportøren, og selger ferdig monterte tjenester innenfor elektro. De ønsker å gjøre en tidvis lite transparent bransje mer forutsigbar og enkel å forholde seg til for kundene, samtidig som de leverer tjenester av høy kvalitet. 

SpotOn har samarbeidsavtaler som incentiverer over 500 selgere til å videreselge tjenester fra deres produktportefølje. For å øke salget gjennom partnere bestemte de seg for å lage en intern oversikt der selgere kan se bonusen de har opparbeidet seg. Ved opparbeidelse av tilstrekkelig bonuspoeng ønsket de å gi selgere mulighet til å innløse poengene i et gavekort. 

André Swensen er daglig leder i SpotOn, og forklarer at det primært var to ting de så etter: 

“Vi ønsket et automatisert system der vi ikke trengte å sende ut gavekortene manuelt. Det ville vært unødvendig tidkrevende for oss. I tillegg ønsket vi et incentiv som var attraktivt for absolutt alle. Det er helt nødvendig for at et bonusprogram skal fungere.”, sier han.

Vi ønsket et incentiv som var attraktivt for absolutt alle.

Integrert på et par timer

André hørte om Glede fra en venn, og etter at han leste på nettsiden tenkte at det virket lovende. Han fikk deretter satt opp et møte med Glede-teamet.

“Jeg skjønte tidlig at dette ville være en god løsning for oss. Glede hadde all funksjonen vi trengte i deres API, og dokumentasjonen var enkel å forstå. I tillegg var det fint at vi kunne designe gaven med SpotOn sine farger og logo.”, forteller André.

Det var plug and play. Utvikleren vår brukte et par timer å implementere og teste API-integrasjonen.

Et enkelt bonusprogram

André forteller litt om hvordan programmet er satt opp. 

“Selgere opparbeider seg bonus basert på hvor mye de selger. Til enhver tid kan de se hvor mange poeng de har i en intern oversikt. Når de oppnår 500 kr i opparbeidet bonus kan de utløse det i et Glede-gavekort som belønning. Det skjer helt automatisk når de klikker på en knapp inne i systemet.”

Han forteller hva han setter pris på med Glede: 

20% økt salg gjennom partnerskap

André har fulgt med på hvordan videresalg av tjenester har utviklet seg siden oppstart av programmet i mars. Resultatet er 20% økt salg gjennom partneravtaler, og mer enn 250 selgere har begynt å opparbeide seg bonuspoeng.

“Programmet har vært en stor suksess for oss så langt! Vi har målt en 20% økning i salg gjennom partnere etter oppstart av bonusprogrammet. I tillegg har programmet fått mye positiv omtale i vårt interne workspace.”

En av selgerene våre har allerede tatt ut 8 gavekort i bonus.

André trekker frem at han er utrolig fornøyd med hvor enkelt det har vært å sette opp og administrere programmet, samtidig som selgere får en belønning som de faktisk ønsker seg.

Vi ønsket et enkelt bonusprogram. Selg, trykk og få gavekortet. Så enkelt er det.

Kontakt oss

Tusen takk! Vi har mottatt din henvendelse, og vil svare deg i løpet av én arbeidsdag 😊
Uups! Noe gikk galt, og meldingen ble ikke sendt. Prøv igjen, eller ta kontakt med oss på e-post: support@glede.app

Kom i gang med Glede

Gi gavekortet som kan brukes overalt — i butikk og på nett!

(function () { const DEBUG = false; const log = (...a) => DEBUG && console.log('[weglot-ui]', ...a); const normalize = (code) => { if (!code) return ''; code = String(code).toLowerCase(); if (code.includes('-')) code = code.split('-')[0]; // en-US -> en if (code === 'nb') code = 'no'; // Bokmål -> 'no' if (code === 'se') code = 'sv'; // common slip return code; }; // We cache a template per language so we can rebuild the list let TEMPLATES = { inner: {}, outer: {} }; function cacheTemplates(wrapper) { // Grab any [lang] blocks (from toggle OR list) and store inner/outer wrapper.querySelectorAll('[lang]').forEach(el => { const lang = normalize(el.getAttribute('lang')); if (!lang) return; if (!TEMPLATES.inner[lang]) TEMPLATES.inner[lang] = el.innerHTML; if (!TEMPLATES.outer[lang]) TEMPLATES.outer[lang] = el.outerHTML; }); log('cached templates', TEMPLATES); } function updateSwitcher(currentLang) { currentLang = normalize(currentLang); const wrappers = document.querySelectorAll('.wg-element-wrapper.sw6'); if (wrappers.length === 0) { log('no wrappers'); return; } else { wrappers.forEach(wrapper => { const toggle = wrapper.querySelector('.wg-dropdown-toggle'); const list = wrapper.querySelector('.wg-dd-1-list'); if (!toggle || !list) { log('missing toggle/list'); return; } // Ensure templates are cached (first run on this page load) if (!TEMPLATES.inner.no || !TEMPLATES.inner.sv || !TEMPLATES.inner.en) { cacheTemplates(wrapper); } // If any template still missing, bail (structure not as expected) if (!TEMPLATES.inner.no || !TEMPLATES.inner.sv || !TEMPLATES.inner.en) { log('incomplete templates'); return; } // 1) Set TOGGLE visual (attribute + optional state class + content) toggle.setAttribute('lang', currentLang); toggle.classList.remove('is-no','is-sv','is-en'); toggle.classList.add(`is-${currentLang}`); toggle.innerHTML = TEMPLATES.inner[currentLang]; // 2) Rebuild LIST to contain ONLY the two other languages (fresh each time) const ALL = ['no','sv','en']; const others = ALL.filter(l => l !== currentLang); // Build a clean list using the captured OUTER html so structure/classes match const htmlA = TEMPLATES.outer[others[0]]; const htmlB = TEMPLATES.outer[others[1]]; // Clear and insert exactly two items list.innerHTML = ''; // Insert via range to keep outerHTML intact const r1 = document.createRange(); r1.selectNode(list); list.appendChild(r1.createContextualFragment(htmlA)); const r2 = document.createRange(); r2.selectNode(list); list.appendChild(r2.createContextualFragment(htmlB)); // Optional: normalize classes on list items too list.querySelectorAll('[lang]').forEach(el => { const l = normalize(el.getAttribute('lang')); el.classList.remove('is-no','is-sv','is-en'); el.classList.add(`is-${l}`); }); log('updated → current:', currentLang, 'others:', others); } ) } } // Event delegation (survives DOM swaps) document.addEventListener('click', function (e) { const link = e.target.closest('.wg-element-wrapper.sw6 [lang]'); if (!link) return; e.preventDefault(); const lang = normalize(link.getAttribute('lang')); // Trigger Weglot switch (subdomain setups will reload; path setups will not) document.cookie = "glede_locale=" + lang + "; path=/; domain=.glede.app; max-age=31536000"; Weglot.switchTo(lang); // Do NOT call update here for subdomain setups; page will reload anyway. }); // Run AFTER Weglot has rendered (important on subdomain reload) function runAfterWeglotReady() { const run = () => { const lang = normalize(Weglot.getCurrentLang()); // Wait one frame to let Weglot paint its switcher nodes requestAnimationFrame(() => updateSwitcher(lang)); }; Weglot.on('initialized', run); // If already initialized (script included late), run immediately if (Weglot.getCurrentLang && Weglot.getCurrentLang()) run(); // For path-based projects (no reload), update visuals after change Weglot.on('languageChanged', (newLang) => { updateSwitcher(newLang) }); } // Boot when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', runAfterWeglotReady); } else { runAfterWeglotReady(); } })();