Ostatnio dostałam zadanie, które na początku trochę mnie przestraszyło: raport w Power BI z AI z danych Salesforce do śledzenia demandu. Chodziło o to, żeby od razu widzieć, czy sprzedaż idzie zgodnie z planem. I czy nie mamy szans, które „mają się zamknąć w tym miesiącu”, a wciąż wiszą na etapie pierwszej rozmowy.
Problem? Proces sprzedażowy w Salesforce był dla mnie czarną magią. Mogłam przez kilka dni czytać dokumentację i dopytywać ludzi. Zamiast tego usiadłam z AI i przeszłam cały proces krok po kroku. Pierwsza wersja raportu była gotowa w pół dnia.
Jest tylko jeden haczyk, który pewnie znasz: w pracy nie mogę podpiąć AI do danych. Korzystałam z firmowego modelu lokalnego, w którym zbudowałam sobie agenta, eksperta od Power BI. Nie widział ani jednego wiersza danych. Dostawał nazwy kolumn, opis tematu i odpowiedzi klienta. Całą resztę klikałam sama w Power BI Desktop.

Z tej pracy wyszedł mi schemat w 7 krokach, który teraz stosuję przy każdym nowym raporcie. Przy każdym kroku dostajesz prompt do skopiowania. Kod pokazuję na fikcyjnych danych, więc możesz go od razu przetestować u siebie.
Table of Contents
Nie masz agenta? Zwykły czat też wystarczy
Agent daje głównie wygodę: nie tłumaczysz za każdym razem, kim jesteś i czego chcesz. Ten sam efekt dostaniesz, wklejając na początek rozmowy taki prompt:
Jesteś ekspertem Power BI (modelowanie, DAX, wizualizacja). Pomagasz mi zbudować raport od zera. Nie masz dostępu do danych - dostaniesz tylko nazwy kolumn i opis biznesowy. Pracujemy krokami: pytania do klienta, wybór kolumn, model gwiazdy, mockup strony, miary DAX, karty KPI, tabela. Gdy czegoś nie wiesz o moich danych, zapytaj zamiast zgadywać.
Jeśli pracujesz na publicznym czacie, najpierw sprawdź politykę firmy. I wklejaj tylko metadane: nazwy kolumn i definicje, nigdy wiersze z danymi.
Krok 1. Najpierw pytania, potem dane
Zanim otworzysz Power BI, zapytaj AI, o co zapytać klienta. Wystarczy temat raportu i lista nagłówków kolumn, bez żadnych wierszy danych.
Prompt:
Jestem analitykiem Power BI. Mam zbudować raport do monitorowania demandu na podstawie eksportu Opportunities z Salesforce. Nie znam tego procesu. Poniżej lista kolumn ze źródła. Zaproponuj 10-15 pytań, które powinnam zadać klientowi, zanim zacznę budować model i raport. Pogrupuj je na: cel biznesowy, definicje, plan/targety, odbiorcy i częstotliwość.
[wklej nagłówki kolumn]
W nawiasach kwadratowych wklejasz swoje dane. Nagłówki kolumn najszybciej skopiujesz z pierwszego wiersza pliku Excel lub CSV, wystarczy je wkleić jako listę oddzieloną przecinkami.
Przykładowe pytania, które dostaniesz:
- Który etap (Stage) uznajemy za „wczesny”, a od którego szansa jest „zaangażowana”?
- Czy plan jest liczony na kwotę (Amount) czy na kwotę ważoną prawdopodobieństwem?
- Z jakim planem porównujemy wyniki: miesięcznym, kwartalnym, per region czy per handlowiec?
- Co oznacza „przesunięta” szansa: każda zmiana Close Date czy tylko na kolejny miesiąc?
- Kto będzie używał raportu i jak często (cotygodniowy forecast call, przegląd miesięczny)?
Odpowiedzi klienta stają się kontekstem do wszystkich kolejnych kroków. Wklejaj je do rozmowy z AI.
Krok 2. Z 200 kolumn wybierz kilkanaście
Eksport z Salesforce miał u mnie około 200 kolumn. Przeszukiwanie tego ręcznie zajmuje godziny. AI zrobi pierwszą selekcję w minutę, bo zna typowe nazwy pól CRM.
Prompt:
Na podstawie odpowiedzi klienta [wklej] wybierz z poniższej listy kolumny potrzebne do raportu. Dla każdej podaj: po co jest potrzebna i do której tabeli modelu trafi (fakt czy wymiar). Osobno wypisz kolumny, które mogą się przydać później, ale teraz je pomijamy.
[wklej nagłówki kolumn]
Przykładowy wynik (wymyślony zbiór danych):
| Kolumna | Do czego | Tabela |
|---|---|---|
| Opportunity ID | klucz szansy | Fakt |
| Opportunity Name | opis w tabeli szczegółów | Fakt |
| Account Name | klient | Wymiar Account |
| Owner | handlowiec | Wymiar Owner |
| Region | podział na regiony i plan | Wymiar Region |
| Stage | etap lejka | Wymiar Stage |
| Probability (%) | kwota ważona | Fakt |
| Amount (EUR) | wartość szansy | Fakt |
| Forecast Category | Commit / Best Case / Pipeline | Fakt |
| Created Date | wiek szansy | Fakt + Kalendarz |
| Close Date | miesiąc zamknięcia | Fakt + Kalendarz |
| Original Close Date | pierwsza deklarowana data | Fakt |
| Close Date Push Count | ile razy przesunięto datę | Fakt |
| Last Stage Change Date | dni bez ruchu w lejku | Fakt |
Zawsze sprawdź wynik sama, bo AI nie zna specyfiki Twojej organizacji. Pola niestandardowe (np. licznik przesunięć daty) często mają w każdej firmie inną nazwę.
Krok 3. Model: wymiary i relacje
Gdy masz listę kolumn, poproś o projekt modelu gwiazdy. To moment, w którym AI najlepiej sprawdza się jako partner do dyskusji: pytaj „dlaczego?” i „co jeśli?”.
Prompt:
Zaprojektuj model gwiazdy w Power BI dla wybranych kolumn. Podaj: 1) tabelę faktów i wymiary z kolumnami, 2) relacje (kierunek, kardynalność, aktywna/nieaktywna), 3) jakie kolumny warto dodać w Power Query (np. sortowanie etapów). Mam dwie daty: Created Date i Close Date - jak je obsłużyć z jednym kalendarzem?
Wynik dla przykładu:
- FactOpportunity – jedna szansa = jeden wiersz (ID, kwoty, daty, licznik przesunięć).
- DimStage – Stage, StageOrder (1–7), StageGroup: Early (Prospecting, Qualification), Mid (Needs Analysis, Proposal), Late (Negotiation), Closed (Won, Lost).
- DimOwner – handlowiec. Region trzymam w osobnej tabeli DimRegion, bo łączy się z nią też plan (ten sam region ma kilku handlowców, więc plan nie może iść przez DimOwner).
- DimAccount – klient, branża.
- DimDate – kalendarz. Relacja aktywna po Close Date, nieaktywna po Created Date (włączana w mierze przez USERELATIONSHIP).
- FactPlan – plan miesięczny per region, połączony z DimDate (miesiąc) i DimRegion.
Wszystkie relacje 1:* z wymiaru do faktu, filtrowanie jednokierunkowe.

Krok 4. Mockup pierwszej strony
To krok, w którym mój agent jest najmocniejszy. Zanim przeciągniesz pierwszy wizual, poproś o prosty szkic strony: co gdzie stoi i na jakie pytanie odpowiada. Zmieniłam kilka elementów, ale gotowy szkic oszczędził mi najwięcej czasu w całym projekcie.
Prompt:
Zaproponuj układ pierwszej strony raportu (16:9) dla odbiorców: [kto]. Dla każdego elementu podaj: typ wizualizacji, miary, pytanie biznesowe, na które odpowiada. Maksymalnie 8 elementów. Narysuj układ jako siatkę ASCII.
Szkic dla przykładu:
+----------+----------+----------+----------+----------+ | Pipeline | Weighted | Won MTD | % planu | Ryzyko | <- 5 kart KPI (HTML) +----------+----------+----------+----------+----------+ | Pipeline vs plan wg miesiąca | Pipeline wg etapu | | (słupki + linia planu) | (słupki poziome) | +-------------------------------+-----------------------+ | Tabela: szanse z Close Date w tym miesiącu na wczesnym | | etapie + szanse przesuwane wielokrotnie (flagi, ikony) | +-------------------------------------------------------+ Fragmentatory: Region | Owner | Forecast Category
Krok 5. Wszystkie miary naraz: DEFINE MEASURE
Nie proś o miary pojedynczo. Poproś o jeden blok DEFINE MEASURE + EVALUATE, wklej go do widoku zapytań DAX (DAX query view) i uruchom. Od razu widzisz, czy liczby mają sens, a przyciskiem „Update model” dodajesz wszystkie miary do modelu jednym kliknięciem.
Prompt:
Na podstawie modelu [wklej opis tabel i kolumn] i mockupu [wklej] napisz wszystkie potrzebne miary jako jedno zapytanie DAX: DEFINE MEASURE ... oraz EVALUATE z SUMMARIZECOLUMNS po regionie, żebym mogła je zweryfikować w DAX query view. Używaj DIVIDE i zmiennych.
Wynik dla przykładu (kolumny po zmianie nazw w Power Query):
DEFINE
MEASURE FactOpportunity[Pipeline Amount] =
CALCULATE ( SUM ( FactOpportunity[Amount] ), DimStage[StageGroup] <> "Closed" )
MEASURE FactOpportunity[Weighted Pipeline] =
CALCULATE (
SUMX ( FactOpportunity, FactOpportunity[Amount] * FactOpportunity[Probability] / 100 ),
DimStage[StageGroup] <> "Closed"
)
MEASURE FactOpportunity[Won Amount] =
CALCULATE ( SUM ( FactOpportunity[Amount] ), DimStage[Stage] = "Closed Won" )
MEASURE FactOpportunity[Plan Amount] =
SUM ( FactPlan[PlanAmount] )
MEASURE FactOpportunity[% Plan] =
DIVIDE ( [Won Amount], [Plan Amount] )
MEASURE FactOpportunity[Pipeline Coverage] =
DIVIDE ( [Pipeline Amount], [Plan Amount] - [Won Amount] )
MEASURE FactOpportunity[At Risk Count] =
-- Close Date w bieżącym miesiącu, a szansa wciąż na wczesnym etapie
VAR _start = DATE ( YEAR ( TODAY () ), MONTH ( TODAY () ), 1 )
VAR _end = EOMONTH ( TODAY (), 0 )
RETURN
CALCULATE (
COUNTROWS ( FactOpportunity ),
DimStage[StageGroup] = "Early",
FactOpportunity[CloseDate] >= _start,
FactOpportunity[CloseDate] <= _end,
REMOVEFILTERS ( DimDate )
)
MEASURE FactOpportunity[Pushed Opps] =
-- otwarte szanse, którym Close Date przesunięto co najmniej 2 razy
CALCULATE (
COUNTROWS ( FactOpportunity ),
FactOpportunity[PushCount] >= 2,
DimStage[StageGroup] <> "Closed"
)
MEASURE FactOpportunity[Pipeline Created] =
CALCULATE (
SUM ( FactOpportunity[Amount] ),
USERELATIONSHIP ( FactOpportunity[CreatedDate], DimDate[Date] )
)
MEASURE FactOpportunity[Days Since Stage Change] =
DATEDIFF ( MAX ( FactOpportunity[LastStageChangeDate] ), TODAY (), DAY )
EVALUATE
SUMMARIZECOLUMNS (
DimRegion[Region],
"Pipeline", [Pipeline Amount],
"Weighted", [Weighted Pipeline],
"Won", [Won Amount],
"% Plan", [% Plan],
"Coverage", [Pipeline Coverage],
"At Risk", [At Risk Count],
"Pushed", [Pushed Opps]
)
Sprawdź wynik na kilku regionach, porównując go z raportem w Salesforce. Dopiero potem aktualizuj model.

Krok 6. Karty KPI w HTML zamiast standardowych kart
Najpierw wybierz motyw i tło raportu. Potem podaj AI kolory i poproś o karty jako miarę DAX zwracającą HTML. Wyświetlasz ją w wizualu typu HTML Content (z AppSource). Jedna miara = cała karta: tytuł, wartość, porównanie do planu i kolor statusu. Bez ustawiania dziesiątek opcji formatowania w każdej karcie osobno.
Prompt:
Mój motyw: tło #F7F8FA, akcent #2F5BEA, sukces #1E9E6A, ostrzeżenie #E5484D. Napisz miarę DAX zwracającą kartę KPI w HTML (inline CSS) dla [% Plan]: tytuł, wartość w %, Won vs Plan pod spodem, kolorowy pasek statusu (>= 100% zielony, 80-99% bursztynowy, < 80% czerwony). Zrób tak, żebym mogła skopiować ją dla innych KPI, zmieniając tylko zmienne.
Wynik:
KPI Card % Plan =
VAR _title = "Realizacja planu"
VAR _value = [% Plan]
VAR _sub = "Won " & FORMAT ( [Won Amount], "#,0" ) & " / plan " & FORMAT ( [Plan Amount], "#,0" ) & " EUR"
VAR _color =
SWITCH ( TRUE (),
_value >= 1, "#1E9E6A",
_value >= 0.8, "#F5A524",
"#E5484D"
)
RETURN
"<div style='font-family:Segoe UI;background:#FFFFFF;border-radius:12px;
padding:14px 16px;box-shadow:0 1px 4px rgba(0,0,0,.08);
border-left:6px solid " & _color & "'>
<div style='font-size:12px;color:#6B7280;text-transform:uppercase'>" & _title & "</div>
<div style='font-size:28px;font-weight:600;color:#111827'>" & FORMAT ( _value, "0%" ) & "</div>
<div style='font-size:11px;color:#6B7280'>" & _sub & "</div>
</div>"
Pozostałe karty (Pipeline, Weighted, Won MTD, Ryzyko) to ta sama miara ze zmienionymi zmiennymi _title, _value, _sub i progami koloru.
U mnie to był moment, w którym praca przyspieszyła najbardziej. Zamiast klikać formatowanie pięciu kart, poprawiałam kilka zmiennych w jednej mierze.

Firma blokuje wizuale z AppSource? Ten sam efekt da się uzyskać miarą zwracającą SVG. Ustawiasz jej kategorię danych na „Image URL” i wstawiasz do natywnej tabeli albo nowej karty. Wymaga to trochę więcej zabawy z kodem, ale działa bez żadnych dodatków.
Chcesz karty jak na zrzucie? Kod powyżej to prosta wersja, od której warto zacząć. Karty z mini-wizualizacjami (pasek realizacji ze znacznikiem „dziś”, luka do celu pokrycia, oś terminów w miesiącu i wykres jednostkowy przesunięć) są dłuższe, dlatego wrzuciłam je do repozytorium. Znajdziesz tam plik .dax ze wszystkimi miarami do wklejenia w DAX query view oraz fikcyjne dane CSV, na których zrobiłam zrzuty: [LINK DO REPOZYTORIUM].
Krok 7. Wykresy, tabela i flagi, które robią robotę
Wykresy słupkowe to proste ustawienia, tu AI nie jest potrzebne. Największą wartość w tabeli szczegółów dają dwa dodatki: kolor dla szans zagrożonych i ikona dla szans przesuwanych wielokrotnie. Odbiorca od razu widzi, gdzie zadać pytanie handlowcowi.
Miara statusu do formatowania warunkowego (Format → Cell elements → Background color → Field value):
Risk Color =
VAR _isEarly = SELECTEDVALUE ( DimStage[StageGroup] ) = "Early"
VAR _close = MAX ( FactOpportunity[CloseDate] )
VAR _thisMonth = _close <= EOMONTH ( TODAY (), 0 ) && _close >= DATE ( YEAR ( TODAY () ), MONTH ( TODAY () ), 1 )
VAR _pushes = MAX ( FactOpportunity[PushCount] )
RETURN
SWITCH ( TRUE (),
_isEarly && _thisMonth, "#FDE2E2", -- czerwone tło: zamknięcie w tym miesiącu, wczesny etap
_pushes >= 2, "#FFF1D6", -- bursztynowe: wielokrotnie przesuwana
BLANK ()
)
Ikona przy nazwie szansy:
Push Flag =
VAR _p = MAX ( FactOpportunity[PushCount] )
RETURN
SWITCH ( TRUE (),
_p >= 3, "⏪⏪ " & _p & "x",
_p = 2, "⏪ 2x",
BLANK ()
)
Kolumny tabeli: Opportunity Name, Account, Owner, Stage, Close Date, Original Close Date, Amount, Push Flag, Days Since Stage Change. Domyślne sortowanie: Close Date rosnąco.

Na zrzucie tabela ma jeszcze więcej: każda komórka to miara zwracająca grafikę SVG (kategoria danych „Adres URL obrazu”), więc działa w zwykłej tabeli Power BI, bez wizuali z AppSource. Pasek etapów lejka, pigułka terminu, ślad przesunięć daty, kwota ważona i pierścień dni bez ruchu są w tym samym pliku .dax w repozytorium: [LINK DO REPOZYTORIUM].
Jedna pułapka, na którą sama wpadłam: w adresie data:image/svg+xml trzeba zakodować nie tylko # jako %23, ale najpierw % jako %25. Inaczej tekst typu „20%” w SVG psuje wszystkie kolory i elementy robią się czarne.
Ściągawka: schemat na każdy nowy raport
AI nie musi widzieć Twoich danych, żeby przyspieszyć pracę. Wystarczą nazwy kolumn, odpowiedzi klienta i dobre pytania.
| Krok | Co dajesz AI | Co dostajesz |
|---|---|---|
| 1. Pytania do klienta | temat + nagłówki kolumn | lista pytań na pierwsze spotkanie |
| 2. Wybór kolumn | odpowiedzi klienta + nagłówki | kilkanaście kolumn z przypisaniem do tabel |
| 3. Model | wybrane kolumny | gwiazda: fakty, wymiary, relacje |
| 4. Mockup | model + odbiorcy | szkic strony z wizualizacjami |
| 5. Miary | model + mockup | jeden blok DEFINE MEASURE do weryfikacji |
| 6. Karty KPI | kolory motywu | miara HTML wielokrotnego użytku |
| 7. Tabela i flagi | definicje ryzyka | kolory i ikony do formatowania warunkowego |
Trzy zasady, które się sprawdziły:
- Nie wklejaj danych, tylko metadane. Nazwy kolumn i definicje biznesowe w zupełności wystarczą.
- Weryfikuj liczby sama. DAX query view i porównanie z systemem źródłowym to obowiązkowy krok.
- Traktuj AI jak partnera do rozmowy, nie wyrocznię. Najwięcej nauczyłam się, dopytując „dlaczego tak?”.
A Ty od czego zaczynasz nowy raport? Daj znać w komentarzu.

