This commit is contained in:
2026-05-15 20:32:50 +02:00
parent ae25aae9ce
commit def1fae0fc
632 changed files with 280942 additions and 104 deletions

View File

@@ -0,0 +1,28 @@
param(
[string]$CodexHome = "$env:USERPROFILE\.codex",
[string]$ClaudeHome = "$env:USERPROFILE\.claude"
)
$ErrorActionPreference = "Stop"
$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot "..")
$CodexSkillSource = Join-Path $RepoRoot ".codex\skills\google-ads-client-report"
$ClaudeSkillSource = Join-Path $RepoRoot ".claude\skills\google-ads-client-report"
$ClaudeCommandSource = Join-Path $RepoRoot ".claude\commands\raport-klienta.md"
$CodexSkillTarget = Join-Path $CodexHome "skills\google-ads-client-report"
$ClaudeSkillTarget = Join-Path $ClaudeHome "skills\google-ads-client-report"
$ClaudeCommandTarget = Join-Path $ClaudeHome "commands\raport-klienta.md"
New-Item -ItemType Directory -Force $CodexSkillTarget | Out-Null
New-Item -ItemType Directory -Force $ClaudeSkillTarget | Out-Null
New-Item -ItemType Directory -Force (Split-Path $ClaudeCommandTarget) | Out-Null
Copy-Item -Recurse -Force (Join-Path $CodexSkillSource "*") $CodexSkillTarget
Copy-Item -Recurse -Force (Join-Path $ClaudeSkillSource "*") $ClaudeSkillTarget
Copy-Item -Force $ClaudeCommandSource $ClaudeCommandTarget
Write-Host "Installed Codex skill: $CodexSkillTarget"
Write-Host "Installed Claude skill: $ClaudeSkillTarget"
Write-Host "Installed Claude command: $ClaudeCommandTarget"

View File

@@ -123,6 +123,35 @@ def parse_history_month(value):
return text
def month_locative(month):
names = {
"01": "styczniu",
"02": "lutym",
"03": "marcu",
"04": "kwietniu",
"05": "maju",
"06": "czerwcu",
"07": "lipcu",
"08": "sierpniu",
"09": "wrześniu",
"10": "październiku",
"11": "listopadzie",
"12": "grudniu",
}
return names.get(str(month)[5:7], str(month))
def normalize_month_reference(text, month):
"""Keep SEO worksheet text aligned with the report month when row date matches."""
target = month_locative(month)
return re.sub(
r"^W miesiącu [A-Za-ząćęłńóśźżĄĆĘŁŃÓŚŹŻ]+",
f"W {target}",
text,
count=1,
)
def parse_sheet_config(sheet_config):
value = str(sheet_config or "").strip()
if not value:
@@ -192,6 +221,43 @@ def fetch_sales_history_from_sheet(domain, sheet_config):
return sorted(history, key=lambda item: item["month"])
def fetch_seo_text_rows_from_sheet(sheet_config, month):
"""Fetch monthly SEO text rows from a public Google Sheet CSV export."""
spreadsheet_id, gid = parse_sheet_config(sheet_config)
export_url = f"https://docs.google.com/spreadsheets/d/{spreadsheet_id}/gviz/tq?tqx=out:csv"
if gid:
export_url += f"&gid={gid}"
response = requests.get(export_url, timeout=30)
response.raise_for_status()
response.encoding = "utf-8"
reader = csv.DictReader(io.StringIO(response.text))
rows = []
for row in reader:
normalized = {normalize_header(key): value for key, value in row.items()}
row_month = parse_history_month(
normalized.get("month")
or normalized.get("miesiac")
or normalized.get("data")
or normalized.get("date")
)
text = (
normalized.get("url")
or normalized.get("link")
or normalized.get("tekst")
or normalized.get("opis")
or normalized.get("dzialanie")
or normalized.get("dzialania")
or ""
).strip()
if row_month == month and text:
rows.append({
"date": row.get("Data") or row.get("data") or row_month,
"url": normalize_month_reference(text, month),
})
return rows
def apply_sheet_ecommerce(report, sales_history, month, previous_month):
"""Use Google Sheet sales data for e-commerce KPI cards."""
by_month = {row["month"]: row for row in sales_history}
@@ -785,6 +851,29 @@ def main():
else:
report["seo_links"] = []
# SEO works and links from config/clients.toml override the legacy .env-only fetch above.
seo_works_sheet = client_report_config.get("seo_works_history_sheet")
if seo_works_sheet:
print(f"Pobieram dzialania SEO z config/clients.toml...")
try:
seo_work_rows = fetch_seo_text_rows_from_sheet(seo_works_sheet, args.month)
report["seo_activities"] = "\n\n".join(row["url"] for row in seo_work_rows)
print(f" Dzialania SEO: {len(seo_work_rows)} wpisow w {args.month}")
except Exception as e:
print(f" UWAGA: Blad dzialan SEO: {e}")
report["seo_activities"] = ""
seo_links_sheet = client_report_config.get("seo_links_history_sheet")
if seo_links_sheet:
print(f"Pobieram linki SEO z config/clients.toml...")
try:
seo_links = fetch_seo_text_rows_from_sheet(seo_links_sheet, args.month)
report["seo_links"] = seo_links or []
print(f" Linki SEO: {len(report['seo_links'])} w {args.month}")
except Exception as e:
print(f" UWAGA: Blad SEO links: {e}")
report["seo_links"] = []
# Output
if args.output:
output_path = Path(args.output)

View File

@@ -358,7 +358,7 @@
<section class="report-section" id="recommendations">
<h2 class="section-title">Wnioski i rekomendacje</h2>
<div class="recommendations-list">
<div class="rec-item"><span class="rec-icon">&#9888;</span><div><strong>Spadek konwersji do obserwacji</strong><p>Liczba konwersji spadla o 8.2% miesiac do miesiaca. Rekomendujemy sprawdzenie kampanii o najwiekszym spadku wolumenu.</p></div></div><div class="rec-item"><span class="rec-icon">&#128200;</span><div><strong>ROAS liczony z Google Ads</strong><p>ROAS z Google Ads wyniosl 8.47. Ten wskaznik liczymy z wartosci konwersji Google Ads, nie z przychodow sklepu.</p></div></div><div class="rec-item"><span class="rec-icon">&#128269;</span><div><strong>Kontrola wzrostu kosztu</strong><p>Koszt reklam wzrosl o 12.2% miesiac do miesiaca. Warto porownac wzrost kosztu ze wzrostem konwersji i wartosci konwersji.</p></div></div>
<div class="rec-item"><span class="rec-icon">&#10148;</span><div><strong>Wzrost wartości sprzedaży przy stabilnym ROAS</strong><p>W kwietniu kampanie Google Ads wygenerowały 199,5 konwersji i 41 326,28 zł wartości konwersji przy koszcie 4 880,74 zł. Wartość konwersji wzrosła miesiąc do miesiąca o 10,4%, a ROAS pozostał wysoki na poziomie 8,47. Utrzymujemy obecny kierunek skalowania, ale kontrolujemy koszt pozyskania, ponieważ koszt wzrósł szybciej niż liczba konwersji.</p></div></div><div class="rec-item"><span class="rec-icon">&#10148;</span><div><strong>Najmocniejsze wyniki generują kampanie produktowe</strong><p>Największy udział w sprzedaży ma kampania Performance Max z wynikiem 19 390,88 zł wartości konwersji i ROAS 7,02. Bardzo dobrze pracuje też kampania PLA bestsellery, która przy koszcie 681,64 zł wygenerowała 7 367,07 zł wartości konwersji i ROAS 10,81. W kolejnym kroku wzmacniamy feed produktowy oraz obserwujemy nowy eksperyment PMax bestsellery jako porównanie do PLA bestsellery.</p></div></div><div class="rec-item"><span class="rec-icon">&#10148;</span><div><strong>Priorytet na kolejny miesiąc: efektywne skalowanie</strong><p>Z arkusza sprzedaży e-commerce wynika 275 transakcji i 64 312,47 zł przychodu w kwietniu. Po stronie Google Ads zwiększamy nacisk na kampanie z wysoką wartością konwersji, a jednocześnie pilnujemy, aby wzrost budżetów i celów stawek był wprowadzany stopniowo. Kontrolujemy szczególnie DSA produkty oraz kampanie produktowe, żeby utrzymać rentowność przy dalszym zwiększaniu sprzedaży.</p></div></div>
</div>
</section>
@@ -370,6 +370,33 @@
<!-- E-COMMERCE -->
<section class="report-section" id="ecommerce">
<h2 class="section-title">E-commerce &mdash; Sprzedaż</h2>
<div class="kpi-grid">
<div class="kpi-card">
<div class="kpi-label">Transakcje</div>
<div class="kpi-value">275<span class="kpi-unit"></span></div>
<div class="kpi-change" style="color: #95a5a6">&nbsp;</div>
</div>
<div class="kpi-card">
<div class="kpi-label">Przychód</div>
<div class="kpi-value">64 312.47<span class="kpi-unit"> PLN</span></div>
<div class="kpi-change" style="color: #95a5a6">&nbsp;</div>
</div>
<div class="kpi-card">
<div class="kpi-label">Śr. wartość zamówienia</div>
<div class="kpi-value">233.86<span class="kpi-unit"> PLN</span></div>
<div class="kpi-change" style="color: #95a5a6">&nbsp;</div>
</div></div>
<div class="chart-container">
<h3>Historia sprzedaży (miesięcznie)</h3>
<canvas id="salesHistoryChart"></canvas>
</div>
</section>
<!-- PRODUCT OPTIMIZATIONS -->
@@ -412,6 +439,13 @@
&#9660; -8.2% vs Marzec
</div>
</div>
<div class="kpi-card">
<div class="kpi-label">Wartość konwersji</div>
<div class="kpi-value">41 326.28<span class="kpi-unit"> PLN</span></div>
<div class="kpi-change" style="color: #27ae60">
&#9650; +10.4% vs Marzec
</div>
</div>
<div class="kpi-card">
<div class="kpi-label">Koszt</div>
<div class="kpi-value">4880.74<span class="kpi-unit"> PLN</span></div>
@@ -419,13 +453,6 @@
&#9650; +12.2% vs Marzec
</div>
</div>
<div class="kpi-card">
<div class="kpi-label">CPA</div>
<div class="kpi-value">24.46<span class="kpi-unit"> PLN</span></div>
<div class="kpi-change" style="color: #e74c3c">
&#9650; +22.2% vs Marzec
</div>
</div>
<div class="kpi-card">
<div class="kpi-label">ROAS</div>
<div class="kpi-value">8.47<span class="kpi-unit">x</span></div>
@@ -455,6 +482,7 @@
<th>Kliknięcia</th>
<th>CTR</th>
<th>Konwersje</th>
<th>Wartość konwersji</th>
<th>Koszt</th>
<th>CPA</th>
</tr>
@@ -467,6 +495,7 @@
<td class="num">483</td>
<td class="num">29.9%</td>
<td class="num">27</td>
<td class="num">7 967.63 PLN</td>
<td class="num">337.96 PLN</td>
<td class="num">12.52 PLN</td>
</tr>
@@ -477,6 +506,7 @@
<td class="num">694</td>
<td class="num">7.0%</td>
<td class="num">23</td>
<td class="num">6 600.70 PLN</td>
<td class="num">1098.15 PLN</td>
<td class="num">47.75 PLN</td>
</tr>
@@ -487,6 +517,7 @@
<td class="num">2 164</td>
<td class="num">1.6%</td>
<td class="num">106</td>
<td class="num">19 390.88 PLN</td>
<td class="num">2762.99 PLN</td>
<td class="num">25.94 PLN</td>
</tr>
@@ -497,6 +528,7 @@
<td class="num">485</td>
<td class="num">2.2%</td>
<td class="num">43</td>
<td class="num">7 367.07 PLN</td>
<td class="num">681.64 PLN</td>
<td class="num">15.85 PLN</td>
</tr></tbody>
@@ -646,18 +678,212 @@
<!-- SEMSTORM SEO -->
<section class="report-section" id="semstorm">
<h2 class="section-title">SEO &mdash; Widoczność (Semstorm)</h2>
<div class="kpi-grid">
<div class="kpi-card">
<div class="kpi-label">TOP 3</div>
<div class="kpi-value">230<span class="kpi-unit"> fraz</span></div>
<div class="kpi-change" style="color: #e74c3c">
&#9660; -6.1% vs Marzec
</div>
</div>
<div class="kpi-card">
<div class="kpi-label">TOP 10</div>
<div class="kpi-value">992<span class="kpi-unit"> fraz</span></div>
<div class="kpi-change" style="color: #e74c3c">
&#9660; -6.9% vs Marzec
</div>
</div>
<div class="kpi-card">
<div class="kpi-label">TOP 50</div>
<div class="kpi-value">6 802<span class="kpi-unit"> fraz</span></div>
<div class="kpi-change" style="color: #e74c3c">
&#9660; -1.1% vs Marzec
</div>
</div>
<div class="kpi-card">
<div class="kpi-label">Szac. ruch SEO</div>
<div class="kpi-value">6 109<span class="kpi-unit"></span></div>
<div class="kpi-change" style="color: #e74c3c">
&#9660; -28.4% vs Marzec
</div>
</div></div>
<div class="chart-container">
<h3>Historia widoczności</h3>
<canvas id="semstormChart"></canvas>
</div>
</section>
<!-- SEO ACTIVITIES -->
<section class="report-section" id="seo-activities">
<h2 class="section-title">SEO &mdash; Pozostałe działania</h2>
<div class="summary-box">
W kwietniu w ramach prac SEO wykonane zostały następujące rzeczy: <br>
<br>
- Przygotowane zostały 4 wpisyna bloga<br>
<a href="https://aruba.rzeszow.pl/podopharm-na-co-dzien-jak-prawidlowo-stosowac-krem-do-stop" target="_blank" rel="noopener" style="color: var(--primary);">https://aruba.rzeszow.pl/podopharm-na-co-dzien-jak-prawidlowo-stosowac-krem-do-stop</a> <br>
<a href="https://aruba.rzeszow.pl/paleta-cieni-do-powiek-matowe-satynowe-czy-blyszczace" target="_blank" rel="noopener" style="color: var(--primary);">https://aruba.rzeszow.pl/paleta-cieni-do-powiek-matowe-satynowe-czy-blyszczace</a> <br>
<a href="https://aruba.rzeszow.pl/suche-pekajace-piety-i-szorstka-skora-jak-kremy-do-stop-podopharm-pomagaja-odzyskac-gladkieestopy" target="_blank" rel="noopener" style="color: var(--primary);">https://aruba.rzeszow.pl/suche-pekajace-piety-i-szorstka-skora-jak-kremy-do-stop-podopharm-pomagaja-odzyskac-gladkieestopy</a> <br>
<a href="https://aruba.rzeszow.pl/trwaly-makijaz-oczu-przez-caly-dzien-jak-nakladac-cienie-do-powiek-zeby-sie-nie-rolowaly" target="_blank" rel="noopener" style="color: var(--primary);">https://aruba.rzeszow.pl/trwaly-makijaz-oczu-przez-caly-dzien-jak-nakladac-cienie-do-powiek-zeby-sie-nie-rolowaly</a> <br>
<br>
<br>
- Przygotowane zostały opisy do następujących kategorii:<br>
<br>
<a href="https://aruba.rzeszow.pl/roze-do-policzkow" target="_blank" rel="noopener" style="color: var(--primary);">https://aruba.rzeszow.pl/roze-do-policzkow</a> <br>
<a href="https://aruba.rzeszow.pl/kremy-pielegnacyjne<br>" target="_blank" rel="noopener" style="color: var(--primary);">https://aruba.rzeszow.pl/kremy-pielegnacyjne<br></a>
<a href="https://aruba.rzeszow.pl/pozostale-akcesoria-do-makijazu" target="_blank" rel="noopener" style="color: var(--primary);">https://aruba.rzeszow.pl/pozostale-akcesoria-do-makijazu</a> <br>
<a href="https://aruba.rzeszow.pl/preparaty-do-liftingu-i-laminacji-rzes" target="_blank" rel="noopener" style="color: var(--primary);">https://aruba.rzeszow.pl/preparaty-do-liftingu-i-laminacji-rzes</a> <br>
<a href="https://aruba.rzeszow.pl/zestawy-do-liftingu-rzes-i-laminacji-brwi" target="_blank" rel="noopener" style="color: var(--primary);">https://aruba.rzeszow.pl/zestawy-do-liftingu-rzes-i-laminacji-brwi</a> <br>
<a href="https://aruba.rzeszow.pl/akcesoria-do-liftingu-rzes-i-laminacji-brwi" target="_blank" rel="noopener" style="color: var(--primary);">https://aruba.rzeszow.pl/akcesoria-do-liftingu-rzes-i-laminacji-brwi</a>
</div>
</section>
<!-- SEO LINKS -->
<section class="report-section" id="seo-links">
<h2 class="section-title">SEO &mdash; Pozyskane linki (24)</h2>
<table class="data-table">
<thead>
<tr>
<th>#</th>
<th>Domena</th>
<th>URL</th>
</tr>
</thead>
<tbody>
<tr>
<td class="num">1</td>
<td><a href="https://eglos.pl/aktualnosci/item/45483-autoklawy-w-gabinecie-kosmetycznym-i-medycznym-jak-dzialaja-i-dlaczego-sa-tak-wazne" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">eglos.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://eglos.pl/aktualnosci/item/45483-autoklawy-w-gabinecie-kosmetycznym-i-medycznym-jak-dzialaja-i-dlaczego-sa-tak-wazne" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://eglos.pl/aktualnosci/item/45483-autoklawy-w-gabinecie-kosmetycznym-i-medycznym-jak-dzialaja-i-dlaczego-sa-tak-wazne</a></td>
</tr>
<tr>
<td class="num">2</td>
<td><a href="https://alcomax.pl/lampy-led-uv-do-paznokci-jak-wybrac-dobra-lampe-i-na-co-zwrocic-uwage-przed-zakupem/" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">alcomax.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://alcomax.pl/lampy-led-uv-do-paznokci-jak-wybrac-dobra-lampe-i-na-co-zwrocic-uwage-przed-zakupem/" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://alcomax.pl/lampy-led-uv-do-paznokci-jak-wybrac-dobra-lampe-i-na-co-zwrocic-uwage-przed-zakupem/</a></td>
</tr>
<tr>
<td class="num">3</td>
<td><a href="https://curlyhare.pl/kosmetyki-do-makijazu-jak-skompletowac-zestaw-ktory-naprawde-sie-przyda/" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">curlyhare.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://curlyhare.pl/kosmetyki-do-makijazu-jak-skompletowac-zestaw-ktory-naprawde-sie-przyda/" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://curlyhare.pl/kosmetyki-do-makijazu-jak-skompletowac-zestaw-ktory-naprawde-sie-przyda/</a></td>
</tr>
<tr>
<td class="num">4</td>
<td><a href="https://salononaon.pl/maski-algowe-dlaczego-pokochaly-je-gabinety-kosmetyczne-i-kobiety-dbajace-o-cere-w-domu/" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">salononaon.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://salononaon.pl/maski-algowe-dlaczego-pokochaly-je-gabinety-kosmetyczne-i-kobiety-dbajace-o-cere-w-domu/" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://salononaon.pl/maski-algowe-dlaczego-pokochaly-je-gabinety-kosmetyczne-i-kobiety-dbajace-o-cere-w-domu/</a></td>
</tr>
<tr>
<td class="num">5</td>
<td><a href="https://strefauzytkownikow.pl/viewtopic.php?t=136" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">strefauzytkownikow.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://strefauzytkownikow.pl/viewtopic.php?t=136" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://strefauzytkownikow.pl/viewtopic.php?t=136</a></td>
</tr>
<tr>
<td class="num">6</td>
<td><a href="https://interaktywneforum.pl/viewtopic.php?t=156" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">interaktywneforum.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://interaktywneforum.pl/viewtopic.php?t=156" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://interaktywneforum.pl/viewtopic.php?t=156</a></td>
</tr>
<tr>
<td class="num">7</td>
<td><a href="https://przestrzenrozwojowa.pl/viewtopic.php?t=164" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">przestrzenrozwojowa.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://przestrzenrozwojowa.pl/viewtopic.php?t=164" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://przestrzenrozwojowa.pl/viewtopic.php?t=164</a></td>
</tr>
<tr>
<td class="num">8</td>
<td><a href="https://portalinspiracji.pl/viewtopic.php?t=163" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">portalinspiracji.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://portalinspiracji.pl/viewtopic.php?t=163" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://portalinspiracji.pl/viewtopic.php?t=163</a></td>
</tr>
<tr>
<td class="num">9</td>
<td><a href="https://forumdlawszystkich.pl/viewtopic.php?t=160" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">forumdlawszystkich.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://forumdlawszystkich.pl/viewtopic.php?t=160" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://forumdlawszystkich.pl/viewtopic.php?t=160</a></td>
</tr>
<tr>
<td class="num">10</td>
<td><a href="https://przestrzenporad.pl/viewtopic.php?t=163" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">przestrzenporad.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://przestrzenporad.pl/viewtopic.php?t=163" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://przestrzenporad.pl/viewtopic.php?t=163</a></td>
</tr>
<tr>
<td class="num">11</td>
<td><a href="https://dyskusjewokolnas.pl/viewtopic.php?t=161" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">dyskusjewokolnas.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://dyskusjewokolnas.pl/viewtopic.php?t=161" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://dyskusjewokolnas.pl/viewtopic.php?t=161</a></td>
</tr>
<tr>
<td class="num">12</td>
<td><a href="https://portaltematow.pl/viewtopic.php?t=161" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">portaltematow.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://portaltematow.pl/viewtopic.php?t=161" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://portaltematow.pl/viewtopic.php?t=161</a></td>
</tr>
<tr>
<td class="num">13</td>
<td><a href="https://grupaaktywnych.pl/viewtopic.php?t=163" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">grupaaktywnych.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://grupaaktywnych.pl/viewtopic.php?t=163" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://grupaaktywnych.pl/viewtopic.php?t=163</a></td>
</tr>
<tr>
<td class="num">14</td>
<td><a href="https://rozmowyludzkie.pl/viewtopic.php?t=162" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">rozmowyludzkie.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://rozmowyludzkie.pl/viewtopic.php?t=162" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://rozmowyludzkie.pl/viewtopic.php?t=162</a></td>
</tr>
<tr>
<td class="num">15</td>
<td><a href="https://forumotwartychmysli.pl/viewtopic.php?t=164" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">forumotwartychmysli.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://forumotwartychmysli.pl/viewtopic.php?t=164" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://forumotwartychmysli.pl/viewtopic.php?t=164</a></td>
</tr>
<tr>
<td class="num">16</td>
<td><a href="https://forumtwojeglosa.pl/viewtopic.php?t=165" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">forumtwojeglosa.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://forumtwojeglosa.pl/viewtopic.php?t=165" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://forumtwojeglosa.pl/viewtopic.php?t=165</a></td>
</tr>
<tr>
<td class="num">17</td>
<td><a href="https://rozmowytematyczne.pl/viewtopic.php?t=160" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">rozmowytematyczne.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://rozmowytematyczne.pl/viewtopic.php?t=160" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://rozmowytematyczne.pl/viewtopic.php?t=160</a></td>
</tr>
<tr>
<td class="num">18</td>
<td><a href="https://forumtematow.pl/viewtopic.php?t=166" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">forumtematow.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://forumtematow.pl/viewtopic.php?t=166" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://forumtematow.pl/viewtopic.php?t=166</a></td>
</tr>
<tr>
<td class="num">19</td>
<td><a href="https://dyskusjepolaczone.pl/viewtopic.php?t=162" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">dyskusjepolaczone.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://dyskusjepolaczone.pl/viewtopic.php?t=162" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://dyskusjepolaczone.pl/viewtopic.php?t=162</a></td>
</tr>
<tr>
<td class="num">20</td>
<td><a href="https://forum.zestawiam.pl/viewtopic.php?t=402" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">forum.zestawiam.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://forum.zestawiam.pl/viewtopic.php?t=402" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://forum.zestawiam.pl/viewtopic.php?t=402</a></td>
</tr>
<tr>
<td class="num">21</td>
<td><a href="https://fokusrozmowy.pl/viewtopic.php?t=125" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">fokusrozmowy.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://fokusrozmowy.pl/viewtopic.php?t=125" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://fokusrozmowy.pl/viewtopic.php?t=125</a></td>
</tr>
<tr>
<td class="num">22</td>
<td><a href="https://rozmowyproste.pl/viewtopic.php?t=165" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">rozmowyproste.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://rozmowyproste.pl/viewtopic.php?t=165" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://rozmowyproste.pl/viewtopic.php?t=165</a></td>
</tr>
<tr>
<td class="num">23</td>
<td><a href="https://klubaktywnych.com.pl/viewtopic.php?t=162" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">klubaktywnych.com.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://klubaktywnych.com.pl/viewtopic.php?t=162" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://klubaktywnych.com.pl/viewtopic.php?t=162</a></td>
</tr>
<tr>
<td class="num">24</td>
<td><a href="https://nowehoryzonty.com.pl/viewtopic.php?t=163" target="_blank" rel="noopener" style="color: var(--primary); text-decoration: none;">nowehoryzonty.com.pl</a></td>
<td style="font-size: 12px; color: var(--gray); word-break: break-all;"><a href="https://nowehoryzonty.com.pl/viewtopic.php?t=163" target="_blank" rel="noopener" style="color: var(--gray); text-decoration: none;">https://nowehoryzonty.com.pl/viewtopic.php?t=163</a></td>
</tr></tbody>
</table>
</section>
<!-- SUMMARY -->
<section class="report-section" id="summary">
<h2 class="section-title">Podsumowanie miesiąca</h2>
<div class="summary-box">
Odnotowano 199 konwersji w tym miesiącu. Ruch z reklam wzrósł o 2.5% (3826 kliknięć).
Przychód sklepu utrzymał się na poziomie <strong>64,312.47 PLN</strong>. Zrealizowano 275 transakcji przy średniej wartości zamówienia 233.86 PLN. ROAS z Google Ads: <strong>8.47</strong> (każda wydana złotówka przyniosła 8.47 PLN przychodu). Ruch z reklam wzrósł o 2.5% (3826 kliknięć). Widoczność SEO: 230 fraz w TOP3, 992 w TOP10.
</div>
</section>
@@ -709,7 +935,89 @@
var ctxSalesHist = document.getElementById('salesHistoryChart').getContext('2d');
new Chart(ctxSalesHist, {
type: 'bar',
data: {
labels: ["2026-04"],
datasets: [{
label: 'Przychód (PLN)',
data: [64312.47],
backgroundColor: 'rgba(39, 174, 96, 0.5)',
borderColor: '#27ae60',
borderWidth: 1,
yAxisID: 'y',
order: 2,
}, {
label: 'Zamówienia',
data: [275],
type: 'line',
borderColor: '#8e44ad',
backgroundColor: 'transparent',
tension: 0.3,
pointRadius: 4,
pointBackgroundColor: '#8e44ad',
yAxisID: 'y1',
order: 1,
}]
},
options: {
responsive: true,
interaction: { mode: 'index', intersect: false },
scales: {
y: { beginAtZero: true, position: 'left', grid: { color: '#f0f0f0' },
ticks: { callback: function(v) { return v.toLocaleString('pl-PL') + ' PLN'; } } },
y1: { beginAtZero: true, position: 'right', grid: { display: false } },
x: { grid: { display: false } }
}
}
});
var ctxSem = document.getElementById('semstormChart').getContext('2d');
new Chart(ctxSem, {
type: 'line',
data: {
labels: ["2026-02", "2026-03", "2026-04"],
datasets: [{
label: 'TOP 3',
data: [248, 245, 230],
borderColor: '#27ae60',
backgroundColor: 'rgba(39,174,96,0.1)',
fill: true,
tension: 0.3,
pointRadius: 4,
pointBackgroundColor: '#27ae60',
}, {
label: 'TOP 10',
data: [1066, 1065, 992],
borderColor: '#2980b9',
backgroundColor: 'transparent',
tension: 0.3,
pointRadius: 4,
pointBackgroundColor: '#2980b9',
}, {
label: 'TOP 50',
data: [7191, 6881, 6802],
borderColor: '#95a5a6',
backgroundColor: 'transparent',
borderDash: [5, 5],
tension: 0.3,
pointRadius: 3,
yAxisID: 'y1',
}]
},
options: {
responsive: true,
interaction: { mode: 'index', intersect: false },
scales: {
y: { beginAtZero: false, position: 'left', grid: { color: '#f0f0f0' },
title: { display: true, text: 'TOP 3 / TOP 10' } },
y1: { beginAtZero: false, position: 'right', grid: { display: false },
title: { display: true, text: 'TOP 50' } },
x: { grid: { display: false } }
}
}
});
</script>
</body>

View File

@@ -5,7 +5,7 @@
"year": 2026,
"prev_month": "2026-03",
"prev_month_name": "Marzec",
"generated_at": "2026-05-14T23:23:53.496703",
"generated_at": "2026-05-15T12:54:30.439332",
"google_ads": {
"campaigns": [
{
@@ -67,6 +67,21 @@
"cpc": 1.41,
"cpa": 15.85,
"roas": 10.81
},
{
"id": "23845634304",
"name": "[PMax] bestsellery",
"status": "ENABLED",
"type": "PERFORMANCE_MAX",
"impressions": 0,
"clicks": 0,
"cost": 0.0,
"conversions": 0.0,
"conversion_value": 0.0,
"ctr": 0,
"cpc": 0,
"cpa": 0,
"roas": 0
}
],
"totals": {
@@ -96,9 +111,11 @@
"clicks_pct": 2.5,
"cost_pct": 12.2,
"conversions_pct": -8.2,
"conversion_value_pct": 10.4,
"ctr_pct": 3.3,
"cpc_pct": 9.4,
"cpa_pct": 22.2
"cpa_pct": 22.2,
"roas_pct": -1.5
},
"daily": [
{
@@ -405,25 +422,209 @@
}
]
},
"ga4": null,
"semstorm": null,
"sales_history": [],
"seo_links": [],
"ga4": {
"ecommerce": {
"current": {
"transactions": 275,
"revenue": 64312.47,
"aov": 233.86
},
"previous": {
"transactions": 0,
"revenue": 0.0,
"aov": 0.0
},
"mom_change": {
"transactions_pct": null,
"revenue_pct": null,
"aov_pct": null
},
"source": "google_sheet"
}
},
"semstorm": {
"current": {
"date": "2026-04-01",
"month": "2026-04",
"top3": 230,
"top10": 992,
"top20": 2506,
"top50": 6802,
"top100": 10632,
"traffic": 6109
},
"previous": {
"date": "2026-03-01",
"month": "2026-03",
"top3": 245,
"top10": 1065,
"top20": 2588,
"top50": 6881,
"top100": 10716,
"traffic": 8533
},
"history": [
{
"date": "2026-02-01",
"month": "2026-02",
"top3": 248,
"top10": 1066,
"top20": 2588,
"top50": 7191,
"top100": 11297,
"traffic": 8243
},
{
"date": "2026-03-01",
"month": "2026-03",
"top3": 245,
"top10": 1065,
"top20": 2588,
"top50": 6881,
"top100": 10716,
"traffic": 8533
},
{
"date": "2026-04-01",
"month": "2026-04",
"top3": 230,
"top10": 992,
"top20": 2506,
"top50": 6802,
"top100": 10632,
"traffic": 6109
}
],
"mom_change": {
"top3_pct": -6.1,
"top10_pct": -6.9,
"top50_pct": -1.1,
"traffic_pct": -28.4
}
},
"sales_history": [
{
"month": "2026-04",
"transactions": 275,
"revenue": 64312.47,
"aov": 233.86,
"source": "google_sheet"
}
],
"seo_links": [
{
"date": "2026-04-01",
"url": "https://eglos.pl/aktualnosci/item/45483-autoklawy-w-gabinecie-kosmetycznym-i-medycznym-jak-dzialaja-i-dlaczego-sa-tak-wazne"
},
{
"date": "2026-04-01",
"url": "https://alcomax.pl/lampy-led-uv-do-paznokci-jak-wybrac-dobra-lampe-i-na-co-zwrocic-uwage-przed-zakupem/"
},
{
"date": "2026-04-01",
"url": "https://curlyhare.pl/kosmetyki-do-makijazu-jak-skompletowac-zestaw-ktory-naprawde-sie-przyda/"
},
{
"date": "2026-04-01",
"url": "https://salononaon.pl/maski-algowe-dlaczego-pokochaly-je-gabinety-kosmetyczne-i-kobiety-dbajace-o-cere-w-domu/"
},
{
"date": "2026-04-01",
"url": "https://strefauzytkownikow.pl/viewtopic.php?t=136"
},
{
"date": "2026-04-01",
"url": "https://interaktywneforum.pl/viewtopic.php?t=156"
},
{
"date": "2026-04-01",
"url": "https://przestrzenrozwojowa.pl/viewtopic.php?t=164"
},
{
"date": "2026-04-01",
"url": "https://portalinspiracji.pl/viewtopic.php?t=163"
},
{
"date": "2026-04-01",
"url": "https://forumdlawszystkich.pl/viewtopic.php?t=160"
},
{
"date": "2026-04-01",
"url": "https://przestrzenporad.pl/viewtopic.php?t=163"
},
{
"date": "2026-04-01",
"url": "https://dyskusjewokolnas.pl/viewtopic.php?t=161"
},
{
"date": "2026-04-01",
"url": "https://portaltematow.pl/viewtopic.php?t=161"
},
{
"date": "2026-04-01",
"url": "https://grupaaktywnych.pl/viewtopic.php?t=163"
},
{
"date": "2026-04-01",
"url": "https://rozmowyludzkie.pl/viewtopic.php?t=162"
},
{
"date": "2026-04-01",
"url": "https://forumotwartychmysli.pl/viewtopic.php?t=164"
},
{
"date": "2026-04-01",
"url": "https://forumtwojeglosa.pl/viewtopic.php?t=165"
},
{
"date": "2026-04-01",
"url": "https://rozmowytematyczne.pl/viewtopic.php?t=160"
},
{
"date": "2026-04-01",
"url": "https://forumtematow.pl/viewtopic.php?t=166"
},
{
"date": "2026-04-01",
"url": "https://dyskusjepolaczone.pl/viewtopic.php?t=162"
},
{
"date": "2026-04-01",
"url": "https://forum.zestawiam.pl/viewtopic.php?t=402"
},
{
"date": "2026-04-01",
"url": "https://fokusrozmowy.pl/viewtopic.php?t=125"
},
{
"date": "2026-04-01",
"url": "https://rozmowyproste.pl/viewtopic.php?t=165"
},
{
"date": "2026-04-01",
"url": "https://klubaktywnych.com.pl/viewtopic.php?t=162"
},
{
"date": "2026-04-01",
"url": "https://nowehoryzonty.com.pl/viewtopic.php?t=163"
}
],
"seo_activities": "W kwietniu w ramach prac SEO wykonane zostały następujące rzeczy: \n\n- Przygotowane zostały 4 wpisyna bloga\n https://aruba.rzeszow.pl/podopharm-na-co-dzien-jak-prawidlowo-stosowac-krem-do-stop \nhttps://aruba.rzeszow.pl/paleta-cieni-do-powiek-matowe-satynowe-czy-blyszczace \nhttps://aruba.rzeszow.pl/suche-pekajace-piety-i-szorstka-skora-jak-kremy-do-stop-podopharm-pomagaja-odzyskac-gladkieestopy \nhttps://aruba.rzeszow.pl/trwaly-makijaz-oczu-przez-caly-dzien-jak-nakladac-cienie-do-powiek-zeby-sie-nie-rolowaly \n\n\n- Przygotowane zostały opisy do następujących kategorii:\n\nhttps://aruba.rzeszow.pl/roze-do-policzkow \nhttps://aruba.rzeszow.pl/kremy-pielegnacyjne\nhttps://aruba.rzeszow.pl/pozostale-akcesoria-do-makijazu \nhttps://aruba.rzeszow.pl/preparaty-do-liftingu-i-laminacji-rzes \nhttps://aruba.rzeszow.pl/zestawy-do-liftingu-rzes-i-laminacji-brwi \nhttps://aruba.rzeszow.pl/akcesoria-do-liftingu-rzes-i-laminacji-brwi",
"recommendations": [
{
"icon": "&#9888;",
"title": "Spadek konwersji do obserwacji",
"text": "Liczba konwersji spadla o 8.2% miesiac do miesiaca. Rekomendujemy sprawdzenie kampanii o najwiekszym spadku wolumenu."
"icon": "&#10148;",
"title": "Wzrost wartości sprzedaży przy stabilnym ROAS",
"text": "W kwietniu kampanie Google Ads wygenerowały 199,5 konwersji i 41 326,28 zł wartości konwersji przy koszcie 4 880,74 zł. Wartość konwersji wzrosła miesiąc do miesiąca o 10,4%, a ROAS pozostał wysoki na poziomie 8,47. Utrzymujemy obecny kierunek skalowania, ale kontrolujemy koszt pozyskania, ponieważ koszt wzrósł szybciej niż liczba konwersji."
},
{
"icon": "&#128200;",
"title": "ROAS liczony z Google Ads",
"text": "ROAS z Google Ads wyniosl 8.47. Ten wskaznik liczymy z wartosci konwersji Google Ads, nie z przychodow sklepu."
"icon": "&#10148;",
"title": "Najmocniejsze wyniki generują kampanie produktowe",
"text": "Największy udział w sprzedaży ma kampania Performance Max z wynikiem 19 390,88 zł wartości konwersji i ROAS 7,02. Bardzo dobrze pracuje też kampania PLA bestsellery, która przy koszcie 681,64 zł wygenerowała 7 367,07 zł wartości konwersji i ROAS 10,81. W kolejnym kroku wzmacniamy feed produktowy oraz obserwujemy nowy eksperyment PMax bestsellery jako porównanie do PLA bestsellery."
},
{
"icon": "&#128269;",
"title": "Kontrola wzrostu kosztu",
"text": "Koszt reklam wzrosl o 12.2% miesiac do miesiaca. Warto porownac wzrost kosztu ze wzrostem konwersji i wartosci konwersji."
"icon": "&#10148;",
"title": "Priorytet na kolejny miesiąc: efektywne skalowanie",
"text": "Z arkusza sprzedaży e-commerce wynika 275 transakcji i 64 312,47 zł przychodu w kwietniu. Po stronie Google Ads zwiększamy nacisk na kampanie z wysoką wartością konwersji, a jednocześnie pilnujemy, aby wzrost budżetów i celów stawek był wprowadzany stopniowo. Kontrolujemy szczególnie DSA produkty oraz kampanie produktowe, żeby utrzymać rentowność przy dalszym zwiększaniu sprzedaży."
}
]
}

View File

@@ -0,0 +1,82 @@
{
"source": "agent_ai",
"instruction": "Uzupelnia agent AI po analizie danych raportu. Skrypt nie powinien sam generowac wnioskow ani rekomendacji.",
"context": {
"google_ads_totals": {
"cost": 4880.74,
"clicks": 3826,
"conversions": 199.5,
"conversion_value": 41326.28,
"roas": 8.47,
"cpa": 24.46
},
"google_ads_mom_change": {
"cost_pct": 12.2,
"clicks_pct": 2.5,
"conversions_pct": -8.2,
"conversion_value_pct": 10.4,
"roas_pct": -1.5,
"cpa_pct": 22.2
},
"ga4_ecommerce": {
"transactions": 275,
"revenue": 64312.47,
"transactions_pct": null,
"revenue_pct": null
},
"top_campaigns_by_cost": [
{
"name": "[PMax] products (catch-all)",
"cost": 2762.99,
"conversions": 106.5,
"conversion_value": 19390.88,
"roas": 7.02
},
{
"name": "[DSA] produkty",
"cost": 1098.15,
"conversions": 23.0,
"conversion_value": 6600.7,
"roas": 6.01
},
{
"name": "[PLA] produkty (bestsellers)",
"cost": 681.64,
"conversions": 43.0,
"conversion_value": 7367.07,
"roas": 10.81
},
{
"name": "[Search] brand",
"cost": 337.96,
"conversions": 27.0,
"conversion_value": 7967.63,
"roas": 23.58
},
{
"name": "[PMax] bestsellery",
"cost": 0.0,
"conversions": 0.0,
"conversion_value": 0.0,
"roas": 0
}
]
},
"recommendations": [
{
"icon": "&#10148;",
"title": "Wzrost wartości sprzedaży przy stabilnym ROAS",
"text": "W kwietniu kampanie Google Ads wygenerowały 199,5 konwersji i 41 326,28 zł wartości konwersji przy koszcie 4 880,74 zł. Wartość konwersji wzrosła miesiąc do miesiąca o 10,4%, a ROAS pozostał wysoki na poziomie 8,47. Utrzymujemy obecny kierunek skalowania, ale kontrolujemy koszt pozyskania, ponieważ koszt wzrósł szybciej niż liczba konwersji."
},
{
"icon": "&#10148;",
"title": "Najmocniejsze wyniki generują kampanie produktowe",
"text": "Największy udział w sprzedaży ma kampania Performance Max z wynikiem 19 390,88 zł wartości konwersji i ROAS 7,02. Bardzo dobrze pracuje też kampania PLA bestsellery, która przy koszcie 681,64 zł wygenerowała 7 367,07 zł wartości konwersji i ROAS 10,81. W kolejnym kroku wzmacniamy feed produktowy oraz obserwujemy nowy eksperyment PMax bestsellery jako porównanie do PLA bestsellery."
},
{
"icon": "&#10148;",
"title": "Priorytet na kolejny miesiąc: efektywne skalowanie",
"text": "Z arkusza sprzedaży e-commerce wynika 275 transakcji i 64 312,47 zł przychodu w kwietniu. Po stronie Google Ads zwiększamy nacisk na kampanie z wysoką wartością konwersji, a jednocześnie pilnujemy, aby wzrost budżetów i celów stawek był wprowadzany stopniowo. Kontrolujemy szczególnie DSA produkty oraz kampanie produktowe, żeby utrzymać rentowność przy dalszym zwiększaniu sprzedaży."
}
]
}