Wealth Roadmap — Client Fact Finder
Wealth Roadmap — client fact-finder form
Step 1 of 6 — Personal Details 0% complete
Personal
Income & Expenses
Goals
Investments
Loans
Insurance
Indian address
Overseas address (if applicable)
Almost there — one click to submit! Clicking the button below will send your details to our team and download a copy as Excel for your records.
Your answers go to our team instantly
All sections are emailed directly to ramalingam@holisticinvestment.in — no app opens, nothing extra to do.
Your Excel copy downloads automatically
A filled WealthRoadmap_FactFinder.xlsx saves to your device — keep it and email it to us along with your KYC documents.
Send KYC documents to complete onboarding
Submit & download my fact-finder
Back Step 1 of 6 Next
function renderFamilyMembers(){
const c=document.getElementById('familyCards');
const members=window._family||[];
if(!members.length){c.innerHTML='
No family members added yet.
';return;}
c.innerHTML=members.map((m,i)=>`
`).join('');
}
window._family=[];
function addFamilyMember(){window._family.push({name:'',rel:'',dob:'',occ:''});renderFamilyMembers();}
renderFamilyMembers();
window._goals=[];
function renderGoals(){
const c=document.getElementById('goalCards');
if(!window._goals.length){c.innerHTML='
No goals added yet. Start with retirement above, then add more below.
';return;}
c.innerHTML=window._goals.map((g,i)=>`
`).join('');
}
renderGoals();
function addGoal(){window._goals.push({name:'',year:'',amt:'',inf:'',loan:'no',loanpct:''});renderGoals();}
function addNominee(){
const tb=document.querySelector('#nomineeTable tbody');
const tr=document.createElement('tr');
tr.innerHTML='
';
tb.appendChild(tr);
}
function addRow(tableId,headers){
const tb=document.querySelector('#'+tableId+' tbody');
const tr=document.createElement('tr');
tr.innerHTML=headers.map(h=>`
`).join('');
tb.appendChild(tr);
}
function addFD(){
const tb=document.querySelector('#fdTable tbody');
const tr=document.createElement('tr');
tr.innerHTML=`
`;
tb.appendChild(tr);
}
function addMF(){
const tb=document.querySelector('#mfTable tbody');
const tr=document.createElement('tr');
tr.innerHTML=`
`;
tb.appendChild(tr);
}
function addLifeIns(){
const tb=document.querySelector('#lifeInsTable tbody');
const tr=document.createElement('tr');
tr.innerHTML=`
`;
tb.appendChild(tr);
}
function addHealthIns(){
const tb=document.querySelector('#healthInsTable tbody');
const tr=document.createElement('tr');
tr.innerHTML=`
`;
tb.appendChild(tr);
}
function goStep(n){
document.getElementById('step'+currentStep).style.display='none';
currentStep=n;
document.getElementById('step'+currentStep).style.display='block';
updateUI();
}
function changeStep(dir){
const next=currentStep+dir;
if(next<0||next>=totalSteps)return;
goStep(next);
}
function updateUI(){
const pills=document.querySelectorAll('.step-pill');
for(let i=0;i{
const txt=lbl.textContent.replace(/\s+/g,' ').trim();
const inp=lbl.nextElementSibling;
if(inp&&(inp.tagName==='INPUT'||inp.tagName==='TEXTAREA'||inp.tagName==='SELECT')){
if(inp.value.trim()) lines.push(txt+': '+inp.value.trim());
}
});
lines.push('Tax/Resident status: '+radioVal('taxtype'));
const tinInp=document.querySelector('input[placeholder="Foreign tax ID"]');
if(tinInp&&tinInp.value.trim()) lines.push('TIN: '+tinInp.value.trim());
// Family members
if(window._family&&window._family.length){
lines.push('');
lines.push('Family Members:');
window._family.forEach((m,i)=>{
lines.push(' Member '+(i+1)+': '+[m.name,m.rel,m.dob,m.occ].filter(Boolean).join(' | '));
});
}
// Nominees
const nomTrs=document.querySelectorAll('#nomineeTable tbody tr');
if(nomTrs.length){
lines.push('');
lines.push('Nominees:');
nomTrs.forEach(tr=>{
const cells=tr.querySelectorAll('input');
const row=[cells[0]&&cells[0].value,cells[1]&&cells[1].value,cells[2]&&cells[2].value+'%'].filter(v=>v&&v.trim()&&v!=='%');
if(row.length) lines.push(' '+row.join(' | '));
});
}
// Bank
lines.push('');
lines.push('Primary Bank:');
document.querySelectorAll('.section.accent-amber:first-of-type input, .section.accent-amber:first-of-type select').forEach(el=>{
const lbl=el.closest('.field')&&el.closest('.field').querySelector('label');
if(lbl&&el.value.trim()) lines.push(' '+lbl.textContent.trim()+': '+el.value.trim());
});
// ── INCOME ──
lines.push('');
lines.push('══════════════════════════════════════');
lines.push('SECTION 2 — INCOME & EXPENSES');
lines.push('══════════════════════════════════════');
const incomeRows=['Your salary (after tax)','Spouse salary (after tax)','Rental income','Dividend income (annual)'];
document.querySelectorAll('#step1 table:first-of-type tbody tr').forEach((tr,i)=>{
const cells=tr.querySelectorAll('input');
const vals=Array.from(cells).map(c=>c.value.trim()).filter(Boolean);
if(vals.length){
const label=incomeRows[i]||tr.querySelector('input[type="text"]')&&tr.querySelector('input[type="text"]').value||'Other income';
lines.push(label+': '+vals.join(' / '));
}
});
document.querySelectorAll('#step1 .field-grid input, #step1 .field-grid select').forEach(el=>{
const lbl=el.closest('.field')&&el.closest('.field').querySelector('label');
if(lbl&&el.value.trim()) lines.push(lbl.textContent.trim()+': '+el.value.trim());
});
lines.push('Other income recurring: '+radioVal('otherIncomeRecurring'));
lines.push('');
lines.push('Monthly Expenses:');
document.querySelectorAll('.section.accent-amber .field-grid input').forEach(el=>{
const lbl=el.closest('.field')&&el.closest('.field').querySelector('label');
if(lbl&&el.value.trim()&&el.value.trim()!=='0') lines.push(' '+lbl.textContent.trim()+': ₹'+el.value.trim());
});
lines.push('');
lines.push('Annual Expenses:');
document.querySelectorAll('.section.accent-coral .field-grid input').forEach(el=>{
const lbl=el.closest('.field')&&el.closest('.field').querySelector('label');
if(lbl&&el.value.trim()&&el.value.trim()!=='0') lines.push(' '+lbl.textContent.trim()+': ₹'+el.value.trim());
});
// ── GOALS ──
lines.push('');
lines.push('══════════════════════════════════════');
lines.push('SECTION 3 — GOALS');
lines.push('══════════════════════════════════════');
document.querySelectorAll('#step2 .section:first-child input').forEach(el=>{
const lbl=el.closest('.field')&&el.closest('.field').querySelector('label');
if(lbl&&el.value.trim()) lines.push(lbl.textContent.trim()+': '+el.value.trim());
});
if(window._goals&&window._goals.length){
lines.push('');
lines.push('Other Goals:');
window._goals.forEach((g,i)=>{
const parts=[g.name&&'Goal: '+g.name,g.year&&'Target year: '+g.year,g.amt&&'Amount today: ₹'+g.amt,g.inf&&'Inflation: '+g.inf+'%',g.loan&&'Loan: '+g.loan,g.loanpct&&'Loan %: '+g.loanpct+'%'].filter(Boolean);
if(parts.length) lines.push(' '+(i+1)+'. '+parts.join(' | '));
});
}
// ── INVESTMENTS ──
lines.push('');
lines.push('══════════════════════════════════════');
lines.push('SECTION 4 — INVESTMENTS');
lines.push('══════════════════════════════════════');
// Savings
lines.push('Savings Accounts:');
document.querySelectorAll('#savingsTable tbody tr').forEach(tr=>{
const cells=tr.querySelectorAll('input');
const row=Array.from(cells).map(c=>c.value.trim()).filter(Boolean);
if(row.length) lines.push(' '+row.join(': ₹'));
});
// FDs
lines.push('Fixed Deposits / Bonds:');
document.querySelectorAll('#fdTable tbody tr').forEach(tr=>{
const cells=tr.querySelectorAll('input, select');
const row=Array.from(cells).map(c=>c.value.trim()).filter(Boolean);
if(row.length) lines.push(' '+row.join(' | '));
});
// MFs
lines.push('Mutual Funds:');
document.querySelectorAll('#mfTable tbody tr').forEach(tr=>{
const cells=tr.querySelectorAll('input, select');
const row=Array.from(cells).map(c=>c.value.trim()).filter(Boolean);
if(row.length) lines.push(' '+row.join(' | '));
});
// Stocks
const stockVal=document.querySelector('input[placeholder="From your demat statement"]');
if(stockVal&&stockVal.value.trim()) lines.push('Equity portfolio value: ₹'+stockVal.value.trim());
// Govt schemes
lines.push('Long-term govt schemes:');
document.querySelectorAll('.section.accent-coral .field-grid input').forEach(el=>{
const lbl=el.closest('.field')&&el.closest('.field').querySelector('label');
if(lbl&&el.value.trim()&&el.value.trim()!=='0') lines.push(' '+lbl.textContent.trim()+': ₹'+el.value.trim());
});
// Real estate
lines.push('Real Estate / Physical Assets:');
document.querySelectorAll('#step3 table:last-of-type tbody tr').forEach(tr=>{
const cells=tr.querySelectorAll('input, select');
const label=tr.querySelector('.row-label');
const name=label?label.textContent.trim():(cells[0]&&cells[0].value.trim());
const vals=Array.from(cells).slice(label?0:1).map(c=>c.value.trim()).filter(Boolean);
if(vals.join('').replace(/0/g,'').trim()) lines.push(' '+name+': '+vals.join(' | '));
});
// ── LOANS ──
lines.push('');
lines.push('══════════════════════════════════════');
lines.push('SECTION 5 — LOANS');
lines.push('══════════════════════════════════════');
const loanLabels=['Home loan','Car loan','Personal loan','Jewel loan'];
document.querySelectorAll('#step4 tbody tr').forEach((tr,i)=>{
const cells=tr.querySelectorAll('input');
const vals=Array.from(cells).map(c=>c.value.trim()).filter(v=>v&&v!=='0');
if(vals.length){
const label=loanLabels[i]||tr.querySelector('input[type="text"]')&&tr.querySelector('input[type="text"]').value||'Other loan';
lines.push(label+': '+Array.from(cells).map(c=>c.value.trim()).join(' | '));
}
});
// ── INSURANCE ──
lines.push('');
lines.push('══════════════════════════════════════');
lines.push('SECTION 6 — INSURANCE');
lines.push('══════════════════════════════════════');
lines.push('Life Insurance Policies:');
document.querySelectorAll('#lifeInsTable tbody tr').forEach(tr=>{
const cells=tr.querySelectorAll('input, select');
const row=Array.from(cells).map(c=>c.value.trim()).filter(Boolean);
if(row.length) lines.push(' '+row.join(' | '));
});
lines.push('Health Insurance Policies:');
document.querySelectorAll('#healthInsTable tbody tr').forEach(tr=>{
const cells=tr.querySelectorAll('input, select');
const row=Array.from(cells).map(c=>c.value.trim()).filter(Boolean);
if(row.length) lines.push(' '+row.join(' | '));
});
lines.push('');
lines.push('──────────────────────────────────────');
lines.push('Submitted via Wealth Roadmap Fact Finder');
lines.push('holisticinvestment.in');
return lines.join('\n');
}
function buildXlsx(){
const wb = XLSX.utils.book_new();
function addSheet(name, rows){
const ws = XLSX.utils.aoa_to_sheet(rows);
// Style column widths
ws['!cols'] = [{wch:35},{wch:55}];
XLSX.utils.book_append_sheet(wb, ws, name);
}
// ── PERSONAL ──
const personal = [['Field','Value']];
const step0 = document.querySelector('#step0');
step0.querySelectorAll('.field').forEach(f=>{
const lbl = f.querySelector('label');
const inp = f.querySelector('input,textarea,select');
if(lbl && inp && inp.value.trim()) personal.push([lbl.textContent.replace(/\s+/g,' ').trim(), inp.value.trim()]);
});
personal.push(['Resident status', document.querySelector('input[name="taxtype"]:checked')?.value||'']);
// Family
if(window._family&&window._family.length){
personal.push(['','']);
personal.push(['FAMILY MEMBERS','']);
window._family.forEach((m,i)=>{ personal.push(['Member '+(i+1), [m.name,m.rel,m.dob,m.occ].filter(Boolean).join(' | ')]); });
}
// Nominees
const nomRows = [...document.querySelectorAll('#nomineeTable tbody tr')].map(tr=>{
const c=tr.querySelectorAll('input'); return [c[0]?.value||'', c[1]?.value||'', (c[2]?.value||'')+'%'];
}).filter(r=>r[0].trim());
if(nomRows.length){ personal.push(['','']); personal.push(['NOMINEES','']); nomRows.forEach(r=>personal.push(r)); }
addSheet('Personal', personal);
// ── INCOME & EXPENSES ──
const income = [['Source / Item','Monthly (₹)','Annual Bonus / Lump Sum (₹)']];
const incLabels=['Your salary (after tax)','Spouse salary (after tax)','Rental income','Dividend income'];
document.querySelectorAll('#step1 table:first-of-type tbody tr').forEach((tr,i)=>{
const c=tr.querySelectorAll('input');
income.push([incLabels[i]||c[0]?.value||'Other', c[c.length>1?c.length-2:0]?.value||'', c[c.length-1]?.value||'']);
});
income.push(['','','']);
income.push(['MONTHLY EXPENSES','','']);
document.querySelectorAll('#step1 .section.accent-amber .field').forEach(f=>{
const lbl=f.querySelector('label'); const inp=f.querySelector('input');
if(lbl&&inp&&inp.value.trim()) income.push([lbl.textContent.trim(), inp.value.trim(),'']);
});
income.push(['','','']);
income.push(['ANNUAL EXPENSES','','']);
document.querySelectorAll('#step1 .section.accent-coral .field-grid .field').forEach(f=>{
const lbl=f.querySelector('label'); const inp=f.querySelector('input');
if(lbl&&inp&&inp.value.trim()) income.push([lbl.textContent.trim(), inp.value.trim(),'']);
});
addSheet('Income & Expenses', income);
// ── GOALS ──
const goals = [['Field','Value']];
document.querySelectorAll('#step2 .section:first-child .field').forEach(f=>{
const lbl=f.querySelector('label'); const inp=f.querySelector('input');
if(lbl&&inp&&inp.value.trim()) goals.push([lbl.textContent.trim(), inp.value.trim()]);
});
if(window._goals&&window._goals.length){
goals.push(['','']);
goals.push(['OTHER GOALS','']);
goals.push(['Goal','Target Year','Amount Today (₹)','Inflation %','Loan?','Loan %']);
window._goals.forEach(g=>goals.push([g.name,g.year,g.amt,g.inf,g.loan,g.loanpct]));
}
addSheet('Goals', goals);
// ── INVESTMENTS ──
const inv = [['Category','Detail 1','Detail 2','Detail 3','Detail 4','Detail 5','Detail 6','Detail 7']];
inv.push(['SAVINGS ACCOUNTS','Bank','Balance (₹)','','','','','']);
document.querySelectorAll('#savingsTable tbody tr').forEach(tr=>{
const c=tr.querySelectorAll('input'); inv.push(['', c[0]?.value||'', c[1]?.value||'','','','','','']);
});
inv.push(['','','','','','','','']);
inv.push(['FIXED DEPOSITS / BONDS','Description','Invest Date','Maturity Date','Rate %','Type','Invested (₹)','Maturity (₹)']);
document.querySelectorAll('#fdTable tbody tr').forEach(tr=>{
const c=tr.querySelectorAll('input,select'); inv.push(['',...Array.from(c).map(x=>x.value||'')]);
});
inv.push(['','','','','','','','']);
inv.push(['MUTUAL FUNDS','Scheme','Option','Mode','Start Date','Invested (₹)','Current Value (₹)','Monthly SIP (₹)']);
document.querySelectorAll('#mfTable tbody tr').forEach(tr=>{
const c=tr.querySelectorAll('input,select'); inv.push(['',...Array.from(c).map(x=>x.value||'')]);
});
const stockVal=document.querySelector('input[placeholder="From your demat statement"]')?.value||'';
if(stockVal){ inv.push(['','','','','','','','']); inv.push(['EQUITY PORTFOLIO VALUE (₹)', stockVal,'','','','','','']); }
inv.push(['','','','','','','','']);
inv.push(['GOVT SCHEMES','Scheme','Current Value (₹)','Monthly Contribution (₹)','','','','']);
const schemeLabels=['EPF','EPF contribution','NPS','NPS contribution','PPF','PPF contribution','Sukanya Samridhi','Sukanya contribution'];
const schemeInputs=document.querySelectorAll('.section.accent-coral .field-grid input');
for(let i=0;i{
const lbl=tr.querySelector('.row-label'); const c=tr.querySelectorAll('input,select');
const name=lbl?lbl.textContent.trim():c[0]?.value||'';
inv.push(['', name, c[0]?.value||'', c[1]?.value||'', c[2]?.value||'','','','']);
});
addSheet('Investments', inv);
// ── LOANS ──
const loans = [['Loan Type','Original Amount (₹)','Interest Rate %','Outstanding (₹)','Monthly EMI (₹)','Months Remaining']];
const loanLabels=['Home loan','Car loan','Personal loan','Jewel loan'];
document.querySelectorAll('#step4 tbody tr').forEach((tr,i)=>{
const c=tr.querySelectorAll('input');
const label=loanLabels[i]||c[0]?.value||'Other loan';
const vals=Array.from(c);
loans.push([label, vals[0]?.value||'', vals[1]?.value||'', vals[2]?.value||'', vals[3]?.value||'', vals[4]?.value||'']);
});
addSheet('Loans', loans);
// ── INSURANCE ──
const ins = [];
ins.push(['LIFE INSURANCE']);
ins.push(['Policy Name','Policy Number','Sum Assured (₹)','Policy Term','Start Date','Maturity Date','Premium (₹)','Mode']);
document.querySelectorAll('#lifeInsTable tbody tr').forEach(tr=>{
const c=tr.querySelectorAll('input,select'); ins.push(Array.from(c).map(x=>x.value||''));
});
ins.push(['','','','','','','','']);
ins.push(['HEALTH INSURANCE','','','','','','','']);
ins.push(['Policy Name','Sum Insured (₹)','Annual Premium (₹)','Type','','','','']);
document.querySelectorAll('#healthInsTable tbody tr').forEach(tr=>{
const c=tr.querySelectorAll('input,select'); ins.push([...Array.from(c).map(x=>x.value||''),'','','','']);
});
addSheet('Insurance', ins);
return wb;
}
function submitForm(){
const nameInput=document.querySelector('#step0 .section:first-child input[placeholder="As per PAN card"]');
const clientName=nameInput&&nameInput.value.trim()?nameInput.value.trim():'Client';
const fileName='WealthRoadmap_FactFinder_'+clientName.replace(/\s+/g,'_')+'.xlsx';
const subject='Wealth Roadmap Fact Finder — '+clientName;
const btn=document.querySelector('.btn-submit');
btn.disabled=true;
btn.innerHTML=' Submitting…';
// ── Step 1: Excel download (instant, no async needed) ──
try {
const wb=buildXlsx();
XLSX.writeFile(wb,fileName);
} catch(xlErr){
console.error('Excel error:',xlErr);
}
// ── Step 2: EmailJS — full answers ──
const body=collectFormData();
emailjs.send('service_cenpe7g','template_l6dz6a6',{subject:subject,message:body})
.then(function(){
showSuccess(clientName,fileName,'both');
})
.catch(function(err){
console.error('EmailJS error:',err);
// Excel already downloaded — show success but note email issue
showSuccess(clientName,fileName,'xlonly');
});
}
function showSuccess(clientName,fileName,mode){
const emailNote = mode==='xlonly'
? '
We couldn’t send the automatic email this time. Please email the Excel file to ramalingam@holisticinvestment.in manually.
'
: '';
document.getElementById('submitWrap').innerHTML=`
All done — thank you!
Your details have been sent to our team and ${fileName} has been saved to your device.
${emailNote}
Next step: email your KYC documents (PAN, Aadhaar, bank proof) + the downloaded Excel file to ramalingam@holisticinvestment.in
Our team will schedule your introductory call once we receive your KYC documents.
`;
}
updateUI();
// ── CENTRAL EVENT DELEGATION (avoids WordPress stripping onclick) ──
document.addEventListener('click', function(e){
const btn = e.target.closest('[data-action]');
if(!btn) return;
const action = btn.getAttribute('data-action');
switch(action){
case 'addFamilyMember': addFamilyMember(); break;
case 'addNominee': addNominee(); break;
case 'addGoal': addGoal(); break;
case 'addSavings': addRow('savingsTable',['Bank name','Current balance (₹)']); break;
case 'addFD': addFD(); break;
case 'addMF': addMF(); break;
case 'addLifeIns': addLifeIns(); break;
case 'addHealthIns': addHealthIns(); break;
case 'prevStep': changeStep(-1); break;
case 'nextStep': changeStep(1); break;
case 'goStep': {
const s = parseInt(btn.getAttribute('data-step'));
if(!isNaN(s)) goStep(s);
break;
}
case 'submitForm': submitForm(); break;
}
});