Know about a role?
Get paid for it.
Refer a Digital Marketing or Technical hiring opportunity in Australia. If Big Wave Digital fills it, you earn 10% of the placement fee (ex GST), paid only after probation is successfully completed and our fee is received.
29 years specialist recruitment
Digital Marketing, AI & Tech
Trusted Australia-wide


















Three steps. That’s it.
You refer
Submit the opportunity details and the hiring manager’s contact information. You can refer one role or several at once.
We engage and fill
Big Wave Digital reaches out, qualifies the opportunity, and works to place the right candidate.
You earn
Once the candidate completes probation and our fee is received, you get 10% of the placement fee (ex GST) per role.
Your network is worth more than you think
A single introduction could earn you thousands
See what your referral is worth
Adjust the base salary and fee percentage below. The calculator shows your estimated reward in real time.
Reward Calculator
All figures in AUD
Rewarding trusted introducers
Explorer
For first-time and occasional referrers
Connector
Priority review and faster updates
Insider
Direct access to a senior consultant and pre-qualification support
Tier recognition is discretionary and based on referral quality, eligibility, and whether Big Wave Digital had an existing active engagement for the opportunity. Tiering is not guaranteed and may change at any time.
Australia’s elite AI, Digital Marketing and Tech recruiters
Recognised for 29 years of bespoke recruitment
Eligible roles
Technical
- Engineering (frontend, backend, full stack)
- Data and analytics
- Artificial intelligence and machine learning
- Cloud and infrastructure
- Security and DevSecOps
- Product and technical leadership
Digital Marketing
- Performance marketing (paid media, SEM)
- SEO and organic growth
- Growth and acquisition
- Content and editorial
- CRM, marketing automation, lifecycle
- Digital analytics and insights
Refer a role
Know about one role or several? Add as many as you like below. We’ll review your referral within 2 business days.
Referral received. Thank you.
We’ll review your referral within 2 business days. If the opportunity is eligible and we engage it successfully, we’ll keep you updated. Rewards are paid only after probation is successfully completed and once our fee is received.
Common questions
// ============================================= // CALCULATOR // ============================================= const fmt = new Intl.NumberFormat('en-AU', { style: 'currency', currency: 'AUD', maximumFractionDigits: 0 }); const salarySlider = document.getElementById('calcSalary'); const salaryDisplay = document.getElementById('calcSalaryDisplay'); const feeSelect = document.getElementById('calcFee'); const superInput = document.getElementById('calcSuper');
function updateCalc() { const baseSalary = parseInt(salarySlider.value, 10); const feePercent = parseInt(feeSelect.value, 10); const superRate = parseFloat(superInput.value) || 0; const superAmount = baseSalary * (superRate / 100); const packageTotal = baseSalary + superAmount; const recruitmentFee = packageTotal * (feePercent / 100); const gst = recruitmentFee * 0.10; const totalInvoice = recruitmentFee + gst; const referralReward = recruitmentFee * 0.10; salaryDisplay.textContent = fmt.format(baseSalary); document.getElementById('outBase').textContent = fmt.format(baseSalary); document.getElementById('outSuperRate').textContent = superRate; document.getElementById('outSuper').textContent = fmt.format(Math.round(superAmount)); document.getElementById('outPackage').textContent = fmt.format(Math.round(packageTotal)); document.getElementById('outFeeRate').textContent = feePercent; document.getElementById('outFee').textContent = fmt.format(Math.round(recruitmentFee)); document.getElementById('outGST').textContent = fmt.format(Math.round(gst)); document.getElementById('outInvoice').textContent = fmt.format(Math.round(totalInvoice)); document.getElementById('outReward').textContent = fmt.format(Math.round(referralReward)); } salarySlider.addEventListener('input', updateCalc); feeSelect.addEventListener('change', updateCalc); superInput.addEventListener('input', updateCalc); updateCalc();
// ============================================= // MULTI-ROLE: Add / Remove role blocks // ============================================= let roleCount = 1; const rolesContainer = document.getElementById('rolesContainer'); const addRoleBtn = document.getElementById('addRoleBtn');
addRoleBtn.addEventListener('click', () => { roleCount++; const idx = roleCount; const block = document.createElement('div'); block.className = 'role-block'; block.dataset.roleIndex = idx; block.innerHTML = `
`;
rolesContainer.appendChild(block); block.querySelector('.form-input').focus(); renumberRoles();
// Remove handler block.querySelector('.role-block__remove').addEventListener('click', () => { block.remove(); renumberRoles(); });
// Add blur validation to new fields block.querySelectorAll('input, select').forEach(field => { field.addEventListener('blur', () => validateSingleField(field)); field.addEventListener('input', () => { if (field.classList.contains('error')) validateSingleField(field); }); }); });
function renumberRoles() { const blocks = rolesContainer.querySelectorAll('.role-block'); blocks.forEach((block, i) => { const num = i + 1; const label = block.querySelector('.role-block__label'); if (label) label.innerHTML = `${num} Role details`; // Hide remove button on first role const removeBtn = block.querySelector('.role-block__remove'); if (removeBtn) removeBtn.style.display = num === 1 ? 'none' : ''; }); } renumberRoles();
// ============================================= // FAQ ACCORDION // ============================================= document.querySelectorAll('.faq-question').forEach(btn => { btn.addEventListener('click', () => { const item = btn.parentElement; const answer = item.querySelector('.faq-answer'); const isOpen = item.classList.contains('open'); document.querySelectorAll('.faq-item.open').forEach(openItem => { openItem.classList.remove('open'); openItem.querySelector('.faq-question').setAttribute('aria-expanded', 'false'); openItem.querySelector('.faq-answer').style.maxHeight = '0'; }); if (!isOpen) { item.classList.add('open'); btn.setAttribute('aria-expanded', 'true'); answer.style.maxHeight = answer.scrollHeight + 'px'; } }); });
// ============================================= // FORM VALIDATION // ============================================= const form = document.getElementById('referForm'); const submitBtn = document.getElementById('submitBtn');
function validateSingleField(field) { const name = field.name || ''; const val = field.value; const errorEl = field.closest('.form-field')?.querySelector('.form-error'); let isValid = true;
if (field.required && field.tagName === 'SELECT' && !val) isValid = false; else if (field.required && field.type === 'email' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(val)) isValid = false; else if (field.required && field.type === 'text' && val.trim().length < (parseInt(field.minLength) || 1)) isValid = false; else if (name.startsWith('estSalary') && val && (parseInt(val) < 60000 || parseInt(val) > 500000)) isValid = false;
if (isValid) { field.classList.remove('error'); if (errorEl) errorEl.classList.remove('visible'); } else { field.classList.add('error'); if (errorEl) errorEl.classList.add('visible'); } return isValid; }
// Validate on blur for initial fields form.querySelectorAll('input:not([type="hidden"]):not([type="radio"]):not([type="checkbox"]):not(#honeypot), select, textarea').forEach(field => { field.addEventListener('blur', () => validateSingleField(field)); field.addEventListener('input', () => { if (field.classList.contains('error')) validateSingleField(field); }); });
form.addEventListener('submit', (e) => { e.preventDefault(); if (document.getElementById('honeypot').value) return;
let isValid = true; let firstInvalid = null;
// Validate all visible fields form.querySelectorAll('input:not([type="hidden"]):not([type="radio"]):not([type="checkbox"]):not(#honeypot), select').forEach(field => { if (!validateSingleField(field)) { isValid = false; if (!firstInvalid) firstInvalid = field; } });
// Validate radio const howKnow = form.querySelector('input[name="howKnow"]:checked'); const howKnowError = document.getElementById('howKnowError'); if (!howKnow) { isValid = false; if (howKnowError) howKnowError.classList.add('visible'); if (!firstInvalid) firstInvalid = form.querySelector('input[name="howKnow"]'); } else { if (howKnowError) howKnowError.classList.remove('visible'); }
// Validate consent const consent = document.getElementById('consent'); const consentError = document.getElementById('consentError'); if (!consent.checked) { isValid = false; if (consentError) consentError.classList.add('visible'); if (!firstInvalid) firstInvalid = consent; } else { if (consentError) consentError.classList.remove('visible'); }
if (!isValid) { if (firstInvalid) firstInvalid.focus(); return; }
// Collect data for all roles const data = new FormData(form); const entries = Object.fromEntries(data.entries()); const roleBlocks = rolesContainer.querySelectorAll('.role-block'); let rolesText = '';
roleBlocks.forEach((block, i) => { const idx = i + 1; rolesText += `\nROLE ${idx}\n`; rolesText += `Role Family: ${entries['roleFamily_' + block.dataset.roleIndex] || ''}\n`; rolesText += `Job Title: ${entries['jobTitle_' + block.dataset.roleIndex] || ''}\n`; rolesText += `Company: ${entries['companyName_' + block.dataset.roleIndex] || ''}\n`; rolesText += `Location: ${entries['location_' + block.dataset.roleIndex] || ''}\n`; const sal = entries['estSalary_' + block.dataset.roleIndex]; rolesText += `Est. Salary: ${sal ? '$' + parseInt(sal).toLocaleString('en-AU') : 'Not provided'}\n`; rolesText += `HM Name: ${entries['hmName_' + block.dataset.roleIndex] || ''}\n`; rolesText += `HM Email: ${entries['hmEmail_' + block.dataset.roleIndex] || ''}\n`; rolesText += `HM Phone: ${entries['hmPhone_' + block.dataset.roleIndex] || 'Not provided'}\n`; });
const subject = encodeURIComponent(`New Refer a Role Submission (${roleBlocks.length} role${roleBlocks.length > 1 ? 's' : ''})`); const body = encodeURIComponent( 'NEW REFERRAL SUBMISSION\n========================\n\n' + 'REFERRER DETAILS\n' + 'Name: ' + entries.fullName + '\n' + 'Email: ' + entries.email + '\n' + 'Mobile: ' + (entries.mobile || 'Not provided') + '\n' + 'LinkedIn: ' + (entries.linkedin || 'Not provided') + '\n\n' + 'REFERRED ROLES (' + roleBlocks.length + ')' + rolesText + '\n' + 'CONTEXT\nHow they know: ' + (entries.howKnow || '') + '\n' + 'Notes: ' + (entries.notes || 'None') + '\n\n' + 'Submitted: ' + new Date().toLocaleString('en-AU', { dateStyle: 'full', timeStyle: 'short' }) );
window.location.href = 'mailto:keiran@bigwavedigital.com.au?subject=' + subject + '&body=' + body;
submitBtn.textContent = 'Submitting...'; submitBtn.disabled = true; setTimeout(() => { form.style.display = 'none'; document.getElementById('formSuccess').classList.add('visible'); }, 800); });
// ============================================= // SUBNAV ACTIVE STATE // ============================================= const navLinks = document.querySelectorAll('.subnav a'); const pageSections = document.querySelectorAll('section[id]'); const sectionObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { navLinks.forEach(link => link.classList.toggle('active', link.getAttribute('href') === '#' + entry.target.id)); } }); }, { rootMargin: '-30% 0px -60% 0px' }); pageSections.forEach(section => sectionObserver.observe(section));
// ============================================= // ANALYTICS STUBS // ============================================= function trackEvent(name, params) { if (typeof gtag === 'function') gtag('event', name, params || {}); } document.querySelectorAll('.hero__ctas a').forEach(btn => { btn.addEventListener('click', () => trackEvent('refer_a_role_cta_click', { label: btn.textContent.trim() })); }); const calcObs = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { trackEvent('calculator_view'); calcObs.unobserve(entry.target); }}); }, { threshold: 0.3 }); calcObs.observe(document.getElementById('calculator')); let calcDb; [salarySlider, feeSelect, superInput].forEach(el => { el.addEventListener('input', () => { clearTimeout(calcDb); calcDb = setTimeout(() => trackEvent('calculator_input_change', { field: el.id }), 500); }); }); let formStarted = false; form.addEventListener('focusin', () => { if (!formStarted) { formStarted = true; trackEvent('form_start'); } });

