{"id":1882,"date":"2025-10-25T02:36:06","date_gmt":"2025-10-25T02:36:06","guid":{"rendered":"https:\/\/bysbs.cloud\/fog\/?page_id=1882"},"modified":"2025-10-25T02:46:31","modified_gmt":"2025-10-25T02:46:31","slug":"youtube-earnings","status":"publish","type":"page","link":"https:\/\/bysbs.cloud\/fog\/youtube-earnings\/","title":{"rendered":"YouTube earnings"},"content":{"rendered":"\n<div class=\"wp-block-cover alignwide\" style=\"min-height:354px;aspect-ratio:unset;\"><img fetchpriority=\"high\" decoding=\"async\" width=\"957\" height=\"409\" class=\"wp-block-cover__image-background wp-image-1883\" alt=\"\" src=\"https:\/\/bysbs.cloud\/fog\/wp-content\/uploads\/2025\/10\/image-4.png\" data-object-fit=\"cover\" srcset=\"https:\/\/bysbs.cloud\/fog\/wp-content\/uploads\/2025\/10\/image-4.png 957w, https:\/\/bysbs.cloud\/fog\/wp-content\/uploads\/2025\/10\/image-4-300x128.png 300w, https:\/\/bysbs.cloud\/fog\/wp-content\/uploads\/2025\/10\/image-4-768x328.png 768w\" sizes=\"(max-width: 957px) 100vw, 957px\" \/><span aria-hidden=\"true\" class=\"wp-block-cover__background has-background-dim\"><\/span><div class=\"wp-block-cover__inner-container is-layout-flow wp-block-cover-is-layout-flow\">\n<p class=\"has-text-align-center has-large-font-size wp-block-paragraph\">\u06cc\u0648\u0679\u06cc\u0648\u0628 \u06d4 \u06a9\u0645\u0627\u0626\u06cc \u0627\u0648\u0631 \u0627\u06cc\u0688\u0648\u0631\u0679\u0627\u0626\u0632\u0646\u06af<\/p>\n\n\n\n<p class=\"has-text-align-center has-medium-font-size wp-block-paragraph\">\u0628\u062c\u0679 \u0627\u0648\u0631 \u062d\u06a9\u0645\u062a \u0639\u0645\u0644\u06cc \u062a\u06cc\u0627\u0631 \u06a9\u0631\u06cc\u06ba<\/p>\n<\/div><\/div>\n\n\n\n<!-- Full enhanced YouTube Dual Report form\n     Features:\n     - Dynamic A\/B\/C\/D 10-question form\n     - Creator earnings & advertiser cost calc (Option 1 RPM model)\n     - Chart.js visualization\n     - Export PDF (jsPDF + html2canvas)\n     - Send report by Email (EmailJS) - optional (fill placeholders)\n     - Save result to Google Sheets via Apps Script webhook - optional (fill placeholder)\n     - Tailwind for styling (CDN)\n     \n     IMPORTANT: To enable optional features, fill the placeholder variables below:\n     - EMAILJS_SERVICE_ID, EMAILJS_TEMPLATE_ID, EMAILJS_USER_ID\n     - SHEETS_WEBHOOK_URL\n-->\n\n<!-- Tailwind CDN -->\n<script src=\"https:\/\/cdn.tailwindcss.com\"><\/script>\n\n<style>\n  \/* small custom tweaks for non-Tailwind parts (keeps responsive) *\/\n  .card { border-radius: 12px; box-shadow:0 4px 14px rgba(12,12,13,0.06); background: white; padding: 16px; }\n  .tiny { font-size:12px; color:#6b7280; }\n  .nowrap { white-space:nowrap; }\n<\/style>\n\n<div class=\"max-w-4xl mx-auto my-6\">\n  <div class=\"card\">\n    <div class=\"flex items-start justify-between gap-4\">\n      <div>\n        <h1 class=\"text-2xl font-semibold\">YouTube Dual Report \u2014 Ads &#038; Creator Earnings<\/h1>\n        <p class=\"tiny mt-1\">Choose package \u2192 answer 10 questions \u2192 get an instant business report (USD &#038; PKR). Download PDF, email it, or save to Google Sheets.<\/p>\n      <\/div>\n      <div class=\"text-right tiny\">\n        <div>Version: Enhanced<\/div>\n        <div id=\"timeNow\"><\/div>\n      <\/div>\n    <\/div>\n\n    <!-- CONFIG: Set these to enable optional features -->\n    <script>\n      \/\/ ---------- FILL THESE ---------- \n      const EMAILJS_SERVICE_ID = \"\";    \/\/ e.g., \"service_xxx\"  (leave blank to disable Email feature)\n      const EMAILJS_TEMPLATE_ID = \"\";   \/\/ e.g., \"template_xxx\"\n      const EMAILJS_USER_ID = \"\";       \/\/ e.g., \"user_xxx\"  or public key\n      const SHEETS_WEBHOOK_URL = \"\";    \/\/ e.g., \"https:\/\/script.google.com\/macros\/s\/XXXX\/exec\" (leave blank to disable Sheets save)\n      \/\/ ---------------------------------\n    <\/script>\n\n    <div class=\"mt-4 grid md:grid-cols-2 gap-4\">\n      <div>\n        <label class=\"block text-sm font-medium\">Package<\/label>\n        <select id=\"packageSelect\" class=\"mt-1 block w-full rounded-md border px-3 py-2\">\n          <option value=\"A\">A \u2014 Advertiser only<\/option>\n          <option value=\"B\">B \u2014 Creator only<\/option>\n          <option value=\"C\" selected>C \u2014 Dual (creator-focused)<\/option>\n          <option value=\"D\">D \u2014 Dual (advertiser-focused)<\/option>\n        <\/select>\n      <\/div>\n      <div>\n        <label class=\"block text-sm font-medium\">USD \u2192 PKR rate<\/label>\n        <input id=\"usdToPkr\" type=\"number\" class=\"mt-1 block w-full rounded-md border px-3 py-2\" value=\"285\" step=\"0.1\" \/>\n      <\/div>\n    <\/div>\n\n    <div id=\"formWrap\" class=\"mt-4\"><\/div>\n\n    <div class=\"mt-4 flex gap-3\">\n      <button id=\"calculateBtn\" class=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700\">Calculate Report<\/button>\n      <button id=\"downloadPdfBtn\" class=\"px-4 py-2 bg-gray-600 text-white rounded hover:bg-gray-700\">Export PDF<\/button>\n      <button id=\"emailBtn\" class=\"px-4 py-2 bg-green-600 text-white rounded hover:bg-green-700\">Email Report<\/button>\n      <button id=\"saveSheetsBtn\" class=\"px-4 py-2 bg-indigo-600 text-white rounded hover:bg-indigo-700\">Save to Google Sheets<\/button>\n      <button id=\"resetBtn\" class=\"px-4 py-2 bg-gray-200 rounded\">Reset<\/button>\n    <\/div>\n\n    <div id=\"reportArea\" class=\"mt-6 hidden card\">\n      <div class=\"flex justify-between items-start\">\n        <h2 class=\"text-lg font-semibold\">Report<\/h2>\n        <div class=\"tiny\">Currency rate: <span id=\"rateShow\">285<\/span><\/div>\n      <\/div>\n\n      <div id=\"reportSummary\" class=\"mt-3\"><\/div>\n\n      <div class=\"mt-4\">\n        <h3 class=\"text-sm font-medium\">Earnings vs Cost<\/h3>\n        <canvas id=\"earnChart\" class=\"mt-2\"><\/canvas>\n      <\/div>\n\n      <div class=\"mt-4 tiny\" id=\"rawBreakdown\"><\/div>\n    <\/div>\n  <\/div>\n<\/div>\n\n<!-- External libs -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jspdf\/2.5.1\/jspdf.umd.min.js\"><\/script>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/html2canvas\/1.4.1\/html2canvas.min.js\"><\/script>\n<!-- EmailJS (optional) -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/emailjs-com@3\/dist\/email.min.js\"><\/script>\n\n<script>\n\/* ---------- Utility & Boilerplate ---------- *\/\ndocument.getElementById('timeNow').innerText = new Date().toLocaleString();\n\nfunction toNumber(v, def=0){ const n = parseFloat(v); return isNaN(n) ? def : n; }\n\n\/\/ Templates (same as previous but cleaner; each template has 10 fields)\nconst templates = {\n  A: [ \/* Advertiser only *\/\n    {id:'budget',label:'Ad Budget (USD)',type:'number',required:true,placeholder:'500'},\n    {id:'cpv_choice',label:'Pick expected CPV (USD)',type:'select',options:[{v:0.01,t:'0.01'},{v:0.03,t:'0.03'},{v:0.10,t:'0.10'}],required:true},\n    {id:'pct_international',label:'Estimated % International viewers',type:'number',required:true,placeholder:'20'},\n    {id:'duration_days',label:'Campaign duration (days)',type:'number',required:true,placeholder:'30'},\n    {id:'expected_view_through',label:'View-through rate %',type:'number',required:true,placeholder:'30'},\n    {id:'expected_click_rate',label:'Expected CTR %',type:'number',required:true,placeholder:'1'},\n    {id:'goal_conv_rate',label:'Conversion rate after click %',type:'number',required:true,placeholder:'2'},\n    {id:'value_per_conversion',label:'Value per conversion (USD)',type:'number',required:true,placeholder:'20'},\n    {id:'min_test_spend',label:'Minimum test spend (USD)',type:'number',required:true,placeholder:'50'},\n    {id:'notes',label:'Notes (optional)',type:'text',required:false,placeholder:'product launch'}\n  ],\n  B: [ \/* Creator only *\/\n    {id:'avg_views',label:'Average expected views per video',type:'number',required:true,placeholder:'2000'},\n    {id:'uploads_month',label:'Uploads per month',type:'number',required:true,placeholder:'4'},\n    {id:'monetized_pct',label:'% of views monetized',type:'number',required:true,placeholder:'60'},\n    {id:'pct_international',label:'% International viewers',type:'number',required:true,placeholder:'25'},\n    {id:'video_length_min',label:'Average video length (min)',type:'number',required:true,placeholder:'8'},\n    {id:'engagement_factor',label:'Engagement factor (1-4)',type:'select',options:[{v:1,t:'1-Low'},{v:2,t:'2-Fair'},{v:3,t:'3-Good'},{v:4,t:'4-High'}],required:true},\n    {id:'consistency_months',label:'Consistency months',type:'number',required:true,placeholder:'6'},\n    {id:'channel_growth',label:'Monthly growth %',type:'number',required:true,placeholder:'10'},\n    {id:'use_ads',label:'Will you use ads? (yes\/no)',type:'select',options:[{v:'no',t:'No'},{v:'yes',t:'Yes'}],required:true},\n    {id:'notes',label:'Notes (optional)',type:'text',required:false,placeholder:'education channel'}\n  ],\n  C: [ \/* Dual creator-focused *\/\n    {id:'avg_views',label:'Average expected views per video',type:'number',required:true,placeholder:'1500'},\n    {id:'uploads_month',label:'Uploads per month',type:'number',required:true,placeholder:'4'},\n    {id:'monetized_pct',label:'% monetized',type:'number',required:true,placeholder:'60'},\n    {id:'pct_international',label:'% International viewers',type:'number',required:true,placeholder:'20'},\n    {id:'ad_budget',label:'Ad budget (USD) optional',type:'number',required:false,placeholder:'200'},\n    {id:'cpv_choice',label:'If using ads, CPV (USD)',type:'select',options:[{v:0.01,t:'0.01'},{v:0.03,t:'0.03'},{v:0.10,t:'0.10'}],required:false},\n    {id:'engagement_factor',label:'Engagement factor (1-4)',type:'select',options:[{v:1,t:'1-Low'},{v:2,t:'2-Fair'},{v:3,t:'3-Good'},{v:4,t:'4-High'}],required:true},\n    {id:'consistency_months',label:'Consistency months',type:'number',required:true,placeholder:'6'},\n    {id:'channel_growth',label:'Monthly growth %',type:'number',required:true,placeholder:'8'},\n    {id:'notes',label:'Notes (optional)',type:'text',required:false,placeholder:'tutorial channel'}\n  ],\n  D: [ \/* Dual advertiser-focused *\/\n    {id:'budget',label:'Ad Budget (USD)',type:'number',required:true,placeholder:'1000'},\n    {id:'cpv_choice',label:'Pick CPV (USD)',type:'select',options:[{v:0.01,t:'0.01'},{v:0.03,t:'0.03'},{v:0.10,t:'0.10'}],required:true},\n    {id:'pct_international',label:'% International viewers',type:'number',required:true,placeholder:'30'},\n    {id:'expected_view_through',label:'Expected view-through %',type:'number',required:true,placeholder:'40'},\n    {id:'expected_conversion_rate',label:'Expected conversion rate %',type:'number',required:true,placeholder:'1.5'},\n    {id:'value_per_conversion',label:'Value per conversion (USD)',type:'number',required:true,placeholder:'25'},\n    {id:'organic_channel_views',label:'Organic monthly channel views (optional)',type:'number',required:false,placeholder:'5000'},\n    {id:'monetized_pct',label:'If channel exists: % monetized',type:'number',required:false,placeholder:'60'},\n    {id:'campaign_days',label:'Campaign duration (days)',type:'number',required:true,placeholder:'30'},\n    {id:'notes',label:'Notes (optional)',type:'text',required:false,placeholder:'demo campaign'}\n  ]\n};\n\n\/* Render dynamic form fields *\/\nconst formWrap = document.getElementById('formWrap');\nconst pkgSelect = document.getElementById('packageSelect');\nfunction renderTemplate(pkg){\n  formWrap.innerHTML = '';\n  const t = templates[pkg];\n  const grid = document.createElement('div');\n  grid.className = 'grid gap-3 md:grid-cols-2';\n  t.forEach((q,idx)=>{\n    const field = document.createElement('div');\n    field.className = 'p-1';\n    const label = document.createElement('label');\n    label.className = 'block text-sm font-medium';\n    label.innerText = `${idx+1}. ${q.label}`;\n    field.appendChild(label);\n\n    if(q.type === 'select'){\n      const sel = document.createElement('select');\n      sel.name = q.id; sel.required = q.required || false;\n      sel.className = 'mt-1 block w-full rounded-md border px-3 py-2';\n      (q.options||[]).forEach(opt=>{\n        const o = document.createElement('option'); o.value = opt.v; o.innerText = opt.t; sel.appendChild(o);\n      });\n      field.appendChild(sel);\n    } else {\n      const inp = document.createElement('input');\n      inp.name = q.id; inp.type = q.type || 'text';\n      inp.required = q.required || false;\n      inp.placeholder = q.placeholder || '';\n      inp.className = 'mt-1 block w-full rounded-md border px-3 py-2';\n      field.appendChild(inp);\n    }\n    grid.appendChild(field);\n  });\n  formWrap.appendChild(grid);\n}\npkgSelect.addEventListener('change', ()=> renderTemplate(pkgSelect.value));\nrenderTemplate(pkgSelect.value);\n\n\/* Calculation logic - Option 1 RPM model (1.50 \/ 2.50 \/ 3.50 per 1000 views) *\/\nconst rpmScenarios = { low:1.50, mid:2.50, high:3.50 };\nlet chartInstance = null;\n\nfunction collectValues(){\n  const vals = {};\n  const inputs = formWrap.querySelectorAll('input,select');\n  inputs.forEach(i=>{ if(i.name) vals[i.name] = i.value; });\n  return vals;\n}\n\n\/\/ Core calc function (same logic as earlier but cleaner)\nfunction calcReport(pkg, values){\n  const usdPkr = toNumber(document.getElementById('usdToPkr').value, 285);\n  let projectedViews = 0, adCost = 0, breakdown = {};\n\n  if(pkg === 'A'){\n    const budget = toNumber(values['budget']);\n    const cpv = toNumber(values['cpv_choice'], 0.03);\n    adCost = budget;\n    projectedViews = Math.floor(budget \/ cpv);\n    const viewThrough = toNumber(values['expected_view_through'])\/100;\n    const clicks = Math.round(projectedViews * (toNumber(values['expected_click_rate'])\/100));\n    const conversions = Math.round(clicks * (toNumber(values['goal_conv_rate'])\/100));\n    breakdown = { clicks, conversions, convValue: conversions * toNumber(values['value_per_conversion']) };\n  } else if(pkg === 'B'){\n    const avgViews = toNumber(values['avg_views']);\n    const uploads = toNumber(values['uploads_month']);\n    const months = Math.max(1, toNumber(values['consistency_months']));\n    const growth = toNumber(values['channel_growth'])\/100;\n    let total = 0; let mv = avgViews * uploads;\n    for(let m=0;m<months;m++){ total += mv; mv *= (1+growth); }\n    projectedViews = Math.floor(total * (toNumber(values['monetized_pct'])\/100));\n    adCost = 0;\n    breakdown = { months, monthlyAvg: Math.round(total\/months) };\n  } else if(pkg === 'C'){\n    const avgViews = toNumber(values['avg_views']);\n    const uploads = toNumber(values['uploads_month']);\n    const months = Math.max(1, toNumber(values['consistency_months']));\n    const growth = toNumber(values['channel_growth'])\/100;\n    let organic = 0; let mv = avgViews * uploads;\n    for(let m=0;m<months;m++){ organic += mv; mv *= (1+growth); }\n    const monetized = Math.floor(organic * (toNumber(values['monetized_pct'])\/100));\n    const adBudget = toNumber(values['ad_budget']);\n    let adViews = 0;\n    if(adBudget > 0){ const cpv = toNumber(values['cpv_choice'],0.03); adViews = Math.floor(adBudget \/ cpv); adCost = adBudget; }\n    projectedViews = monetized + adViews;\n    breakdown = { organicMonetized: monetized, adViews, months };\n  } else if(pkg === 'D'){\n    const budget = toNumber(values['budget']);\n    const cpv = toNumber(values['cpv_choice'],0.03);\n    const adViews = Math.floor(budget \/ cpv);\n    adCost = budget;\n    const organic = toNumber(values['organic_channel_views']) || 0;\n    const organicMonetized = Math.floor(organic * (toNumber(values['monetized_pct'])\/100));\n    projectedViews = adViews + organicMonetized;\n    const conversions = Math.round(adViews * (toNumber(values['expected_view_through'])\/100) * (toNumber(values['expected_conversion_rate'])\/100) );\n    breakdown = { adViews, organicMonetized, conversions, convValue: conversions * toNumber(values['value_per_conversion']) };\n  }\n\n  \/\/ Earnings calc\n  const earningsUSD = {\n    low: (projectedViews \/ 1000) * rpmScenarios.low,\n    mid: (projectedViews \/ 1000) * rpmScenarios.mid,\n    high: (projectedViews \/ 1000) * rpmScenarios.high\n  };\n\n  \/\/ Platform estimation (YouTube ~45%): estimate gross from creator earning\n  const creatorShare = 0.55;\n  const platformUSD = {\n    low: earningsUSD.low \/ creatorShare - earningsUSD.low,\n    mid: earningsUSD.mid \/ creatorShare - earningsUSD.mid,\n    high: earningsUSD.high \/ creatorShare - earningsUSD.high\n  };\n\n  \/\/ ROI from advertiser perspective (if adCost > 0)\n  let roiVal = null;\n  if(adCost > 0){\n    const convVal = breakdown.convValue || 0;\n    roiVal = (convVal - adCost) \/ Math.max(1, adCost);\n  }\n\n  const breakEven = adCost > 0 ? Math.ceil(adCost \/ (rpmScenarios.mid \/ 1000)) : null;\n\n  return { projectedViews, adCost, earningsUSD, platformUSD, breakdown, roiVal, usdPkr, breakEven };\n}\n\n\/* Render report HTML + chart *\/\nfunction renderReport(res){\n  document.getElementById('reportArea').classList.remove('hidden');\n  document.getElementById('rateShow').innerText = res.usdPkr;\n  let html = `<div class=\"grid md:grid-cols-2 gap-4\">`;\n  html += `<div class=\"p-2\"><strong>Projected Views:<\/strong> ${res.projectedViews.toLocaleString()}<br><strong>Ad Cost (USD):<\/strong> $${(res.adCost||0).toLocaleString()}<br><strong>Break-even Views (mid RPM):<\/strong> ${res.breakEven?res.breakEven.toLocaleString():'N\/A'}<\/div>`;\n  html += `<div class=\"p-2\"><strong>ROI (advertiser):<\/strong> ${res.roiVal === null ? 'N\/A' : ( (res.roiVal*100).toFixed(1) + '%' ) }<br><strong>Platform Est. Share (mid):<\/strong> $${res.platformUSD.mid.toFixed(2)}<\/div>`;\n  html += `<\/div>`;\n\n  \/\/ Earnings table\n  html += `<div class=\"mt-3 overflow-x-auto\"><table class=\"w-full text-sm\"><thead><tr class=\"text-left\"><th>RPM (USD\/1000)<\/th><th>Creator USD<\/th><th>Creator PKR<\/th><th>Platform USD (est)<\/th><\/tr><\/thead><tbody>`;\n  ['low','mid','high'].forEach(s=>{\n    const e = res.earningsUSD[s];\n    html += `<tr><td class=\"py-1\">${rpmScenarios[s].toFixed(2)}<\/td><td>$${e.toFixed(2)}<\/td><td>PKR ${Math.round(e*res.usdPkr).toLocaleString()}<\/td><td>$${res.platformUSD[s].toFixed(2)}<\/td><\/tr>`;\n  });\n  html += `<\/tbody><\/table><\/div>`;\n\n  \/\/ Breakdown\n  html += `<div class=\"mt-3\"><h4 class=\"font-medium\">Details<\/h4><div class=\"tiny\">`;\n  for(const k in res.breakdown){ html += `<div><strong>${k}:<\/strong> ${res.breakdown[k]}<\/div>`; }\n  html += `<\/div><\/div>`;\n\n  document.getElementById('reportSummary').innerHTML = html;\n\n  \/\/ Chart\n  const ctx = document.getElementById('earnChart').getContext('2d');\n  const labels = ['Low RPM','Mid RPM','High RPM'];\n  const earnData = [res.earningsUSD.low, res.earningsUSD.mid, res.earningsUSD.high];\n  const adCost = res.adCost || 0;\n\n  const datasets = [\n    { label:'Creator Earnings (USD)', data: earnData, backgroundColor:'rgba(59,130,246,0.8)' },\n    { label:'Ad Cost (USD)', data: [adCost,adCost,adCost], backgroundColor:'rgba(107,114,128,0.6)' }\n  ];\n\n  if(chartInstance) chartInstance.destroy();\n  chartInstance = new Chart(ctx, { type:'bar', data:{ labels, datasets }, options:{ responsive:true, scales:{ y:{ beginAtZero:true } } } });\n\n  \/\/ Save last result for export\/email\n  window._lastReport = res;\n}\n\n\/* Buttons: Calculate, PDF, Email, Save, Reset *\/\ndocument.getElementById('calculateBtn').addEventListener('click', ()=>{\n  \/\/ validate required\n  const required = formWrap.querySelectorAll('[required]');\n  for(const r of required){ if(!r.value){ r.focus(); alert('Please fill required fields.'); return; } }\n  const vals = collectValues();\n  const pkg = pkgSelect.value;\n  const res = calcReport(pkg, vals);\n  renderReport(res);\n});\n\n\/\/ PDF export using html2canvas + jsPDF\ndocument.getElementById('downloadPdfBtn').addEventListener('click', async ()=>{\n  if(!window._lastReport){ alert('Please calculate the report first.'); return; }\n  const area = document.getElementById('reportArea');\n  \/\/ temporarily ensure visible for canvas\n  area.style.display='block';\n  const canvas = await html2canvas(area, { scale: 1.4, useCORS:true });\n  const imgData = canvas.toDataURL('image\/png');\n  const { jsPDF } = window.jspdf;\n  const pdf = new jsPDF('p','mm','a4');\n  const imgProps = pdf.getImageProperties(imgData);\n  const pdfWidth = pdf.internal.pageSize.getWidth();\n  const pdfHeight = (imgProps.height * pdfWidth) \/ imgProps.width;\n  pdf.addImage(imgData,'PNG',0,0,pdfWidth,pdfHeight);\n  pdf.save('youtube_report.pdf');\n});\n\n\/\/ Email via EmailJS (if configured)\ndocument.getElementById('emailBtn').addEventListener('click', async ()=>{\n  if(!window._lastReport){ alert('Calculate report first.'); return; }\n  if(!EMAILJS_SERVICE_ID || !EMAILJS_TEMPLATE_ID || !EMAILJS_USER_ID){ alert('EmailJS not configured. Fill keys in the script section to enable.'); return; }\n  \/\/ collect a recipient email quickly\n  const to = prompt('Enter recipient email:');\n  if(!to) return;\n  \/\/ Prepare payload (you must set corresponding template fields in EmailJS)\n  const payload = {\n    to_email: to,\n    subject: 'Your YouTube Report',\n    message: JSON.stringify(window._lastReport, null, 2),\n    \/\/ add other template fields as needed\n  };\n  \/\/ init EmailJS\n  emailjs.init(EMAILJS_USER_ID);\n  try{\n    const res = await emailjs.send(EMAILJS_SERVICE_ID, EMAILJS_TEMPLATE_ID, payload);\n    alert('Email sent (EmailJS response id: ' + res.status + ')');\n  }catch(err){\n    console.error(err); alert('Email send failed. See console for details.');\n  }\n});\n\n\/\/ Save to Google Sheets via webhook (Apps Script)\ndocument.getElementById('saveSheetsBtn').addEventListener('click', async ()=>{\n  if(!window._lastReport){ alert('Calculate report first.'); return; }\n  if(!SHEETS_WEBHOOK_URL){ alert('Sheets webhook not configured. Fill SHEETS_WEBHOOK_URL variable to enable.'); return; }\n  const payload = {\n    timestamp: new Date().toISOString(),\n    package: pkgSelect.value,\n    usdToPkr: document.getElementById('usdToPkr').value,\n    report: window._lastReport\n  };\n  try{\n    const r = await fetch(SHEETS_WEBHOOK_URL, { method:'POST', headers:{'Content-Type':'application\/json'}, body:JSON.stringify(payload) });\n    if(r.ok){ alert('Saved to Google Sheets (webhook returned OK).'); } else { alert('Sheets save failed: '+r.statusText); }\n  }catch(e){ console.error(e); alert('Save failed: see console'); }\n});\n\ndocument.getElementById('resetBtn').addEventListener('click', ()=>{\n  renderTemplate(pkgSelect.value);\n  document.getElementById('reportArea').classList.add('hidden');\n});\n\n\/* Initialize optional libraries only if config provided *\/\nif(EMAILJS_SERVICE_ID && EMAILJS_USER_ID){\n  try{ emailjs.init(EMAILJS_USER_ID); }catch(e){ console.warn('EmailJS init failed', e); }\n}\n\n\/* Helpful: show placeholder usage instructions (console) *\/\nconsole.log('YouTube Dual Report loaded. To enable Email send, fill EMAILJS_* variables. To enable Sheets saving, fill SHEETS_WEBHOOK_URL.');\n<\/script>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity is-style-wide\"\/>\n\n\n\n<div class=\"wp-block-essential-blocks-button  root-eb-button-rzxxe\"><div class=\"eb-parent-wrapper eb-parent-eb-button-rzxxe \"><div class=\"eb-button-wrapper eb-button-alignment eb-button-rzxxe\"><div class=\"eb-button\"><div class=\"eb-button-inner-wrapper \"><a class=\"eb-button-anchor hvr-push  \" href=\"https:\/\/wa.me\/+971585081322\" rel=\"noopener\"><i icon=\"fab fa-whatsapp\" class=\"fab fa-whatsapp eb-button-icon eb-button-icon-left hvr-icon\"><\/i>Ask Questions<\/a><\/div><\/div><\/div><\/div><\/div>\n<div class=\"gsp_post_data\" \r\n\t            data-post_type=\"page\" \r\n\t            data-cat=\"\" \r\n\t            data-modified=\"120\"\r\n\t            data-created=\"1761359766\"\r\n\t            data-title=\"YouTube earnings\" \r\n\t            data-home=\"https:\/\/bysbs.cloud\/fog\"><\/div><div class=\"wps-pgfw-pdf-generate-icon__wrapper-frontend pgfw-icon-display pgfw-icon-display--default\" style=\"--pgfw-icon-justify:center;\"><a href=\"https:\/\/bysbs.cloud\/fog\/wp-json\/wp\/v2\/pages\/1882?action=genpdf&#038;id=1882\" class=\"pgfw-single-pdf-download-button pgfw-single-pdf-download-button--default pgfw-single-pdf-download-button--icon-only\" title=\"Generate PDF\" style=\"--pgfw-icon-width:25px;--pgfw-icon-height:45px;\" aria-label=\"Download PDF\"><span class=\"pgfw-single-pdf-download-button__media\" aria-hidden=\"true\"><img src=\"https:\/\/bysbs.cloud\/fog\/wp-content\/plugins\/pdf-generator-for-wp\/admin\/src\/images\/PDF_Tray.svg\" alt=\"\" decoding=\"async\"><\/span><\/a><\/div>","protected":false},"excerpt":{"rendered":"<p>YouTube Dual Report \u2014 Ads &#038; Creator Earnings Choose package \u2192 answer 10 questions \u2192 get an instant business report (USD &#038; PKR). Download PDF, email it, or save to Google Sheets. Version: Enhanced Package A \u2014 Advertiser onlyB \u2014 Creator onlyC \u2014 Dual (creator-focused)D \u2014 Dual (advertiser-focused) USD \u2192 PKR rate Calculate Report Export [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"no-title-sticky-header","meta":{"_eb_attr":"","footnotes":""},"class_list":["post-1882","page","type-page","status-publish","hentry"],"rttpg_featured_image_url":null,"rttpg_author":{"display_name":"@admin","author_link":"https:\/\/bysbs.cloud\/fog\/author\/admin\/"},"rttpg_comment":0,"rttpg_category":null,"rttpg_excerpt":"YouTube Dual Report \u2014 Ads &#038; Creator Earnings Choose package \u2192 answer 10 questions \u2192 get an instant business report (USD &#038; PKR). Download PDF, email it, or save to Google Sheets. Version: Enhanced Package A \u2014 Advertiser onlyB \u2014 Creator onlyC \u2014 Dual (creator-focused)D \u2014 Dual (advertiser-focused) USD \u2192 PKR rate Calculate Report Export&hellip;","_links":{"self":[{"href":"https:\/\/bysbs.cloud\/fog\/wp-json\/wp\/v2\/pages\/1882","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bysbs.cloud\/fog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bysbs.cloud\/fog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bysbs.cloud\/fog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bysbs.cloud\/fog\/wp-json\/wp\/v2\/comments?post=1882"}],"version-history":[{"count":2,"href":"https:\/\/bysbs.cloud\/fog\/wp-json\/wp\/v2\/pages\/1882\/revisions"}],"predecessor-version":[{"id":1886,"href":"https:\/\/bysbs.cloud\/fog\/wp-json\/wp\/v2\/pages\/1882\/revisions\/1886"}],"wp:attachment":[{"href":"https:\/\/bysbs.cloud\/fog\/wp-json\/wp\/v2\/media?parent=1882"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}