- Model Announcement z kategoriami, statusami, slugami URL - Panel admina /admin/announcements (CRUD, filtry, AJAX) - Strona /ogloszenia tylko dla zalogowanych członków - Szczegóły ogłoszenia /ogloszenia/<slug> - Migracja SQL rozszerzająca istniejącą tabelę - Testowe ogłoszenia: ARP baza noclegowa, Tytani Przedsiębiorczości - Pliki PDF regulaminu i harmonogramu konkursu Tytani Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
15 KiB
NordaBiz - Plan rozwoju i monetyzacja
Ten dokument zawiera plany rozwoju projektu i strategię monetyzacji. Główne instrukcje znajdują się w CLAUDE.md.
Status wdrożonych funkcjonalności
| Funkcjonalność | Status | Data |
|---|---|---|
| Social Media Audit | ✅ Wdrożone | 2026-01-09 |
| News Monitoring | ✅ Wdrożone | 2025-12-29 |
| Katalog firm | ✅ Wdrożone | 2025-11-23 |
| Chat AI (NordaGPT) | ✅ Wdrożone | 2025-11-23 |
Priorytet 1: Social Media Integration (Posts/Events)
Status: Planowane Cel: Pobieranie postów i wydarzeń z Social Media firm
Źródła danych
- Facebook Pages firm członkowskich (posty, wydarzenia)
- LinkedIn Company Pages
- Google My Business (recenzje, posty)
Wymagania techniczne
- Facebook Graph API (wymaga App Review dla pages_read_engagement)
- LinkedIn Marketing API (wymaga partnera lub OAuth)
- Google Business Profile API
Typy zdarzeń do importu
social_post- posty z social mediasocial_event- wydarzenia z Facebookareview- nowe recenzje Google
Priorytet 2: News Monitoring (Google/Brave API)
Status: ✅ Wdrożone (2025-12-29)
Źródła danych
- Wzmianki o firmach w mediach lokalnych/branżowych
- Artykuły prasowe
- Komunikaty branżowe
Typy zdarzeń
news_mention- wzmianka w mediachpress_release- komunikat prasowyaward- nagroda/wyróżnienie
Priorytet 3: Zarząd i Wspólnicy (rejestr.io)
Status: Planowane Cel: Wyświetlanie osób powiązanych z firmą bezpośrednio na stronie profilu
Dane do pobrania z rejestr.io
- Zarząd (Prezes, Wiceprezes, Członkowie Zarządu)
- Prokurenci
- Wspólnicy z % udziałów
- Beneficjenci rzeczywiści
- Linki do profili osób (powiązania z innymi firmami)
Wymagania techniczne
- Tabela
company_people(company_id, name, role, shares_percent, person_url) - Scraper Playwright (już mamy bazę w
analyze_connections.py) - Sekcja w
company_detail.htmlpo "Informacje prawne i biznesowe"
Przykład wyświetlania
👥 ZARZĄD I WSPÓLNICY
┌─────────────────────────────────────────┐
│ 👔 Jan Kowalski - Prezes Zarządu │
│ 👔 Anna Nowak - Członek Zarządu │
│ 💼 Firma XYZ Sp. z o.o. - 60% udziałów │
│ 💼 Jan Kowalski - 40% udziałów │
└─────────────────────────────────────────┘
Korzyści
- Widoczne powiązania między firmami Norda Biznes
- Ułatwiony networking (kto zna kogo)
- Transparentność struktury właścicielskiej
Priorytet 4: System rekomendacji i zdjęć
Status: Planowane Cel: Umożliwienie firmom członkowskim wzajemnego polecania się oraz prezentacji zdjęć
Funkcje
- Rekomendacje między firmami (kto poleca kogo)
- Galeria zdjęć firmy (realizacje, zespół, biuro)
- Wyświetlanie na profilu firmy
Priorytet 5: Status członkostwa i płatności
Status: Planowane Cel: Śledzenie statusu członkostwa i składek miesięcznych
Funkcje
- Status członka (aktywny, zawieszony, były członek)
- Informacja o opłaconych składkach
- Historia płatności
- Przypomnienia o zaległościach (dla admina)
Priorytet 6: System powiadomień
Status: Planowane Cel: Powiadamianie użytkowników o istotnych zdarzeniach bez konieczności logowania Źródło: Feedback od członków Norda Biznes (Janusz Masiak, Angelika Piechocka) - 2026-01-22
Kanały powiadomień
| Kanał | Zastosowanie | Technologia | Koszt |
|---|---|---|---|
| Standardowe powiadomienia | SendGrid / Mailgun / SMTP | ~$15/mies (10k maili) | |
| SMS | Pilne/ważne powiadomienia | SMSAPI.pl | ~0.07 zł/SMS |
| Push | Natychmiastowe (PWA) | Web Push API | Darmowe |
Typy powiadomień
| Typ | SMS | Push | Domyślnie | |
|---|---|---|---|---|
| Nowe wydarzenia Norda Biznes | ✅ | ⚪ | ✅ | Email+Push |
| Nowe aktualności i newsy | ✅ | ❌ | ✅ | |
| Wiadomości od innych firm | ✅ | ⚪ | ✅ | Email+Push |
| Przypomnienia o spotkaniach | ✅ | ✅ | ✅ | Wszystkie |
| Newsletter tygodniowy | ✅ | ❌ | ❌ | Wyłączone |
Legenda: ✅ dostępne domyślnie, ⚪ dostępne opcjonalnie, ❌ niedostępne
Panel preferencji powiadomień
Użytkownik w profilu będzie mógł:
- Włączyć/wyłączyć poszczególne typy powiadomień
- Wybrać preferowane kanały (email, SMS, push)
- Ustawić "ciche godziny" (np. brak SMS po 21:00)
- Zapisać numer telefonu do SMS
Wymagania techniczne
# Nowa tabela: notification_preferences
class NotificationPreference(Base):
__tablename__ = 'notification_preferences'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'), unique=True)
# Kanały
email_enabled = Column(Boolean, default=True)
sms_enabled = Column(Boolean, default=False)
push_enabled = Column(Boolean, default=True)
phone_number = Column(String(15)) # Format: +48XXXXXXXXX
# Typy powiadomień
events_email = Column(Boolean, default=True)
events_sms = Column(Boolean, default=False)
news_email = Column(Boolean, default=True)
messages_email = Column(Boolean, default=True)
messages_push = Column(Boolean, default=True)
reminders_sms = Column(Boolean, default=True)
newsletter = Column(Boolean, default=False)
# Ciche godziny
quiet_hours_start = Column(Time) # np. 21:00
quiet_hours_end = Column(Time) # np. 08:00
# Nowa tabela: notification_log (audit)
class NotificationLog(Base):
__tablename__ = 'notification_log'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id'))
channel = Column(String(10)) # email, sms, push
type = Column(String(30)) # event, news, message, reminder
subject = Column(String(200))
sent_at = Column(DateTime, default=datetime.utcnow)
status = Column(String(20)) # sent, failed, bounced
Integracje
- Email: Flask-Mail + SendGrid API (fallback: SMTP)
- SMS: SMSAPI.pl (polska firma, dobra dokumentacja)
- Push: Web Push API + pywebpush (wymaga PWA - Priorytet 7)
Priorytet 7: PWA (Progressive Web App)
Status: Planowane Cel: Umożliwienie "instalacji" NordaBiznes na telefonie jako aplikacji Źródło: Feedback od Angeliki Piechockiej - 2026-01-22
Korzyści PWA vs natywna aplikacja
| Aspekt | PWA | Natywna aplikacja |
|---|---|---|
| Koszt rozwoju | Niski | Wysoki (iOS + Android) |
| Czas wdrożenia | 2-4 tygodnie | 3-6 miesięcy |
| Aktualizacje | Natychmiastowe | Wymaga publikacji w Store |
| Instalacja | "Dodaj do ekranu" | App Store / Google Play |
| Push notifications | ✅ (Android, iOS 16.4+) | ✅ |
| Dostęp offline | Ograniczony | Pełny |
| Kamera/GPS | ✅ | ✅ |
Wymagania techniczne
- manifest.json - metadane aplikacji (nazwa, ikony, kolory)
- Service Worker - cache, offline, push notifications
- HTTPS - już mamy (Let's Encrypt)
- Ikony - różne rozmiary (192x192, 512x512)
Przykład manifest.json
{
"name": "NordaBiznes - Katalog Firm",
"short_name": "NordaBiznes",
"description": "Platforma networkingowa członków Norda Biznes",
"start_url": "/",
"display": "standalone",
"background_color": "#1a1a2e",
"theme_color": "#6c5ce7",
"icons": [
{
"src": "/static/icons/icon-192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/static/icons/icon-512.png",
"sizes": "512x512",
"type": "image/png"
}
]
}
Fazy wdrożenia
- Faza 1: Podstawowy PWA (manifest + service worker cache)
- Faza 2: Push notifications (integracja z Priorytetem 6)
- Faza 3: Offline mode (cache kluczowych stron)
Zależności
- Push notifications w PWA wymagają Service Worker
- Priorytet 6 (System powiadomień) i Priorytet 7 (PWA) są powiązane
- Rekomendacja: wdrażać równolegle
Priorytet 8: System ogłoszeń i aktualności
Status: Planowane Cel: Umożliwienie komunikacji z członkami Norda Biznes - ogłoszenia, aktualności, ważne informacje Źródło: Potrzeba rozesłania informacji o bazie noclegowej ARP dla elektrowni jądrowej - 2026-01-26
Problem
Obecnie brak możliwości:
- Publikowania ogłoszeń dla członków na stronie www
- Wysyłania masowych komunikatów do wszystkich członków
- Targetowania komunikatów (np. tylko branża noclegowa)
Funkcjonalności
Panel admina (/admin/announcements)
- Tworzenie nowych ogłoszeń (tytuł, treść, obrazek, link)
- Ustawianie daty publikacji i wygaśnięcia
- Wybór grupy docelowej (wszyscy / wybrane kategorie firm)
- Podgląd przed publikacją
- Historia wysłanych ogłoszeń
Strona publiczna (/aktualnosci)
- Lista aktualnych ogłoszeń
- Archiwum starszych ogłoszeń
- Filtrowanie po kategorii
- RSS feed (opcjonalnie)
Integracja z powiadomieniami (Priorytet 6)
- Automatyczne wysyłanie email do członków przy nowym ogłoszeniu
- Push notification (PWA)
- Opcja "wyślij teraz" vs "tylko opublikuj na stronie"
Wymagania techniczne
# Nowa tabela: announcements
class Announcement(Base):
__tablename__ = 'announcements'
id = Column(Integer, primary_key=True)
title = Column(String(200), nullable=False)
slug = Column(String(200), unique=True)
content = Column(Text, nullable=False) # Markdown lub HTML
excerpt = Column(String(500)) # Krótki opis do listy
image_url = Column(String(500))
external_link = Column(String(500)) # Link do zewnętrznego źródła
# Publikacja
status = Column(String(20), default='draft') # draft, published, archived
published_at = Column(DateTime)
expires_at = Column(DateTime) # Opcjonalna data wygaśnięcia
# Targetowanie
target_audience = Column(String(50), default='all') # all, category:IT, category:Services
# Powiadomienia
send_email = Column(Boolean, default=True)
send_push = Column(Boolean, default=True)
notification_sent_at = Column(DateTime)
# Meta
created_by = Column(Integer, ForeignKey('users.id'))
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, onupdate=datetime.utcnow)
view_count = Column(Integer, default=0)
# Tabela śledzenia kto widział ogłoszenie
class AnnouncementView(Base):
__tablename__ = 'announcement_views'
id = Column(Integer, primary_key=True)
announcement_id = Column(Integer, ForeignKey('announcements.id'))
user_id = Column(Integer, ForeignKey('users.id'))
viewed_at = Column(DateTime, default=datetime.utcnow)
Przykłady użycia
| Scenariusz | Target | Push | |
|---|---|---|---|
| Baza noclegowa ARP (elektrownia) | Wszystkie firmy | ✅ | ✅ |
| Szkolenie IT | category:IT | ✅ | ❌ |
| Spotkanie networkingowe | Wszystkie firmy | ✅ | ✅ |
| Aktualizacja regulaminu | Wszystkie firmy | ✅ | ❌ |
Zależności
- Priorytet 6 (Powiadomienia) - do wysyłania email/push
- Priorytet 7 (PWA) - do push notifications
- Może działać samodzielnie (tylko strona www) bez powiadomień
Fazy wdrożenia
- Faza 1: Strona
/aktualnosci+ panel admina (bez powiadomień) - Faza 2: Integracja z email (gdy Priorytet 6 gotowy)
- Faza 3: Push notifications (gdy Priorytet 7 gotowy)
Notatki implementacyjne
- Scraper powinien deduplikować wydarzenia (hash tytułu + daty)
- Moderacja: nowe wydarzenia jako "pending" do zatwierdzenia przez admina
- Rate limiting: max 100 requestów/dzień do zewnętrznych API
Forma prawna Norda Biznes
Stan obecny
- Forma: OPP (Organizacja Pożytku Publicznego)
- Typ: Stowarzyszenie non-profit
Planowana transformacja
- Docelowa forma: Działalność gospodarcza (przy Izbie)
- Cel: Możliwość pozyskiwania dofinansowań (granty, projekty UE)
- Korzyści:
- Dostęp do funduszy na rozwój platformy
- Możliwość świadczenia płatnych usług
- Elastyczność finansowa
Strategia monetyzacji
Model 3-tier Pricing (Kotwiczenie ceny)
Strategia: Trzy poziomy cenowe z zastosowaniem psychologii kotwiczenia ceny (Price Anchoring). Najwyższy poziom służy jako kotwica - sprawia że środkowy wydaje się atrakcyjny i jest docelowy.
| Poziom | Nazwa | Cena/mies. | Cel strategiczny |
|---|---|---|---|
| 1 | Basic | ~49 zł | Entry point, ograniczone funkcje |
| 2 | Premium | ~99 zł | DOCELOWY - rekomendowany, najlepsza wartość |
| 3 | Enterprise | ~199 zł | KOTWICA - premium, pełny dostęp |
Wyjątek: Członkowie Izby NORDA płacący składki (~200 zł/mies.) mają specjalny status - dostęp Premium za symboliczne 1 zł.
Psychologia 3-tier Pricing
- Ludzie naturalnie wybierają środkową opcję (efekt kompromisu)
- Wysoka cena kotwicy sprawia że środkowa wydaje się "okazją"
- Niska cena Basic sprawia że użytkownik czuje "upgrade jest wart dopłaty"
- Firmy stosujące 3-tier widzą ~30% wzrost przychodów
- Slack: dodanie Enterprise tier zwiększyło konwersję na Professional o 28%
Matryca dostępu do funkcji
| Funkcja | Basic | Premium | Enterprise |
|---|---|---|---|
| Katalog firm | ✅ | ✅ | ✅ |
| Profil firmy | ✅ | ✅ | ✅ |
| Forum | ❌ | ✅ | ✅ |
| Kalendarz wydarzeń | ❌ | ✅ | ✅ |
| Chat AI (NordaGPT) | ❌ | ✅ | ✅ |
| Powiadomienia email | ✅ | ✅ | ✅ |
| Powiadomienia SMS | ❌ | ✅ | ✅ |
| Powiadomienia push (PWA) | ❌ | ✅ | ✅ |
| Aktualności i ogłoszenia | ✅ | ✅ | ✅ |
| Raporty podstawowe | ❌ | ✅ | ✅ |
| Raporty zaawansowane | ❌ | ❌ | ✅ |
| Eksport danych (CSV/PDF) | ❌ | ❌ | ✅ |
| API dostęp | ❌ | ❌ | ✅ |
| Priorytetowe wsparcie | ❌ | ❌ | ✅ |
Implementacja techniczna (przyszłość)
# Model User - nowe pola
class User(Base):
# ...
subscription_tier = Column(String(20), default='basic') # basic, premium, enterprise
subscription_expires_at = Column(DateTime)
is_norda_member = Column(Boolean, default=False) # Członek Izby = specjalny status
# Dekorator kontroli dostępu
def requires_tier(min_tier):
def decorator(f):
@wraps(f)
def wrapped(*args, **kwargs):
tiers = ['basic', 'premium', 'enterprise']
user_tier_idx = tiers.index(current_user.subscription_tier)
required_idx = tiers.index(min_tier)
if user_tier_idx < required_idx:
flash(f'Ta funkcja wymaga konta {min_tier.title()}.', 'warning')
return redirect(url_for('pricing'))
return f(*args, **kwargs)
return wrapped
return decorator
# Użycie
@app.route('/raporty/zaawansowane')
@login_required
@requires_tier('enterprise')
def advanced_reports():
...
Raporty - podział według poziomu
Raporty podstawowe (Premium+):
- Staż członkostwa w Izbie NORDA
- Pokrycie Social Media
- Struktura branżowa
Raporty zaawansowane (Enterprise only):
- Ranking SEO
- Mapa lokalizacji
- Sieć rekomendacji
- Aktywność w wydarzeniach