'+cards[c][0]+'
'+cards[c][1]+'
';
}
// Hourly rows
var hRows='';
for (var hi = 0; hi < hourSugs.length; hi++) {
var hs = hourSugs[hi];
var barW = maxHourCost > 0 ? Math.round((hs.cost / maxHourCost) * 100) : 0;
var barColor = hs.adj > 0 ? '#16A34A' : hs.adj < 0 ? '#DC2626' : '#9CA3AF';
var rowBg = hi % 2 === 0 ? '#FFFFFF' : '#F9FAFB';
var avgClicks = (hs.clicks / dayCount).toFixed(1);
hRows+=''+
'| '+(hs.hour<10?'0'+hs.hour:hs.hour)+':00 | '+
''+hs.clicks+' | '+
''+avgClicks+' | '+
''+
''+
' | '+
''+hs.conv.toFixed(1)+' | '+
''+(hs.convRate*100).toFixed(1)+'% | '+
''+hs.sug+' | '+
'
';
}
// Budget rows
var bRows='';
for (var bk = 0; bk < campList.length; bk++) {
var cs = campList[bk];
var exhText, exhColor;
if (cs.avgExhaust !== null) {
exhText = '⏰ ' + fmtHour(cs.avgExhaust);
exhColor = cs.avgExhaust < 18 ? '#DC2626' : '#D97706';
} else if (cs.avgUtil >= 95) {
exhText = '~۲۳:۵۹';
exhColor = '#D97706';
} else {
exhText = 'تموم نمیشه';
exhColor = '#16A34A';
}
var exhPct = cs.daysAnalyzed > 0 ? Math.round((cs.daysExhausted / cs.daysAnalyzed) * 100) : 0;
var utilBarW = Math.min(cs.avgUtil, 100);
var utilColor = cs.avgUtil >= 100 ? '#DC2626' : cs.avgUtil >= 80 ? '#D97706' : '#16A34A';
bRows+=''+
'| '+cs.name+' | '+
''+fAED(cs.budget)+' | '+
''+fAED(cs.avgDailySpend)+' | '+
''+
''+cs.avgUtil.toFixed(0)+'% '+
' | '+
''+exhText+' | '+
''+cs.daysExhausted+'/'+cs.daysAnalyzed+' ('+exhPct+'%) | '+
''+cs.totalConv.toFixed(1)+' | '+
'
';
}
// DOW rows
var dowRows = '';
var maxDowConv = 0;
for (var dn = 0; dn < dowOrder.length; dn++) {
if (dows[dowOrder[dn]] && dows[dowOrder[dn]].conv > maxDowConv) maxDowConv = dows[dowOrder[dn]].conv;
}
for (var dx = 0; dx < dowOrder.length; dx++) {
var dk2 = dowOrder[dx];
var dd = dows[dk2] || {clicks:0, cost:0, conv:0};
var cr2 = dd.clicks > 0 ? dd.conv / dd.clicks : 0;
var cpa2 = dd.conv > 0 ? dd.cost / dd.conv : 0;
var convBarW = maxDowConv > 0 ? Math.round((dd.conv / maxDowConv) * 100) : 0;
var dowSug = '— نرمال', dowColor = '#6B7280', dowBg = '#F9FAFB';
if (cr2 > avgConvRate * 1.3 && dd.conv > 0) { dowSug = '⬆ افزایش'; dowColor = '#16A34A'; dowBg = '#DCFCE7'; }
else if (cr2 < avgConvRate * 0.5 && dd.clicks > 5) { dowSug = '⬇ کاهش'; dowColor = '#DC2626'; dowBg = '#FEE2E2'; }
dowRows+=''+
'| '+dowFa[dk2]+' | '+
''+dd.clicks+' | '+
''+fAED(dd.cost)+' | '+
''+
''+
' | '+
''+(cr2*100).toFixed(1)+'% | '+
''+(cpa2 > 0 ? fAED(cpa2) : '—')+' | '+
''+dowSug+' | '+
'
';
}
// Top recommendations
var topActions = '🎯 توصیههای کلیدی (تحلیل ۳۰ روزه)
';
if (bestHour) topActions += '- بهترین ساعت ماه: '+ (bestHour.hour<10?'0'+bestHour.hour:bestHour.hour) +':00 با Conv Rate '+(bestHour.convRate*100).toFixed(1)+'% — پیشنهاد bid adjustment: +'+bestHour.adj+'%
';
if (worstHour) topActions += '- پرهزینهترین ساعت کمبازده: '+ (worstHour.hour<10?'0'+worstHour.hour:worstHour.hour) +':00 با هزینه کل '+fAED(worstHour.cost)+' — پیشنهاد: '+worstHour.adj+'%
';
var earlyExhaust = null;
for (var ec = 0; ec < campList.length; ec++) if (campList[ec].avgExhaust !== null && campList[ec].avgExhaust < 18 && campList[ec].daysExhausted >= dayCount * 0.5) { earlyExhaust = campList[ec]; break; }
if (earlyExhaust) topActions += '- کمپین '+earlyExhaust.name+' بهطور میانگین ساعت '+fmtHour(earlyExhaust.avgExhaust)+' بودجهاش تموم میشه (در '+earlyExhaust.daysExhausted+' روز از '+earlyExhaust.daysAnalyzed+' روز) — افزایش بودجه توصیه میشه.
';
// بهترین روز هفته
var bestDow = null, bestDowKey = null;
for (var bd = 0; bd < dowOrder.length; bd++) {
var ddd = dows[dowOrder[bd]];
if (ddd && ddd.clicks > 5) {
var bdcr = ddd.conv / ddd.clicks;
if (bestDow === null || bdcr > bestDow.cr) { bestDow = {cr: bdcr, conv: ddd.conv}; bestDowKey = dowOrder[bd]; }
}
}
if (bestDow && bestDowKey) topActions += '- بهترین روز هفته: '+dowFa[bestDowKey]+' با Conv Rate '+(bestDow.cr*100).toFixed(1)+'% — برای این روز bid adjustment مثبت بذار.
';
topActions += '
';
var scriptInfo = ''+
'📋 اطلاعات این گزارش:
'+
'این گزارش توسط اسکریپت «'+CONFIG.SCRIPT_NAME+'» در Google Ads تولید شده است.
'+
'بازه تحلیل: '+fDate(sd)+' تا '+fDate(ed)+' ('+dayCount+' روز) | دادههای ساعتی و روزانه: جمع کل بازه'+
'
';
return ''+FONT_LINK+
''+
''+
''+
''+
''+
''+
'🚗 '+CONFIG.BRAND_NAME+' — گزارش ماهانه '+
'تحلیل ساعتی، روز هفته و بودجه — ۳۰ روز گذشته | '+
''+fDate(sd)+' – '+fDate(ed)+' '+
''+dayCount+' روز | '+
'
| '+
' | '+
'| '+
topActions +
' ⏰ تحلیل ساعتی — جمع ۳۰ روز '+
''+
''+
'| ساعت | '+
'کل کلیک | '+
'میانگین روزانه | '+
'کل هزینه | '+
'Conv | '+
'Conv Rate | '+
'پیشنهاد | '+
' '+hRows+
' '+
'💰 الگوی بودجه — بهطور میانگین کی تموم میشه؟ '+
''+
''+
'| Campaign | '+
'بودجه روزانه | '+
'میانگین خرج روزانه | '+
'مصرف میانگین | '+
'میانگین ساعت پایان بودجه | '+
'روزهای تمومشده | '+
'Conv | '+
' '+bRows+
' '+
'📅 الگوی روز هفته '+
''+
''+
'| روز | '+
'کلیک | '+
'هزینه | '+
'Conversions | '+
'Conv Rate | '+
'CPA | '+
'پیشنهاد | '+
' '+dowRows+
' '+
scriptInfo +
' | '+
'| '+
' گزارش خودکار Google Ads Script | Powered by Webinew '+
' | '+
' |
';
}