Appearance
MarketerAI — Tworzenie Reguł z Filtrami Analitycznymi
Spis Treści
- Przegląd
- Aktualny Przepływ Tworzenia Reguły
- Struktura Danych Filtra Analitycznego
- Dostępne Kolumny Analityczne
- Jak Filtr Jest Wyświetlany w UI
- Oczekiwane Zachowanie Systemu
- Znane Problemy i Wymagane Poprawki
Przegląd
Marketer AI pozwala użytkownikom tworzyć reguły produktowe na podstawie danych analitycznych z platform reklamowych — m.in. Google Ads, Google Analytics 4 i Microsoft Ads. Użytkownik może np. powiedzieć:
„Dla produktów, w których konwersje Google Ads były większe niż 5 w ciągu ostatnich 30 dni, ustaw w etykiecie niestandardowej 0 wartość 'Marketer'"
System powinien przetłumaczyć tę komendę na kompletną regułę z poprawnie ustawionym filtrem analitycznym — włącznie z zakresem czasowym.
Aktualny Przepływ Tworzenia Reguły
Ścieżka end-to-end
Użytkownik (chat)
↓
Marketer AI (LLM + MCP tools — repo: sembot_public-mcp)
↓ wywołuje tool create_product_rule
POST /api/public/v1/projects/{project}/product-rules
↓ App\Http\Controllers\Api\PublicApi\Rules\ProductRulesController
↓ walidacja: App\Http\Requests\Api\Google\Merchant\Rules\StoreRuleRequest
↓ → App\Http\Requests\Api\FilteredRequest (walidacja filtrów)
↓ zapis do DB: Rule (kolumna `filters` — JSON)
↓ dispatch: BulkMassAction (kolejka products_mass_actions)
↓ przy wykonaniu reguły:
App\Services\Products\AdditionalDataSource\AdditionalDataSourceService::processFilters()
↓ dla filtrów analitycznych pobiera dane z zewnętrznej platformy
↓ zamienia filtr analityczny na filtr po ID produktówKomponenty zaangażowane w przetwarzanie filtrów analitycznych
| Komponent | Plik | Odpowiedzialność |
|---|---|---|
AdditionalDataSourceService | app/Services/Products/AdditionalDataSource/AdditionalDataSourceService.php | Rozpoznaje filtry analityczne, wywołuje zewnętrzne API |
GoogleAdsProductsDataSource | app/Services/Products/AdditionalDataSource/GoogleAdsProductsDataSource.php | Pobiera dane z Google Ads API dla filtrowanego zakresu dat |
GoogleAnalytics4ProductsDataSource | app/Services/Products/AdditionalDataSource/GoogleAnalytics4ProductsDataSource.php | Pobiera dane z GA4 API |
MicrosoftAdvertisingProductsDataSource | app/Services/Products/AdditionalDataSource/MicrosoftAdvertisingProductsDataSource.php | Pobiera dane z Microsoft Ads API |
FilteredRequest | app/Http/Requests/Api/FilteredRequest.php | Waliduje strukturę filtrów — wymaga project_connection_id dla filtrów analitycznych |
Jak filtr analityczny jest przetwarzany przy wykonaniu reguły
Przy przetwarzaniu BulkMassAction AdditionalDataSourceService::processFilters() dla każdego filtra analitycznego:
- Rozpoznaje, że
parampochodzi z zewnętrznego źródła (np.google_ads_conversions) - Tworzy konektor (
GoogleAdsProductsDataSource) z połączeniemproject_connection_id - Używa
sub_dayslubstart_date/end_datedo określenia okna czasowego zapytania do platformy - Pobiera z platformy listę identyfikatorów produktów spełniających warunek
- Zastępuje filtr analityczny filtrem
param: google_product_id, symbol: in, value: [id1, id2, ...] - Dalsze przetwarzanie reguły odbywa się już tylko na lokalnej bazie produktów
Struktura Danych Filtra Analitycznego
JSON zapisywany w bazie danych (kolumna filters tabeli rules)
json
{
"filterGroups": [
{
"filters": [
{
"param": "google_ads_conversions",
"symbol": ">",
"value": 5,
"project_connection_id": 123,
"sub_days": 30,
"translate_key": "connection_period"
}
]
}
]
}Opis pól filtra analitycznego
| Pole | Typ | Wymagane | Opis |
|---|---|---|---|
param | string | tak | Nazwa metryki analitycznej (patrz sekcja niżej) |
symbol | string | tak | Operator porównania: >, <, =, !=, >=, <=, is_empty, not_empty |
value | number/string | tak | Wartość progowa do porównania |
project_connection_id | integer | tak | ID połączenia projektu z platformą (np. konkretne konto Google Ads) |
sub_days | integer | warunkowe* | Liczba dni wstecz dla daty względnej (np. 30 = ostatnie 30 dni) |
start_date | string (YYYY-MM-DD) | warunkowe* | Data początku dla stałego zakresu dat |
end_date | string (YYYY-MM-DD) | warunkowe* | Data końca dla stałego zakresu dat |
translate_key | string | tak | Tryb wyświetlania w UI: connection_period (data względna) lub connection_range (stały zakres) |
* Albo
sub_days, albo parastart_date+end_date— jedno z nich jest wymagane. Gdy oba obecne,sub_daysma priorytet.
Dwa tryby zakresu czasowego
Tryb 1: Data względna (sub_days)
Użytkownik podaje liczbę dni wstecz od dziś. Zakres jest wyliczany dynamicznie przy każdym wykonaniu reguły.
json
{
"sub_days": 30,
"translate_key": "connection_period"
}UI wyświetla: "Last 30 days"
Kiedy używać: zawsze gdy użytkownik mówi „ostatnie N dni", „za ostatni miesiąc", „w ciągu ostatnich 90 dni" itp.
Tryb 2: Stały zakres dat (start_date + end_date)
Użytkownik podaje konkretne daty — zakres jest stały i nie zmienia się z czasem.
json
{
"start_date": "2025-01-01",
"end_date": "2025-03-31",
"translate_key": "connection_range"
}UI wyświetla: "2025-01-01 – 2025-03-31"
Kiedy używać: gdy użytkownik podaje konkretne daty np. „od 1 stycznia do 31 marca 2025".
Dostępne Kolumny Analityczne
Google Ads (project_connection_id → połączenie typu GOOGLE_ADS)
param | Metryka | Dozwolone operatory |
|---|---|---|
google_ads_impressions | Wyświetlenia | >, <, =, !=, >=, <=, is_empty, not_empty |
google_ads_clicks | Kliknięcia | >, <, =, !=, >=, <=, is_empty, not_empty |
google_ads_cost | Koszt | >, <, =, !=, >=, <=, is_empty, not_empty |
google_ads_avg_cpc | Średni CPC | >, <, =, !=, is_empty, not_empty |
google_ads_conversions | Konwersje | >, <, =, !=, is_empty, not_empty |
google_ads_conv_rate | Współczynnik konwersji | >, <, =, !=, is_empty, not_empty |
google_ads_total_conv_value | Łączna wartość konwersji | >, <, =, !=, is_empty, not_empty |
google_ads_cost_per_conversion | Koszt na konwersję | >, <, =, !=, is_empty, not_empty |
google_ads_roas | ROAS | >, <, =, !=, is_empty, not_empty |
Google Analytics 4 (project_connection_id → połączenie typu GOOGLE_ANALYTICS_4)
Dane dostępne z GA4: sesje, przychody, użytkownicy, koszyk, zamówienia i inne — zależnie od konfiguracji GA4 klienta.
Microsoft Ads (project_connection_id → połączenie typu BING_ADS)
Analogiczne metryki jak Google Ads: impressions, clicks, cost, conversions itp.
Jak Filtr Jest Wyświetlany w UI
Frontend (analytics-picker.component.ts) odczytuje sub_days, start_date, end_date z filtra i wyświetla:
sub_days ustawione → "Last 30 days" ← POPRAWNY widok
sub_days = null i brak start_date/end_date → "{{startDate}} - {{endDate}}" ← BŁĘDNY widok (niezinterpretowane zmienne)
start_date + end_date ustawione → "2025-01-01 – 2025-03-31"Gdy AI tworzy regułę bez sub_days i bez start_date/end_date — UI pokazuje surowe zmienne szablonu tłumaczenia, co sygnalizuje brak danych zakresu czasowego.
Oczekiwane Zachowanie Systemu
Krok 1 — Identyfikacja intencji
Gdy użytkownik podaje komendę z filtrem analitycznym, AI musi wyodrębnić:
- Metrykę →
param(np. „konwersje Google Ads" →google_ads_conversions) - Operator →
symbol(np. „większe niż" →>, „mniejsze niż" →<, „równe" →=) - Wartość progową →
value(np.5) - Zakres czasowy →
sub_dayslubstart_date/end_date(np. „ostatnie 30 dni" →sub_days: 30) - Platformę → typ połączenia (np. „Google Ads" →
GOOGLE_ADS)
Krok 2 — Dopytanie o brakujące dane
Jeśli użytkownik nie podał zakresu czasowego — AI MUSI zapytać przed stworzeniem reguły.
Przykładowe pytanie AI do użytkownika:
„Za jaki okres chcesz sprawdzić dane? Możesz podać:— liczbę dni wstecz (np. ostatnie 30 dni, 90 dni)— konkretny zakres dat (np. od 2025-01-01 do 2025-03-31)"
Nie wolno tworzyć reguły z domyślnym zakresem bez pytania — użytkownik musi świadomie podjąć tę decyzję, bo zakres czasowy bezpośrednio wpływa na to które produkty zostaną oznaczone.
Krok 3 — Identyfikacja połączenia projektu
AI musi znać project_connection_id — ID konkretnego konta reklamowego w projekcie.
Jeśli AI nie zna ID:
- Wywołuje narzędzie listujące dostępne połączenia projektu dla danej platformy
- Jeśli jest dokładnie jedno połączenie danego typu — używa go automatycznie
- Jeśli jest więcej połączeń — prezentuje listę i pyta użytkownika które wybrać
Krok 4 — Budowanie kompletnego filtra
AI wywołuje narzędzie create_product_rule z kompletnym filtrem:
json
{
"filterGroups": [
{
"filters": [
{
"param": "google_ads_conversions",
"symbol": ">",
"value": 5,
"project_connection_id": 123,
"sub_days": 30,
"translate_key": "connection_period"
}
]
}
],
"action": {
"action": "override",
"param": "custom_label_0",
"value": "Marketer"
},
"active": true
}Reguła poprawności:
- Dla daty względnej:
sub_days(integer > 0) +translate_key: "connection_period" - Dla stałego zakresu:
start_date+end_date(format YYYY-MM-DD) +translate_key: "connection_range" - Pole
symbolmusi zawierać jeden z dozwolonych operatorów — nigdy nie może być puste - Pole
project_connection_idjest zawsze wymagane
Krok 5 — Potwierdzenie przed zapisem
Przed wysłaniem żądania do API AI prezentuje użytkownikowi podsumowanie tworzonej reguły i czeka na potwierdzenie:
„Tworzę regułę:— Warunek: konwersje Google Ads > 5 (ostatnie 30 dni, konto: Sklep PL)— Akcja: ustaw etykietę niestandardową 0 = 'Marketer'Czy potwierdzasz?"
Znane Problemy i Wymagane Poprawki
Problem 1 — Brak sub_days w tworzonym filtrze
Objaw: UI wyświetla - zamiast np. "Last 30 days".
Przyczyna: Narzędzie MCP (create_product_rule w sembot_public-mcp) nie przekazuje pola sub_days do API, nawet gdy użytkownik podał zakres względny.
Wymagana poprawka:
- W schemacie narzędzia MCP dodać pole
sub_days(integer) w definicji filtra - Dodać instrukcję: dla dat względnych używać
sub_days+translate_key: "connection_period", niestart_date/end_date
Problem 2 — Brak translate_key w filtrze
Objaw: UI nie wie w jakim trybie wyświetlić przycisk zakresu dat.
Wymagana poprawka: Zawsze wysyłać translate_key przy filtrach analitycznych (connection_period lub connection_range).
Problem 3 — Brak operatora symbol
Objaw: Filtr tworzony bez operatora lub z niepoprawną nazwą pola.
Przyczyna: Pole operatora w API nazywa się symbol (nie operator). AI może używać błędnej nazwy.
Wymagana poprawka: W schemacie narzędzia MCP pole operatora filtra musi być nazwane symbol z enumem dozwolonych wartości: >, <, =, !=, >=, <=, is_empty, not_empty.
Problem 4 — AI nie pyta o zakres czasowy gdy brak danych
Objaw: AI tworzy regułę bez pytania o zakres, skutkując niekompletnym filtrem.
Wymagana poprawka: Dodać do system promptu agenta lub opisu narzędzia MCP instrukcję: przed wywołaniem create_product_rule z filtrem analitycznym zawsze upewnij się że masz zakres czasowy — jeśli użytkownik go nie podał, zapytaj.