CLI

Dokumentacja komend

Wszystkie komendy Zanfia CLI pogrupowane według zasobów w kolejności rejestracji w CLI: uwierzytelnianie, produkty, oferty, ustawienia koszyka, strona, e-maile, OTO, bumpy, kursy, certyfikaty, newslettery, społeczności, rozmowy, klienci, kampanie, segmenty, formularze, opinie, marka, zespół, zamówienia, subskrypcje, statystyki, rabaty, polecenia, reklamy Meta, workflowy, lejki, strony, social media, media.

25 min czytaniaOstatnia aktualizacja: 29 sie 2026

Wszystkie komendy obsługują --json dla wyjścia czytelnego maszynowo; --api-key <key> nadpisuje zapisane poświadczenie na jedno wywołanie, a --verbose loguje szczegóły zapytań i odpowiedzi. Te flagi globalne działają w dowolnym miejscu (zanfia --json products list i zanfia products list --json znaczą to samo). Kwoty są w jednostkach podrzędnych (minor units) (1999 = 19,99), chyba że flaga mówi inaczej. Każda komenda odpowiada ścieżce Workspace API, więc wszystko, co tu znajdziesz, działa też jako zwykłe zapytanie HTTP. Poniżej jest każda końcowa komenda — po jednym wierszu; <komenda> --help wypisuje pełną listę flag.

Opcje przyjmujące JSON a flaga wyjścia --json

Wszędzie tam, gdzie komenda przyjmuje wartość JSON (--json, --patch, --config, --chapters, …), działa zarówno --json <plik|inline>, jak i --json=<plik|inline>. Każda taka opcja przyjmuje JSON inline albo ścieżkę do pliku .json. W komendach, w których --json niesie treść zapytania, wyjście czytelne maszynowo włączysz przez -o json (albo podając flagę globalną przed komendą: zanfia --json offers update <id> --json body.json).

Uwierzytelnianie

KomendaZastosowanie
zanfia login [--address <url-platformy-twórcy>] [--api-url <url>]Logowanie przez przeglądarkę (strona zgody OAuth); zapisuje token ważny 90 dni. --address loguje jako członka społeczności na platformie danego twórcy — tylko Community API
zanfia register [--email <e>] [--name <n>] [--lang en|pl] [--access-code <c>] [--code <c>]Utwórz nowe konto twórcy z terminala (6-cyfrowy kod e-mailem) i zaloguj CLI; pominięte wartości są dopytywane
zanfia join <handle> [--email <e>] [--name <n>] [--code <c>]Dołącz do publicznej społeczności z terminala (kod e-mailem) i zapisz klucz członka — bez konta i przeglądarki
zanfia logoutWyczyść zapisane dane logowania
zanfia auth statusPokaż, co CLI ma zapisane: ścieżkę, źródło poświadczeń, termin ważności, URL API
zanfia auth set-key <key> [--api-url <url>]Zapisz klucz API jako poświadczenie (klucze członków: podaj URL api-community twórcy)
zanfia auth whoamiWorkspace (albo członek społeczności) stojący za bieżącym poświadczeniem

Produkty

KomendaZastosowanie
products listLista produktów w koncie
products get <id>Jeden produkt
products create --name <n> --type <course|newsletter|community|…> [--description] [--free | --amount <major> --currency <c> [--period one_time|monthly|yearly]]Nowy produkt; typy community/newsletter tworzą od razu pełną zawartość. --free / --amount dodatkowo tworzą domyślną ofertę (kwota tutaj w jednostkach głównych, np. 49.99)
products update <id> [--name] [--description]Zmień nazwę / opis
products publish <id>Status → opublikowany (widoczny dla klientów)
products draft <id>Status → draft (ukryty przed klientami)
products archive <id>Status → zarchiwizowany (to nie jest usunięcie)
products prices list <pid>Ceny zebrane ze wszystkich koszyków produktu
products prices create <pid> --amount <minor> --currency pln|usd|eur|gbp [--label]Dodaj jednorazową cenę płatną (tworzy domyślny koszyk, jeśli trzeba; synchronizacja bramki po stronie serwera)
products appointment get <pid>Konfiguracja rezerwacji produktu typu konsultacja / usługa / wydarzenie
products appointment set <pid> [--config=<json|plik>] [--booking-method native|external] [--booking-url] [--duration <min>] [--location] [--deliverable …] [--delivery-time <n> --delivery-unit days|weeks] [--revision-rounds <n|unlimited>] [--brief-method] [--brief-url] [--event-mode online|offline] [--starts <iso>] [--ends <iso>] [--capacity <n>] [--show-on-success on|off]Zaktualizuj konfigurację rezerwacji — najpierw czyta bieżącą, więc flagi częściowe wystarczą; pierwsza konfiguracja wymaga wszystkich pól obowiązkowych (albo --config)
products after-purchase get <pid>Ustawienia strony podziękowania i e-maili po zakupie
products after-purchase set <pid> [--settings=<json|plik>] [--thank-you-type defaultPage|redirect] [--redirect-url] [--email-buyer-purchase on|off] [--notify-owner-purchase on|off] [--email-buyer-failed on|off] [--notify-owner-failed on|off]Zaktualizuj ustawienia po zakupie (flagi częściowe się scalają); --settings dla pełnego obiektu z własną stroną podziękowania / treścią e-maili
products images set <pid> --image <url> [--image <url> …]Zastąp zdjęcia okładkowe (pełna zamiana; adresy https już hostowane — najpierw prześlij do biblioteki mediów)

Plany i pakiety (products plans)

Poziomy z dołączonymi produktami. Reguły pilnuje serwer: unikalne id planów, najwyżej jeden domyślny, jeden poziom pakietowania, a planu sprzedawanego aktywnymi cenami nie da się usunąć.

KomendaZastosowanie
products plans get <pid>Plany produktu: id, nazwa, aktywny, domyślny, dołączone produkty
products plans set <pid> --json <plik|inline>Pełna zamiana tablicy planów (albo {plans: [...]}) — wyślij każdy plan, który zostaje, z jego id; plany bez id są tworzone
products plans count-clients <pid> [--plan <planId>]Aktywni klienci, których efektywny plan to --plan (pomiń, by policzyć jeszcze niezapisany pierwszy/domyślny plan)
products plans set-client-plan <pid> --plan <planId> (--client <wcid> | --email <e>)Przenieś dostęp jednego klienta do innego planu — neutralne dla rozliczeń; członkostwo w społeczności uzgadnia serwer
products plans backfill <pid> --community <communityProductId> --confirmUtwórz od razu dokumenty członków społeczności dla każdego aktywnego klienta, którego plan ją zawiera

Zawartość produktu do pobrania (products files)

KomendaZastosowanie
products files get --product <pid>Obecność opisu + tabela plików produktu do pobrania
products files set-content --product <pid> (--content <md> | --content-file <ścieżka>)Zastąp opis Markdown wyświetlany nad listą plików
products files add --product <pid> (--url <url> --name <n> [--media-id] [--size] | --files=<json|plik>)Dołącz jeden plik albo kilka przez tablicę JSON {url, name, mediaId?, size?}; już dołączone mediaId są pomijane
products files remove <uid> --product <pid>Odłącz plik po jego uid
products files reorder <uid...> --product <pid>Zmień kolejność listy — podaj każdy obecny uid w nowej kolejności

Baza wiedzy (products kb)

Produkt typu baza wiedzy adresujesz jego id produktu. Zapisy są zatwierdzonymi edycjami: czyszczą też niepublikowany szkic danego artykułu w edytorze panelu.

KomendaZastosowanie
products kb get <pid>Kategorie (klucze drzewa = id do --category) i wszystkie artykuły, łącznie ze szkicami
products kb tree set <pid> --json <plik|inline>Zastąp całą kolejność — {"categories": [{"categoryId", "articleIds": []}, …]}, każda kategoria i artykuł; równoległa edycja jest odrzucana (tree-changed) — pobierz ponownie products kb get --json i ponów
products kb article get <pid> <aid>Jeden artykuł, pola opublikowane, pełna treść
products kb article create <pid> --title <t> --category <cid> [--content | --content-file] [--status draft|available|unavailable]Nowy artykuł (domyślnie draft)
products kb article update <pid> <aid> [--title] [--status] [--category <cid>] [--content | --content-file] [--cover <mediaId>:<url> | --clear-cover]Edytuj artykuł; --cover ustawia okładkę z biblioteki mediów (:<url> dla obrazu zewnętrznego)
products kb article delete <pid> <aid> --confirmTrwałe — aby zamiast tego ukryć, ustaw --status unavailable
products kb category add <pid> --name <n>Nowa kategoria główna
products kb category rename <pid> <cid> --name <n>Zmień nazwę (zdenormalizowana nazwa kategorii w artykułach podąża za nią)
products kb category delete <pid> <cid> [--delete-articles] --confirmTrwałe; niepusta kategoria wymaga --delete-articles

Oferty (koszyki)

Oferta to koszyk (checkout) produktu; <cid> pochodzi z offers list.

KomendaZastosowanie
offers list [--product <pid>]Przeglądaj oferty
offers get <cid>Jedna oferta z cenami i dołączonymi bumpami
offers create --product <pid> [--free] [--name <n>]Nowa oferta (oferty darmowe nie mają cen)
offers update <cid> [--name] [--slug] [--title] [--description] [--success-url <url|none>] [--language <kod|none>] [--show-testimonials on|off] [--show-plan-includes on|off] [--invoice-as-option on|off] [--hide-country-field on|off] [--show-phone-field off|optional|required] [--allow-promotion-code off|subscriptions|all] [--force-b2b on|off] [--show-express-checkout on|off] [--promote-net-prices on|off] [--stripe-tax-behavior inclusive|exclusive] [--multiple-purchases on|off] [--allow-plan-upgrade on|off] [--terms-url] [--privacy-policy-url] [--claim] [--disable-invoice-issuing on|off] [--disable-purchase-email-client on|off] [--tracking-integration-ids <ids|none>] [--json <patch>] …Edytuj dowolne ustawienie edytora koszyka — wygląd, formularz i UX, prawne, fakturowanie, powiadomienia, śledzenie (--help wypisuje wszystkie ~50 flag; wartości logiczne to on|off, none czyści). Głębokie pola (theme, deadline, afterPurchase, paymentMethodsDisplay, checkoutMedia, łańcuch oto …) idą przez --json; jawne flagi mają pierwszeństwo
offers publish <cid>Aktywuj (płatne oferty wymagają podłączonej bramki płatności)
offers unpublish <cid>Wstrzymaj — blokuje nowe zakupy
offers duplicate <cid> [--with-prices] [--name <n>]Skopiuj ofertę
offers set-default <cid>Ustaw jako domyślny koszyk produktu
offers delete <cid>Trwałe — ceny są archiwizowane w bramkach, a oferta odpinana od produktu; lepiej użyć offers unpublish
offers recovery preview <cid> <sessionId>Do kogo poszedłby e-mail ratujący koszyk i co by zawierał — nic nie jest wysyłane
offers recovery send <cid> <sessionId> --confirmWysyła prawdziwy e-mail „dokończ zakup" do osoby, która porzuciła sesję — najpierw preview
offers price add <cid> --type one_time|recurring|installments --amount <minor> --currency pln|usd|eur|gbp [--interval day|week|month|year] [--interval-count] [--cycles <n>] [--allow-cancellation] [--trial-days] [--label] [--invoice-name] [--hidden] [--description] [--sale-ends-at <iso> | --sale-days <n>] [--quantity-limit] [--show-available] [--compare-at <minor>] [--access-interval --access-count | --access-until <iso>] [--plan <planId>]Dodaj wariant ceny
offers price update <cid> <priceId> --operation activate|deactivate|hide|unhide|change-amount [--amount <minor>]Zmień cenę
offers price delete <cid> <priceId> [--remove]Archiwizuj (domyślnie) lub usuń całkowicie
offers price reorder <cid> --order id1,id2,…Kolejność wyświetlania — podaj wszystkie id cen

Ustawienia koszyka

Domyślne ustawienia całego konta, które czyta każda strona koszyka, o ile oferta nie nadpisuje danego pola sama.

KomendaZastosowanie
checkout-settings get [--lang pl]Ustawienia strony koszyka dla konta
checkout-settings update [--lang pl] [--terms-url] [--privacy-policy-url] [--claim] [--terms-content] [--privacy-policy-content] [--google-analytics-id] [--facebook-pixel-id] [--gtm-id] [--tiktok-pixel-id] [--promote-net-prices on|off] [--price-variants-placement belowDescription|aboveDescription|none] [--json <patch>]Linki / treści prawne, id śledzenia, ceny netto; głębsze pola (embeddedForm, checkoutTheme, cartTheme) przez --json; none czyści pole
checkout-settings consents listZgody (checkboxy), które kupujący widzą w koszyku, w kolejności wyświetlania
checkout-settings consents upsert <name> --label <t> --required|--optional --apply-to all|'<json>' [--url <url|none>] [--marketing-opt-in|--no-marketing-opt-in] [--json <body>]Dodaj lub edytuj jedną zgodę po jej stałej nazwie — id produktów/ofert są weryfikowane (nieznane id → 404)

Strona

Twoja publiczna strona: ustawienia platformy (tytuł, język, motyw, branding, strona główna, prywatność, panel klienta, polityka dostępu klientów, bazowy adres linków do klientów), flaga „na żywo", slug i własne domeny, układ sklepu oraz dokumenty prawne. Każde site update <sekcja> zapisuje atomowo tylko tę sekcję; każda przyjmuje --json <plik|inline>, a flagi typowane mają pierwszeństwo przed kluczami z JSON-a. Zmiany slugu, domen, aktywacji i dokumentów prawnych wymagają --confirm.

KomendaZastosowanie
site getTabela podsumowania: slug, domeny, aktywna, język, strona główna, motyw, flagi brandingu, zgoda cookies, polityka dostępu, bazowy adres komunikacji — zanfia --json site get daje pełny payload
site update general [--title <t>] [--description <t>] [--language pl|en|default] [--show-page-title on|off] [--json <patch>]Tytuł/opis strony, język interfejsu; --json przyjmuje też mainPage, mainPageId, mainPageCommunityId
site update theme [--theme <kolor>] [--gray-scale <skala>] [--radius <r>] [--style-variant solid|classic] [--from-brand on|off] [--json <patch>]Kolor akcentu, skala szarości, zaokrąglenia, styl; --json dla customColors, customCheckoutTheme, typography
site update branding [--logo-url <url|none>] [--logo-dark-url <url|none>] [--favicon-url <url|none>] [--hide-branding on|off] [--json <patch>]Loga i favicon (URL-e albo referencje biblioteki mediów logo / logoDark / platformFavicon przez --json); ukrycie plakietki „Powered by Zanfia" wymaga funkcji remove_branding (inaczej 403)
site update main-page --mode sales|dashboard|community [--page-id <id|none>] [--json <patch>]Co renderuje główny adres strony — w trybie sales --page-id ustawia własną opublikowaną stronę jako główną (404 nieznana strona, 409 nieopublikowana)
site update privacy --cookie-consent on|off [--json <patch>]Baner zgody na cookies
site update portal [--library-width full|boxed] [--library-layout grid|gallery|list] [--mobile-library-layout <l>] [--library-order newest|recently_purchased|alphabetical|custom] [--custom-order <ids>] [--group-by-type on|off] [--default-view library|community] [--messages on|off] [--client-messages on|off] [--clear] [--json <patch>]Personalizacja panelu klienta — cały obiekt jest zastępowany (najpierw odczytaj site get --json); --custom-order przyjmuje id produktów po przecinku, od góry, i włącza własną kolejność; --group-by-type on pokazuje widok "Wszystkie" jako społeczności + sekcje per typ zamiast jednej listy; --clear przywraca domyślne
site update communication --base-url app|platformSlug|platformDomain [--domain <host>] [--json <patch>]Z jakiego hosta korzystają linki wysyłane do klientów
site update access-policy --device-limit <n> [--replacement adaptive|always_allow|creator_approval_only] | --clear [--json <patch>]Limit urządzeń per klient (anty-współdzielenie) i co się dzieje po jego przekroczeniu; --clear (albo limit 0) wyłącza politykę
site activate --on|--off --confirmOpublikuj lub wyłącz stronę (flaga „na żywo" platformy)
site slug set <slug> --confirmZmień slug konta — ciężka operacja (przerejestrowuje hosty Stripe/Firebase/Vercel, czyści cache), każdy dotychczasowy link się zmienia; 409 slug-taken
site domains set <d1,d2,…>|none --confirmZastąp listę własnych domen (same nazwy hostów); 409 domain-taken, 400 restricted-domain; potem skieruj DNS na Zanfia
site domains verify [<d1,d2>]Sprawdzenie DNS + TLS na żywo — status per domena, rekordy DNS do dodania, rekordy w konflikcie, stan certyfikatu
site storefront getUkład sklepu: preset, tryb, tabela sekcji — --json dla pełnej konfiguracji
site storefront set --json <plik|inline>Zastąp całą konfigurację sklepu (sections wymagane) — edytuj wynik site storefront get --json i odeślij
site legal get [--language pl]Regulamin i polityka prywatności: URL, slug /documents/<slug> i treść per język
site legal set [--language pl] [--terms-content <md|plik> | --terms-url <url>] [--terms-slug <s>] [--privacy-content <md|plik> | --privacy-url <url>] [--privacy-slug <s>] --confirmWpisz dokument (markdown albo ścieżka do pliku → serwowany pod /documents/<slug>) lub podlinkuj zewnętrzny (--*-url); tryb wynika z podanej flagi

E-maile systemowe

E-maile, które Zanfia wysyła do Twoich klientów w Twoim imieniu (Strona → E-maile): nadpisania tematu/nagłówka/układu per e-mail, ramka brandingu i wysyłki testowe. <key> pochodzi z emails list.

KomendaZastosowanie
emails listKonfigurowalne e-maile systemowe ze statusem i efektywnym tematem
emails get <key>Jeden e-mail: temat/nagłówek (EN + PL), bloki układu, zmienne, cele linków
emails set <key> [--subject-en <t|none>] [--subject-pl <t|none>] [--headline-en <t|none>] [--headline-pl <t|none>] [--enable | --disable] [--layout=<json|plik>] [--reset]Dostosuj jeden e-mail — --layout zastępuje cały układ bloków, --disable działa tylko dla e-maili opcjonalnych, --reset przywraca wersję fabryczną
emails branding getBranding e-maili i domyślne wartości strony, z których dziedziczy
emails branding set [--logo-url <url|none>] [--accent-color <hex|none>] [--sender-name <n|none>] [--reply-to <e|none>]Logo w nagłówku, kolor akcentu, nazwa nadawcy, Reply-To — none wraca do wartości domyślnej strony
emails test <key> [--lang en|pl]Zakolejkuj wysyłkę testową (zapisana personalizacja, przykładowe dane) na Twój własny adres

Oferty jednorazowe (OTO)

Wielokrotnego użytku upselle po zakupie, pokazywane raz, na pełnym ekranie, między sukcesem płatności a stroną podziękowania. Te komendy zarządzają tylko dokumentami ofert; do łańcucha koszyka podpinasz je przez offers update <cid> --json='{"oto":{"enabled":true,"steps":[{"otoOfferId":"…"}]}}'.

KomendaZastosowanie
oto listOferty OTO w koncie
oto get <id>Jedna oferta OTO w całości
oto create --name <n> --product <pid> --price <priceId> --headline <t> [--product-name] [--description <md>] [--accept-cta <t>] [--decline-text <t>] [--timer-minutes <n|none>] [--json <body>]Nowe OTO wskazujące istniejący produkt i cenę (twórcy zwykle dodają najpierw osobną, obniżoną cenę); galeria media tylko przez --json
oto update <id> [te same flagi] [--json <body>]Edytuj treść / pola cenowe; --timer-minutes none usuwa odliczanie
oto delete <id> --confirmTrwałe; kroki oto.steps koszyków wciąż wskazujące to id zostają „wiszące"

Order bumpy

KomendaZastosowanie
bumps listOrder bumpy w koncie
bumps create --product <pid> --price <priceId> --name <n> [--description] [--cta]Nowy bump z istniejącej ceny (cena musi należeć do domyślnej oferty produktu)
bumps update <bumpId> [--name] [--description] [--cta] [--product <pid> --price <priceId>]Edytuj albo przepnij bump na inny produkt/cenę
bumps delete <bumpId>Usuń (oferty, które go używają, przestają go pokazywać)
bumps attach <cid> <bumpId> [--prices id,id]Pokaż bump w ofercie (bez --prices = wszystkie ceny; ponowne dołączenie zmienia zakres)
bumps detach <cid> <bumpId>Odepnij bump od oferty

Kursy

Wszystko adresujesz id produktu (z products list). Statusy: draft, public, hidden, locked; nowe moduły i lekcje zaczynają jako draft. Treść lekcji to Markdown, a aktualizacja zastępuje całe ciało treści — dla dłuższych tekstów używaj --content-file.

KomendaZastosowanie
courses get <pid>Pełna struktura modułów/lekcji ze statusami
courses analytics <pid> [--learners-limit <n>] [--learners-sort progress-desc|progress-asc|last-activity-desc]Zaangażowanie per lekcja, zdawalność quizów i lista kursantów
courses transcripts <pid>Mapa lekcja → wideo/transkrypcja (transkrypcję odczytasz przez media transcript <mediaId>)
courses module add <pid> --name <n> [--description]Nowy moduł w statusie draft
courses module update <pid> <mid> [--name] [--description] [--status] [--unlock-days <n> | --unlock-date <iso> | --clear-unlock] [--require-quiz-pass | --require-all-lessons | --clear-requirement]Edytuj moduł: nazwa, status, odblokowanie czasowe (drip), warunek ukończenia
courses module delete <pid> <mid>Trwałe, kaskadowo usuwa wszystkie lekcje modułu — aby zamiast tego ukryć, ustaw --status hidden
courses lesson get <pid> <lid> [--content]Szczegóły lekcji; --content wypisuje sam Markdown
courses lesson add <pid> --module <mid> --title <t> [--type article|video|externalVideo|task|quiz] [--description] [--video-media <mediaId>]Nowa lekcja w statusie draft
courses lesson update <pid> <lid> [--title] [--description] [--status] [--content | --content-file]Edytuj lekcję
courses lesson set-video <pid> <lid> --video-media <mediaId>Podepnij przesłane wideo
courses lesson set-thumbnail <pid> <lid> --media <mediaId> | --url <httpsUrl> | --clearMiniatura lekcji; przy lekcjach wideo ustawia też miniaturę odtwarzacza
courses lesson set-attachments <pid> <lid> --media <id,id,…> | --clearZastąp załączniki lekcji plikami z biblioteki mediów, w podanej kolejności (pełna lista; lesson get pokazuje obecne uid); --clear usuwa wszystkie
courses lesson video get <pid> <lid>Rozdziały, momenty i meta tagi zapisane na wideo lekcji
courses lesson video set <pid> <lid> [--chapters=<json|plik>] [--moments=<json|plik>] [--meta-tags=<json|plik>] --confirmZastąp podane listy (każda zastępuje całą swoją listę; pominięte zostają bez zmian). Rozdziały [{title, start, end}], momenty [{label, timestamp}] w sekundach, meta tagi [{property, value}]
courses lesson chapters generate <pid> <lid> [--locale pl|en] [--out <plik>]Propozycje rozdziałów AI z transkrypcji — wypisane (i opcjonalnie zapisane do pliku JSON), nie zapisywane; zastosuj przez courses lesson video set --chapters=<plik>. Zużywa kredyty AI (402 = kredyty wyczerpane)
courses lesson moments generate <pid> <lid> [--locale pl|en] [--out <plik>]Propozycje momentów AI, ten sam przepływ — zastosuj przez courses lesson video set --moments=<plik>
courses lesson delete <pid> <lid>Trwałe — aby zamiast tego ukryć lekcję, ustaw --status hidden
courses quiz list <pid> <lid>Pytania i ustawienia lekcji typu quiz
courses quiz add <pid> <lid> --type single|multi|truefalse --question <t> [--option <t> …] [--correct 1,3] [--correct-answer true|false] [--explanation] [--points <n>] | --json <plik|inline>Dodaj pytanie (typy wyboru: powtarzane --option + --correct liczone od 1; prawda/fałsz: --correct-answer)
courses quiz update <pid> <lid> <qid> [te same flagi | --json <plik|inline>]Zastąp pytanie w całości
courses quiz delete <pid> <lid> <qid>Trwałe
courses quiz reorder <pid> <lid> --order id,id,…Podaj każde id pytania
courses quiz settings <pid> <lid> [--passing-score <pct> | --clear-passing-score] [--max-attempts <n> | --clear-max-attempts] [--time-limit <s> | --clear-time-limit] [--shuffle-questions on|off] [--shuffle-options on|off] [--show-correct-answers on|off] [--require-pass on|off]Ocenianie, liczba podejść, losowa kolejność, blokady postępu
courses publish <pid> (--module <mid> | --lessons id,id) [--status draft|public|hidden|locked]Opublikuj moduł ze wszystkimi lekcjami albo zbiorczo zmień status wybranych lekcji
courses reorder modules <pid> --order id1,id2,…Ścisła permutacja — każde id modułu
courses reorder lessons <pid> --module <mid> --order id1,id2,…Ścisła permutacja — każde id lekcji w module

Certyfikaty

Certyfikaty ukończenia kursu: wystawiaj je klientom kursu, cofaj lub przywracaj, usuwaj unieważnione na stałe, wysyłaj e-mail ponownie i zarządzaj szablonami z projektanta. Id certyfikatów daje certificates list, id szablonów — certificates templates list.

KomendaZastosowanie
certificates list [--product <value>] [--limit <n>]Lista certyfikatów
certificates issue <productId> --client <a,b,...> [--only-completed|--no-only-completed] [--template <value>] --confirmWystaw certyfikaty (asynchronicznie)
certificates revoke <certificateId> --confirmUnieważnij certyfikat
certificates reinstate <certificateId>Przywróć certyfikat
certificates delete <certificateId> --confirmUsuń unieważniony certyfikat
certificates resend <certificateId> --confirmWyślij ponownie e-mail z certyfikatem
certificates templates listLista szablonów certyfikatów
certificates templates create --name <value> [--based-on <value>] [--design-config <json|file>]Utwórz szablon certyfikatu
certificates templates get <id>Szczegóły szablonu certyfikatu
certificates templates update <id> [--name <value>] [--template-json <json|file>] [--design-config <json|file>] [--default|--no-default]Aktualizuj szablon certyfikatu
certificates templates delete <id> --confirmUsuń szablon certyfikatu

Newslettery

Produkt typu newsletter adresujesz jego id produktu. Wydanie ma dwie widoczności: --status public|hidden (prywatne archiwum w strefie członkowskiej) i --landing public|hidden|locked (publiczna strona). Zmiany trafiają najpierw do szkicu i docierają do czytelników dopiero po draft publish.

KomendaZastosowanie
newsletters issues list --product <pid> [--limit] [--cursor]Zarchiwizowane wydania, łącznie z ukrytymi
newsletters issues create <pid> --subject <s>Wydanie ręczne („napisz post bez wysyłki") — ukryte, w trybie artykułu, bez treści
newsletters issues update <iid> --product <pid> [--status public|hidden] [--landing public|hidden|locked] [--render-mode snapshot|article] [--thumbnail <url>|none]Widoczność, którą wersję widzą czytelnicy (snapshot = wysłany e-mail, article = markdown), miniatura
newsletters issues copy <pid> --issue <id,id> --to <pid,pid> --confirmSkopiuj wydania do innych produktów newsletterowych; cele niebędące newsletterem są raportowane jako pominięte
newsletters issues draft save <pid> <iid> [--subject <s>] [--content <markdown|plik>] [--clear-subject] [--clear-content]Zapisz temat / treść markdown w szkicu; --content przyjmuje markdown inline lub ścieżkę do pliku
newsletters issues draft publish <pid> <iid> [--public] --confirmPrzenieś szkic do opublikowanego wydania (edytowana treść przełącza tryb renderowania na article; slug powstaje przy pierwszej publikacji); --public dodatkowo upublicznia wydanie
newsletters issues draft discard <pid> <iid> --confirmPorzuć zmiany ze szkicu; opublikowane wydanie zostaje bez zmian
newsletters issues delete <iid> --product <pid> --confirmTrwałe — aby zamiast tego ukryć, ustaw --status hidden
newsletters settings update --product <pid> [--archive-enabled on|off] [--archive-access disabled|unlimited|from_subscribe_date] [--publication-delay <dni|none>] [--default-status] [--default-visibility] [--archive-inbox=<json|plik>] [--double-opt-in none|external] [--client-tag <tag>…]Archiwum, skrzynka archiwum, double opt-in i tagi subskrybentów

Społeczności

Adresujesz id społeczności (z communities list). Działasz we własnym imieniu — dostęp do kanałów i uprawnienia moderacyjne są rozstrzygane per zapytanie. Posty i komentarze żyją w kanałach typu feed; treść to Markdown. Pisanie wymaga profilu członka w społeczności — także dla członków zespołu workspace'u. Komendy tylko dla zespołu są oznaczone.

KomendaZastosowanie
communities listTwoje społeczności (z id powiązanego produktu)
communities channels <cid>Kanały, które widzisz, wraz z Twoim poziomem dostępu
communities posts <cid> <chid> [--limit] [--cursor]Posty kanału feed, od najnowszych
communities search <cid> <query> [--limit]Wyszukiwanie pełnotekstowe w opublikowanych postach, które możesz czytać
communities chat messages <cid> <chid> [--thread <messageId>] [--limit] [--cursor]Wiadomości czatu, od najnowszych (usunięte jako tombstone); --thread wypisuje odpowiedzi w wątku
communities chat send <cid> <chid> (--content <t> | --content-file <ścieżka>) [--reply-to <messageId>]Wyślij wiadomość na czacie albo odpowiedź w wątku
communities chat edit <cid> <chid> <messageId> (--content | --content-file) [--thread <parentId>]Edytuj własną wiadomość
communities chat delete <cid> <chid> <messageId> [--thread <parentId>]Miękko usuń własną wiadomość (tombstone; wątki zostają)
communities channel create <cid> --name <n> --type feed|chat|link|support [--description] [--group <gid>] [--url <url>] [--readonly]Nowy kanał (--url wymagany dla kanałów link; --readonly = tryb ogłoszeń)
communities channel update <cid> <chid> [--name] [--description] [--url] [--readonly true|false]Edytuj kanał
communities channel delete <cid> <chid>Usuń kanał z całą zawartością — nieodwracalne
communities group create <cid> --name <n> [--description]Nowa sekcja paska bocznego
communities group update <cid> <gid> [--name] [--description]Edytuj sekcję
communities group delete <cid> <gid>Usuń sekcję — nieodwracalne
communities move <cid> (--channel <chid> | --group <gid>) (--into-group <gid> | --to-root | --before <id> | --after <id>)Zmień kolejność / położenie w pasku bocznym
communities post get <cid> <postId> [--content]Szczegóły posta; --content wypisuje sam Markdown
communities post create <cid> <chid> --title <t> (--content <md> | --content-file <ścieżka>)Nowy post w kanale feed
communities post update <cid> <postId> [--title] [--content | --content-file]Edytuj post
communities post delete <cid> <postId>Miękkie usunięcie (autor lub moderator)
communities post pin <cid> <postId>Przypnij na górze kanału (zespół)
communities post unpin <cid> <postId>Odepnij (zespół)
communities comments <cid> <postId> [--limit] [--cursor]Komentarze, od najstarszych; odpowiedzi niosą parentCommentId
communities comment create <cid> <postId> (--content <md> | --content-file) [--reply-to <commentId>]Komentarz lub odpowiedź w wątku
communities comment update <cid> <commentId> (--content | --content-file)Edytuj komentarz
communities comment delete <cid> <commentId>Miękkie usunięcie (autor lub moderator)
communities support queue <cid> [--status open|in_progress|pending_customer|resolved|closed] [--limit]Kolejka zgłoszeń do supportu (moderatorzy)
communities support mine <cid> [--status]Twoje własne zgłoszenia
communities support show <cid> <ticketId>Jedno zgłoszenie z wątkiem wiadomości
communities support create <cid> --channel <chid> --subject <s> (--message <md> | --message-file <ścieżka>)Załóż zgłoszenie w kanale supportu
communities support reply <cid> <ticketId> (--content <md> | --content-file)Odpowiedz w zgłoszeniu
communities support status <cid> <ticketId> <status>Zmień status zgłoszenia
communities members <cid> [--role <roleId> | --disabled true|false | --email-prefix <p>] [--limit] [--cursor]Lista członków (zespół); trzy filtry wykluczają się wzajemnie
communities member set-roles <cid> <memberId> <roleId...>W całości zastąp zestaw ról członka (zespół)
communities member disable <cid> <memberId>Odwracalny soft-ban (zespół)
communities member enable <cid> <memberId>Przywróć wyłączonego członka (zespół)
communities member mute <cid> <memberId> --minutes <n>Wyciszenie na 1..40320 minut (zespół)
communities member unmute <cid> <memberId>Zdejmij aktywne wyciszenie (zespół)
communities settings get <cid>Dokument ustawień (null = obowiązują domyślne) (zespół)
communities settings update <cid> [--patch=<json|plik>] [--events-enabled on|off] [--direct-messages on|off] [--content-visible-from-join-date on|off] [--gamification on|off] [--auto-hide-after-reports <n|off>]Zmień ustawienia — klucze patcha JSON: uploadVideo, membersDisplay, viewStyle, displayName, icon, publicAccess, gamification, moderation, assistant, digest, …; zagnieżdżone bloki w patchu zastępują swój podobiekt, przełączniki się scalają (zespół)
communities roles <cid>Role w kolejności pozycji (Owner pierwszy)
communities role create <cid> --name <n> [--color <hex>] [--icon] [--position <n>] [--permissions=<json|plik>] [--content-access=<json|plik>]Nowa rola własna (zespół)
communities role update <cid> <roleId> [--name] [--color] [--icon] [--permissions=<json|plik>] [--content-access=<json|plik>]Edytuj rolę — wbudowana rola Owner jest niezmienna (zespół)
communities role delete <cid> <roleId> --confirmUsuń rolę — jej posiadacze wracają do roli Member (zespół)
communities role reorder <cid> <roleId...>Podaj każde id roli w nowej kolejności, Owner pierwszy (zespół)
communities events list <cid> [--from <iso>] [--to <iso>] [--exclude-cancelled] [--limit]Wydarzenia z kalendarza, od najbliższych
communities events create <cid> --title <t> --start <iso> --end <iso> --timezone <iana> --location=<json|plik> [--type liveCall|workshop|meetup|conference|retreat|other] [--all-day] [--description] [--json <plik>]Nowe wydarzenie (zespół); --location = {"type":"online","url":…} lub {"type":"inPerson","address":…}
communities events update <cid> <eventId> [te same flagi] [--all-day on|off] [--status scheduled|cancelled] [--json <plik>]Edytuj / odwołaj / przywróć wydarzenie (zespół)
communities events delete <cid> <eventId> --confirmUsuń wydarzenie (zespół)
communities moderation queue <cid>Zgłoszone posty / komentarze — oczekujące plus ostatnio rozpatrzone (zespół)
communities moderation resolve <cid> <reportId> --action remove|dismiss [--note] --confirmUsuń treść (autor dostaje powiadomienie) lub odrzuć zgłoszenie

Rozmowy (wiadomości do klientów)

Skrzynka wiadomości prywatnych twórca ↔ klient. Rozmowy są kluczowane id klienta (wcid).

KomendaZastosowanie
conversations list [--unread] [--limit] [--cursor]Skrzynka, od ostatniej aktywności
conversations get <clientId>Jedna rozmowa (wiersz skrzynki)
conversations messages <clientId> [--limit] [--cursor]Wiadomości, od najnowszych (usunięte jako tombstone)
conversations send <clientId> (--content <t> | --content-file <ścieżka>) [--message-id <id>]Wyślij wiadomość od zespołu; --message-id to klucz idempotencji
conversations edit <clientId> <messageId> (--content | --content-file)Edytuj własną wiadomość
conversations delete <clientId> <messageId> --confirmMiękko usuń własną wiadomość (tombstone po obu stronach)
conversations react <clientId> <messageId> --emoji <emoji>Przełącz swoją reakcję emoji
conversations read <clientId>Oznacz jako przeczytane (wspólny znacznik zespołu)
conversations broadcast (--recipients <id…> | --recipients-file <ścieżka>) (--content | --content-file) [--notify-by-email] --confirmWysyła DM do każdego z listy (maks. 5000), nieodwracalnie — rozsyłka działa asynchronicznie

Klienci

KomendaZastosowanie
clients list [--search <q>] [--with-products | --without-products] [--limit] [--cursor]Przeglądaj klientów, od najnowszych
clients add --email <e> [--first-name] [--last-name] [--phone] [--language]Utwórz wyłącznie kontakt — dostęp do produktu nadaje się osobno
clients get <id>Jeden klient
clients tagsRejestr tagów konta — id, które przyjmuje clients import --tag
clients email-log <id> [--limit <n>]E-maile wysłane do klienta przez Zanfię i ich status doręczenia
clients accesses <id> [--status active|revoked|expired]Wszystkie dostępy klienta do produktów, od najnowszych
clients notes <id>Wewnętrzne notatki CRM (tylko dla zespołu, klient ich nie widzi)
clients add-note <id> --text <t>Dodaj wewnętrzną notatkę (do 5000 znaków)
clients update <id> [--first-name] [--last-name] [--phone] [--language]Edytuj profil
clients grant <productId> --email <e> [--first-name] [--last-name] [--price <priceId>] [--plan <planId>] [--until <data>] [--welcome-email]Nadaj dostęp do produktu bez zakupu (darmowy zapis pod istniejącą ceną / planem, opcjonalnie ograniczony w czasie; bez e-maila, chyba że --welcome-email)
clients revoke <productId> --email <e> [--run-automations]Odbierz dostęp — nigdy nie zwraca pieniędzy i odmawia przy aktywnych płatnych subskrypcjach
clients change-period <productId> --email <e> (--end <data> | --add-days <n>)Zmień okres dostępu ograniczonego w czasie (data bezwzględna albo liczba dni; ujemna skraca)
clients cancel-subscription <productId> --email <e> --confirmZatrzymaj rozliczanie subskrypcji klienta — dostęp trwa do końca opłaconego okresu (409 = to nie subskrypcja / bramka niepodłączona)
clients change-email <id> --email <e>Zmień e-mail (profil, dostępy i logowanie przechodzą razem z nim)
clients import <plikCsv> [--tag <tagId> …]Zaimportuj hurtowo kontakty z CSV (email + opcjonalnie firstName/lastName/phoneNumber/language); partie po 100, istniejące e-maile pomijane
clients merge-preview --survivor <wcid> --duplicate <wcid>Próbne scalenie — pokazuje, co by się stało, i wypisuje previewHash wymagany przez scalenie
clients merge --survivor <wcid> --duplicate <wcid> --preview-hash <hash>Nieodwracalnie scal duplikat z klientem docelowym (dostępy przechodzą/deduplikują się, treści w społeczności są przepinane, duplikat dostaje tombstone); nieaktualny hash jest odrzucany (409); aktywne subskrypcje blokują scalenie
clients bulk-revoke <productId> (--email a,b,… | --all) [--run-tasks] --confirmOdbierz dostęp wielu klientom w jednym przebiegu w tle (bez zwrotów) — 202 z id przebiegu Trigger; postęp w zakładce Zadania w panelu
clients bulk-change-period <productId> (--email a,b,… | --all) (--end-date <iso> | --add-days <n>) --confirmPrzesuń koniec dostępu wielu klientom naraz (data bezwzględna albo liczba dni) — 202 z id przebiegu
clients bulk-delete <productId> (--email a,b,… | --all) --confirmUsuń dostępy wielu klientów do produktu w jednym przebiegu (rekordy klientów zostają; do nich służy clients delete) — 202 z id przebiegu
clients bulk-revoke-filtered --product <id,id> --filter=<json|plik> [--run-tasks] --confirmOdbierz dostęp każdemu klientowi pasującemu do filtra listy Klienci (productsFilter, search, tagIds, productIds, emailSubscriptionStatus, minTotalSpent, ordersFilter, …) w maks. 10 produktach — zbiór wyliczany po stronie serwera, 202 z id przebiegu
clients delete --id <a,b,…> --confirmUsuń (tombstone) klientów po id — id z aktywnym dostępem do produktu są pomijane (najpierw odbierz dostęp); partie po 200
clients export [--out <plik>] [--columns tags,stats,emailSubscription,activity,accesses,invoiceData,attribution,identifiers] [--created-from <iso>] [--created-to <iso>] [--limit <n>] [--search] [--with-products|--without-products]CSV klientów zapisany do --out (domyślnie zanfia-clients.csv) — kolumny tożsamości zawsze, dodatkowe grupy przez --columns; podaje liczbę wierszy i czy limit uciął eksport
clients devices list <id>Aktywne sloty urządzeń klienta w ramach polityki dostępu (site update access-policy) — id, rodzaj, nazwa, pierwsze/ostatnie użycie, aktywne do
clients devices revoke <id> <deviceId> --confirmWyloguj jedno urządzenie — musi ponownie zająć slot
clients devices reset <id> --confirmWyloguj wszystkie urządzenia i wyczyść sloty klienta — zwraca revokedCount

Odpowiedź 503 z komend bulk oznacza, że scheduler Trigger.dev nie jest skonfigurowany w tym środowisku.

Kampanie (wysyłki e-mail)

Szkice są bezpieczne; campaigns send wysyła e-maile do prawdziwych ludzi. Odbiorcy to zapisany segment (--segment, wyliczany ponownie w chwili wysyłki) albo wszyscy subskrybujący klienci (--all-subscribed, domyślnie).

KomendaZastosowanie
campaigns listKampanie e-mail
campaigns get <id>Jedna kampania: status, nadawca, odbiorcy, statystyki, treść
campaigns create --name <n> [--subject] [--preheader] [--content <md> | --content-file <ścieżka>] [--from-name <n>] [--reply-to <e>] [--from-email <e>] [--segment <segmentId> | --all-subscribed] [--background-color <hex>] [--content-background-color <hex>] [--link-color <hex>]Utwórz szkic — nic nie jest wysyłane; teraz wymagane jest tylko --name (temat/treść/nadawcę egzekwuje send); --from-email wymaga zweryfikowanej domeny wysyłkowej konta
campaigns update <id> [te same flagi]Edytuj szkic (kampanie po etapie szkicu są niezmienne poza anulowaniem); --content zastępuje całą treść
campaigns delete <id>Trwałe — tylko szkic/anulowana/nieudana (wysłane kampanie to zapis audytowy i zostają)
campaigns send <id> [--at <iso>] --confirmWysyła prawdziwą masową korespondencję do całej wyliczonej grupy, nieodwracalnie; bez --at wysyła od razu, --at planuje (maks. 30 dni naprzód)
campaigns cancel <id>Anuluj zaplanowaną lub trwającą kampanię — zatrzymuje tylko pozostałe wysyłki
campaigns recipients <id> [--status pending|sent|delivered|skipped-suppressed|skipped-muted|failed|bounced|complained|clicked] [--limit] [--cursor]Lista odbiorców z raportu

Segmenty

Zapisane zestawy warunków (łączonych AND) nad listą klientów — grupy odbiorców kampanii. Flagi warunków można powtarzać; --json-file przyjmuje warunki jako tablicę JSON zamiast flag.

KomendaZastosowanie
segments listSegmenty odbiorców
segments create --name <n> [--has-tag <tagId>] [--without-tag <tagId>] [--owns <pid>] [--not-owns <pid>] [--spent-gte <minor>] [--spent-lte <minor>] [--subscription pending|subscribed|unsubscribed] | --json-file <ścieżka>Nowy segment (nazwa unikalna w koncie, maks. 80 znaków)
segments update <id> [--name] [flagi warunków | --json-file <ścieżka>]Zmień nazwę i/lub zastąp cały zestaw warunków
segments delete <id>Usuń — wysłane kampanie zostają bez zmian; szkice kierowane do segmentu nie wyślą się, dopóki ich nie przepniesz
segments preview [flagi warunków | --json-file <ścieżka>]Policz pasujących klientów bez zapisywania czegokolwiek

Formularze zapisu

Samodzielne formularze zapisu (newsletter / lead capture). forms list pokazuje też stare formularze przypięte do produktu, które edytujesz tylko w edytorze produktu.

KomendaZastosowanie
forms listFormularze zapisu (samodzielne + stare produktowe, oznaczone)
forms get <id>Jeden formularz: ustawienia + pełna konfiguracja osadzenia
forms create --name <n> [--tags <id,id>] [--header] [--description] [--button-text] [--success-message] [--variant basic|card|richCard|minimal|split|gradient]Nowy samodzielny formularz (domyślnie double opt-in)
forms update <id> [--name] [--tags <ids>] [--opt-in double|single] [--redirect <url|none>] [--confirmation-subject] [--confirmation-intro] [--clear-confirmation-email] [--header] [--description] [--button-text] [--success-message] [--variant] [--json <patch>]Edytuj — płaskie flagi konfiguracji są scalane z bieżącą konfiguracją osadzenia; obiekt config z --json jest wysyłany jako pełna zamiana (płaskie flagi nadal wygrywają); none czyści
forms delete <id> --confirmTrwałe; stare formularze produktowe API odrzuca
forms submissions <id> [--limit <n>]Zgłoszenia, od najnowszych

Opinie (wall of love)

Moderacja, ręczne dodawanie, formularze zbierania i prośby do klientów o opinię. Statusy: pending, approved, hidden.

KomendaZastosowanie
testimonials list [--status pending|approved|hidden] [--product <pid>] [--tag <t>] [--limit] [--cursor]Widok zarządzania — łącznie z oczekującymi/ukrytymi
testimonials add --quote <t> --author <n> [--type text|imported] [--rating 1-5] [--role] [--avatar-url] [--products <id,id>] [--tags <a,b>] [--imported-from <źródło>] [--client <clientId>]Dodaj opinię tekstową albo odnotuj zaimportowaną (opinii wideo nie da się dodać tą drogą)
testimonials update <id> [--approve | --hide | --pending] [--feature | --unfeature] [--quote] [--rating <1-5|none>] [--author] [--role <r|none>] [--avatar-url <url|none>] [--products <ids>] [--tags <tagi>] [--client <id|none>]Skróty moderacji plus zmiany pól; none czyści pola opcjonalne, pusty string czyści listy
testimonials delete <id> --confirmTrwałe
testimonials request --client <clientId> [--product <pid>] [--form <formId>] --confirmWysyła prawdziwy e-mail z prośbą o opinię — formularz wybiera serwer (--form, inaczej aktywny formularz produktu, inaczej ogólny formularz konta)
testimonials forms listFormularze zbierania opinii (publiczne strony zgłoszeń)
testimonials forms create --name <n> [--slug] [--product <pid>] [--headline] [--questions "P1|P2"] [--collect-rating on|off] [--collect-role on|off] [--allow-video on|off] [--thank-you <msg>]Nowy formularz zbierania (bez --product = ogólny dla konta)
testimonials forms update <id> [--name] [--slug] [--product <pid|none>] [--headline <t|none>] [--questions "P1|P2"] [--collect-rating on|off] [--collect-role on|off] [--allow-video on|off] [--thank-you <msg|none>] [--activate | --deactivate]Edytuj / aktywuj / dezaktywuj formularz zbierania
testimonials forms delete <id> --confirmTrwałe

Profile marki

Wyekstrahowana lub ręcznie zbudowana tożsamość marki (kolory, fonty, głos), używana przez generowanie treści i site update theme --from-brand.

KomendaZastosowanie
brand listProfile marki
brand get <id>Jeden profil — tak też odpytujesz trwającą ekstrakcję
brand create --name <n>Pusty profil do wypełnienia przez brand update
brand extract <url> [--name <n>] [--into <brandProfileId>]Wyekstrahuj profil ze strony WWW (asynchronicznie — zaczyna jako pending; odpytuj brand get, aż będzie ready/failed); --into ekstrahuje ponownie do istniejącego profilu, zachowując pola edytowane ręcznie
brand update <id> [--name <n>] [--json-file <ścieżka>]Zmień nazwę albo zaaplikuj patch { name?, visual?, editorial? } — podane bloki najwyższego poziomu są zastępowane w całości
brand delete <id>Trwałe — bez cofnięcia i archiwum; generowanie treści, które go używało, działa dalej bez kontekstu marki

Zespół

Członkowie zespołu konta i zaproszenia. Role: admin, editor, content_creator, viewer.

KomendaZastosowanie
team membersCzłonkowie zespołu
team invitationsOczekujące zaproszenia (przyjęte/cofnięte/wygasłe to historia)
team invite <email> --role admin|editor|content_creator|viewer [--name <n>]Zaproś osobę — link do akceptacji dostaje e-mailem
team resend <invitationId>Wyślij ponownie oczekujące zaproszenie ze świeżym linkiem (odstęp 60 s)
team revoke <invitationId>Cofnij oczekujące zaproszenie — link natychmiast przestaje działać
team set-role <userId> <role>Zmień rolę członka w koncie
team remove <userId>Usuń członka — traci dostęp natychmiast; nieodwracalne (zaproś ponownie, by przywrócić)

Zamówienia

KomendaZastosowanie
orders list [--product] [--status paid|pending|refunded|failed] [--from/--to] [--search] [--include-test] [--limit/--cursor]Historia zamówień, od najnowszych — ręczne zamówienia przelewem czekające na decyzję mają --status pending; symulowane zakupy testowe tylko z --include-test
orders get <orderId>Jedno zamówienie: płatność, zwrot, order bumpy, faktura
orders approve <orderId> [--issue-invoice] --confirmZatwierdź ręczne zamówienie (przelew) — nadaje dostęp i wysyła e-mail zakupowy; --issue-invoice dodatkowo wystawia fakturę przez podłączone konto fakturowe (409 = już rozstrzygnięte)
orders reject <orderId> --confirmOdrzuć ręczne zamówienie — anuluje je i powiadamia kupującego (409 = już rozstrzygnięte)
orders export --from <data> --to <data> [--product] [--status] [--search] [--include-test] [--max-rows <n>] [--out <plik>]CSV zamówień do pliku — okno --from/--to jest wymagane; te same filtry co orders list (limit wierszy domyślnie 10000, maks. 20000)

Subskrypcje

Obsługa płatności cyklicznych: nieudane obciążenia, klienci na planach z ręcznym odnowieniem i kończące się subskrypcje.

KomendaZastosowanie
subscriptions failedNieudane obciążenia subskrypcji / rat — klient, produkt, kwota, liczba prób i następna automatyczna próba Stripe, id faktury, link do faktury; informuje, gdy Stripe nie jest podłączony (brak danych na żywo)
subscriptions retry <invoiceId> --confirmPonów nieudane obciążenie po id faktury Stripe (in_…) — prawdziwa próba obciążenia; wynik to paid, requires_action (podeślij klientowi link do faktury), card_declined, not_eligible albo failed
subscriptions upcomingKlienci na planach z ręcznym odnowieniem, którym wkrótce kończy się dostęp — dni do końca, ostatnie przypomnienie i link do odnowienia, który muszą kliknąć
subscriptions endingAktywne subskrypcje z anulowaniem na koniec okresu — płacą do wskazanej daty, potem odchodzą, chyba że klient cofnie anulowanie

Statystyki

Zakres przez --period 24h|7d|30d|90d albo --from/--to (data lub chwila ISO); --currency wymusza walutę raportu.

KomendaZastosowanie
stats overviewOgólny przegląd przychodów / zamówień
stats sales [--period] [--from] [--to] [--currency]Raport sprzedaży: przychód, zwroty, AOV, rozbicie per produkt
stats recurring [--currency]Migawka MRR / ARR aktywnych subskrypcji
stats mrr-history [--period] [--from] [--to] [--currency]MRR w czasie + seria churnu z dziennych migawek
stats funnel [--period] [--from] [--to]Lejek koszyka: sesje → konwersje, per koszyk
stats traffic [--period] [--from] [--to]Ruch na stronach: wyświetlenia / wejścia / zakupy per strona i źródło
stats sessions [--period] [--from] [--to] [--limit]Ostatnie sesje koszyka ze wszystkich koszyków
stats product <id> [--currency]Puls produktu (ostatnie 30 dni): przychód, kursanci, zaangażowanie, uwaga
stats conversion-events [--order] [--checkout] [--session] [--status a,b] [--client a,b] [--limit]Dziennik zdarzeń śledzenia konwersji — czy Purchase dotarł do Meta / GA4 / TikToka i z jakim wynikiem
stats conversion-health [--since-days <n>]Ocena doręczalności per integracja (healthy / degraded / failing / inactive)

Rabaty

KomendaZastosowanie
discounts listKody rabatowe
discounts create --code <KOD> (--percent-off <pct> | --amount-off <minor> --currency <c>) [--product <id> …] [--max-redemptions <n>] [--starts <iso>] [--ends <iso>] [--forever] [--inactive]Nowy kod — dokładnie jedno z --percent-off / --amount-off; --forever obejmuje każde odnowienie subskrypcji (domyślnie: tylko pierwsza płatność)
discounts update <discountId> [--percent-off | --amount-off --currency] [--product <id> …] [--max-redemptions <n> | --clear-max-redemptions] [--ends <iso> | --clear-ends] [--forever] [--active | --inactive]Zmień wartość, produkty, limity, daty, stan aktywności
discounts archive <discountId>Miękkie usunięcie — kod przestaje działać w koszyku
discounts delete <discountId>Trwałe — lepiej użyć discounts archive

Polecenia

Programy poleceń i afiliacyjne: program obejmuje jeden lub więcej produktów, zapisani klienci dostają osobisty kod polecający, a zakupy przypisane do kodu liczą się jako polecenia. Nagrody za progi (rodzaj referral) są zatwierdzane automatycznie albo przez Ciebie; nagrody, których dostarczenie się nie powiodło, można ponowić. Id programów daje referrals list, id uczestników i wpisów — referrals get. Głęboka konfiguracja (milestones, commission, attribution) idzie jako jeden obiekt JSON — --json <plik|inline>.

KomendaZastosowanie
referrals listProgramy z rodzajem, statusem, trybem zapisów, liczbą produktów i głównymi statystykami (uczestnicy, ważne polecenia, nagrody czekające na zatwierdzenie)
referrals get <programId>Panel programu: podsumowanie, uczestnicy (kody, statystyki), nagrody czekające na zatwierdzenie i nieudane dostarczenia — --json zwraca pełne dokumenty
referrals create --kind referral|affiliate --name <n> --product <id,id,…> [--enrollment open|inviteOnly|closed] [--status active|inactive] [--json <json|plik>]Utwórz program — --json niesie milestones (drabinkę nagród), commission (warunki afiliacyjne) i attribution (okno, atrybucja kuponem, rabat dwustronny); flagi mają pierwszeństwo przed kluczami z --json
referrals update <programId> [--name <n>] [--status active|inactive] [--product <id,id,…>] [--enrollment <tryb>] [--json <json|plik>]Zaktualizuj program — --product i milestones z --json zastępują całość (najpierw odczytaj program)
referrals archive <programId> --confirmZarchiwizuj program — nowe polecenia przestają się liczyć, a program znika z aktywnej listy
referrals enroll <programId> (--client <clientId> | --email <email>) [--first-name <n>] [--last-name <n>]Zapisz jednego klienta jako uczestnika i wypisz jego kod polecający — idempotentne, powtórka zwraca alreadyEnrolled
referrals enroll-all <programId> --confirmZapisz każdego klienta z dostępem do któregoś z produktów programu — zwraca enrolled / alreadyEnrolled / skippedWithoutAccount (dostęp z czasów bez konta logowania)
referrals resolve <programId> <entryId> --decision approve|reject --confirmZatwierdź (dostarcza nagrodę) lub odrzuć nagrodę czekającą na ręczne zatwierdzenie; odpowiedź mówi, czy dostarczenie już się odbyło
referrals retry-delivery <programId> <entryId>Ponów dostarczenie nagrody z listy nieudanych dostarczeń

Reklamy (Meta)

Meta Ads na podłączonych kontach reklamowych: wydatki per reklama połączone z zamówieniami Zanfia (atrybucja przez id reklamy w utm_content, które niosą tagi URL reklam), katalog reklam stojący za tymi id oraz zarządzanie kampaniami / zestawami reklam / reklamami / kreacjami. Id połączenia znajdziesz w Ustawienia → Integracje → Meta, id konta reklamowego to act_… z Meta. Budżety są w jednostkach podrzędnych waluty konta. Każda komenda zmieniająca coś na żywym koncie reklamowym wymaga --confirm; nowe reklamy powstają zawsze wstrzymane. Treść create / creative idzie jako jeden obiekt JSON — --json <plik|inline>.

KomendaZastosowanie
ads performance [--from RRRR-MM-DD] [--to RRRR-MM-DD] [--checkout <checkoutId>]Per reklama: wydatki, wyświetlenia, kliknięcia, zakupy wg Meta, zamówienia Zanfia, przychód i ROAS, plus sumy i dzienna seria wydatki / przychód; --checkout zawęża zamówienia i wydatki do jednego koszyka (spendScope: checkout)
ads directoryReklamy znane w koncie z pobierania statystyk: id i nazwy reklam / zestawów / kampanii, URL docelowy i koszyk — słownik dla id reklam z utm_content w zamówieniach i eksportach
ads campaigns <connectionId> <adAccountId> [--include-archived]Kampanie ze statusem, statusem efektywnym, celem i budżetami
ads campaign update <connectionId> <adAccountId> <campaignId> [--status ACTIVE|PAUSED] [--name <n>] --confirmWłącz / wyłącz kampanię, zmień jej dzienny budżet albo nazwę
ads ad-sets <connectionId> <adAccountId> [--campaign <campaignId>] [--include-archived]Zestawy reklam z budżetami, harmonogramem i statusem efektywnym (np. CAMPAIGN_PAUSED)
ads ad-set get <connectionId> <adAccountId> <adSetId>Jeden zestaw reklam — budżet, harmonogram, status
ads ad-set update <connectionId> <adAccountId> <adSetId> [--daily-budget <minor>] [--lifetime-budget <minor>] [--end-time <iso>] [--status ACTIVE|PAUSED] --confirmZmień budżet zestawu (dzienny albo całkowity, nie oba), koniec harmonogramu lub status — dotyczy wszystkich reklam w zestawie
ads list <connectionId> <adAccountId> [--after <cursor>] [--include-archived]Reklamy konta, 50 na stronę — odpowiedź podaje kursor --after dla następnej strony
ads create <connectionId> <adAccountId> --json <json|plik> --confirmZduplikuj istniejącą reklamę do nowej, wstrzymanej — sourceAdId i name są wymagane; message, headline, description, callToActionType, link, imageUrl nadpisują kreację źródłową
ads update <connectionId> <adAccountId> <adId> [--status ACTIVE|PAUSED] [--name <n>] --confirmWłącz / wyłącz reklamę albo zmień jej nazwę
ads creative get <connectionId> <adAccountId> <adId>Kreacja reklamy: tekst główny, nagłówek, opis, CTA, link, obraz, tagi URL — editable: no oznacza wideo / karuzelę / dynamiczną (te edytujesz w Menedżerze reklam)
ads creative update <connectionId> <adAccountId> <adId> --json <json|plik> --confirmZbuduj nową kreację z obecnej plus podane message, headline, description, callToActionType, link, imageUrl, urlTags i przepnij na nią reklamę
ads sync [--lookback-days <n>]Pobierz statystyki reklam teraz dla każdego aktywnego połączenia Meta (przycisk „Synchronizuj teraz") — zwraca liczbę połączeń, zapisanych dni i błędów

Workflowy

Automatyzacje (workflowy) edytujesz w panelu; CLI je podgląda, wstrzymuje/wznawia i (ponownie) uruchamia przebiegi. Przebiegi wykonują się naprawdę — wysyłają maile, nadają tagi, wołają webhooki — dlatego komendy uruchamiające wymagają --confirm.

KomendaZastosowanie
workflows listAutomatyzacje ze statusem, wyzwalaczami, zakresem produktów, liczbą węzłów i ostatnim przebiegiem
workflows get <id>Jeden workflow ze szczegółami
workflows runs <id> [--limit]Ostatnie przebiegi, od najnowszych
workflows pause <id>Przestań reagować na wyzwalacze
workflows resume <id>Wznów wstrzymany workflow (wymaga opublikowanej wersji)
workflows retry <id> <runId> --confirmUruchom ponownie zakończony przebieg z jego pierwotnym kontekstem jako nowy przebieg (202 → runId)
workflows test-run <id> --context=<json|plik> [--trigger-node <nodeId>] --confirmUruchom przebieg z ręcznie podanym kontekstem wyzwalacza (clientEmail, clientFirstName, productId, orderId, …) — to nie jest tryb próbny; 503 oznacza, że scheduler Trigger.dev nie jest skonfigurowany w tym środowisku

Lejki

Lejki marketingowe to nazwane łańcuchy kroków, które odwołują się do istniejących koszyków, stron i workflowów — lejek nigdy nie jest właścicielem artefaktów, na które wskazują jego kroki. Tworzenie zaczyna się od przepisu; from-template dodatkowo generuje strony kroków przez AI.

KomendaZastosowanie
funnels listLejki ze statusem, przepisem i liczbą kroków
funnels get <id>Pełny łańcuch kroków, workflowy i produkty jednego lejka
funnels create --recipe <lead_magnet|tripwire|sell_product> --product <id> --lang en|pl [--name]Draft lejka na istniejących koszykach produktu plus sekwencja e-maili przepisu jako draft workflowu (409, gdy produkt nie ma darmowego/płatnego koszyka wymaganego przez przepis)
funnels update <id> [--name] [--workflows a,b] [--json <patch>]Zmień nazwę, podmień workflowy lub przepnij łańcuch kroków (steps/workflowIds to pełne zamiany)
funnels status <id> --set draft|live|archivedZmiany statusu (wszystkie odwracalne)
funnels delete <id> --confirmTwarde usunięcie samego dokumentu lejka; lepiej archiwizować
funnels generate-page <id> --step <n|stepId> --lang en|pl [--brief] [--template]Wygeneruj AI stronę jednego kroku typu strona i podepnij ją — synchronicznie, 1-3 minuty; zużywa kredyty AI
funnels templatesKatalog szablonów stojący za from-template (id, przepis, wymaganie produktu, łańcuch kroków; available: no = wkrótce)
funnels from-template <templateId> --product <id> --lang en|pl [--name] [--event-start <iso>] [--event-timezone] [--event-duration <min>] [--event-mode live|on_demand] --confirmUtwórz lejek z szablonu i zakolejkuj generowanie AI jego stron (202 → tabela runId per krok + pominięte kroki; zużywa kredyty AI). Sprawdzaj funnels get <id>, aż kroki będą miały strony
funnels from-pages --page <id,id,…> [--name] [--json <plik>]Lejek na istniejących hostowanych stronach w kolejności odwiedzin (pierwsza = wejście); nic nie jest generowane
funnels stats <funnelId>Liczby per krok (wyświetlenia / wejścia / zapisy, sesje koszyka / zakończone, OTO wyświetlone / przyjęte) plus sumy; n/a = nie dotyczy tego rodzaju kroku

Strony

Własne hostowane strony HTML, serwowane w domenie Twojego sklepu. Statusy: draft, published.

KomendaZastosowanie
pages listHostowane strony
pages get <id>Jedna strona wraz z ciałem HTML
pages create --slug <s> --title <t> (--file <ścieżka> | --html <h>) [--publish]Nowa strona, draft, chyba że podasz --publish
pages update <id> [--slug] [--title] [--file | --html]Edytuj
pages publish <id>Opublikuj
pages unpublish <id>Wróć do draftu
pages delete <id>Usuń stronę i jej HTML
pages set-main <id>Użyj opublikowanej strony jako strony głównej sklepu
pages unset-mainWróć do siatki produktów
pages generate --intent <lead-magnet|webinar|sales-page|thank-you|waitlist|generic> --title <t> --brief <tekst|plik> [--template] [--product] [--checkout] [--form] [--source-url --source-mode rebuild|inspired] [--slug] [--delivery-url] [--delivery-name] [--event-start <iso>] [--event-timezone] [--event-duration <min>] [--event-mode live|on_demand] [--replay-media <mediaId>] [--opt-in-mode single|double] [--form-tags a,b] [--json <plik>] --confirmWygeneruj stronę AI jako draft (zużywa kredyty AI; 202 → runId, sprawdzaj pages list). Intencje zapisu tworzą też formularz, stronę podziękowania i draft automatyzacji dostarczania; 503 oznacza, że na tym środowisku nie ma skonfigurowanego schedulera Trigger.dev
pages edit <pageId> --instruction <tekst|plik> --confirmEdycja AI treści lub wyglądu strony na podstawie opisanej zmiany — synchronicznie, do 1-2 minut; wypisuje podsumowanie zmiany i id rewizji poprzedniego HTML
pages templatesSzablony designu do użycia jako pages generate --template (id, nazwa, kategoria, intencje)
pages revisions <pageId>Migawki HTML robione przed każdym nadpisaniem (najnowsze pierwsze)
pages restore <pageId> <revisionId> --confirmPrzywróć rewizję (bieżący HTML jest najpierw zapisywany jako migawka, więc przywrócenie też da się cofnąć)
pages activate-automations <pageId> --confirmOpublikuj draft automatyzacji dostarczania strony i zaplanuj jej webinarowe e-maile follow-up — e-maile wychodzą naprawdę; treści z placeholderami są pomijane

Social media

Posty na podłączone konta społecznościowe (Marketing → Social). Statusy: draft, scheduled, published, failed. Zakresy: social:read / social:write.

KomendaZastosowanie
social accountsPodłączone konta i ich klucze docelowe (linkedin, facebook:{pageId}, …)
social posts [--status <s>] [--limit <n>]Przeglądaj szkice, zaplanowane posty i historię publikacji
social get <id>Jeden post: treść, media, harmonogram, wyniki publikacji (permalinki)
social draft --text <t> --targets <a,b> [--media <ids>] [--first-comment <t>]Zapisz szkic (pojawia się w widoku Posty w panelu)
social schedule [id] --at <iso> [--text … --targets … [--media] [--first-comment]]Zaplanuj istniejący szkic albo nową treść (>= 1 min naprzód)
social publish [id] [--text … --targets linkedin [--media] [--first-comment]]Opublikuj teraz - tylko LinkedIn (tekst + obrazy)

Biblioteka mediów

KomendaZastosowanie
media upload --file <ścieżka> [--name] [--mime] [--folder] [--description]Prześlij plik; wypisuje id mediów i publiczny URL
media upload-video --file <ścieżka> [--title] [--mime] [--wait] [--poll-timeout <s>]Prześlij wideo do lekcji (Bunny); transkodowanie rusza po przesłaniu
media list [--folder <nazwa>]Przeglądaj
media get <id>Jeden element; pokazuje uploadStatus
media rename <mediaId> [--name] [--description | --clear-description]Zmień nazwę i/lub opis
media move <mediaId...> (--folder <nazwa> | --unfile)Przenieś elementy do folderu albo wypnij je z folderu
media transcript <mediaId> [--words] [--out <plik>]Transkrypcja wideo (czysty tekst; --words dodaje czasy słów i wymusza JSON)
media delete <id> [--force]Usuń (--force, jeśli plik jest jeszcze gdzieś używany)
media folder listFoldery
media folder create <nazwa>Nowy folder (idempotentne po nazwie)
media folder rename <nazwa> --to <nowaNazwa>Zmień nazwę — zmiana na nazwę istniejącego folderu scala z nim zawartość
media folder delete <nazwa>Usuń folder — jego pliki są tylko odpinane, nigdy kasowane

Wideo wymaga transkodowania

media upload-video bez --wait kończy się, gdy wideo wciąż się przetwarza. Odpytuj media get <id>, aż uploadStatus będzie mieć wartość ready, a następnie podepnij plik komendą courses lesson set-video.

Czy ten artykuł był pomocny?

Powiązane artykuły

Coś się nie zgadza? Napisz do nas na support@zanfia.com.