Kako sam “oživeo” My Newsletter: priča o tome zašto sam prestao da zavisim od tuđih kanala

Postoji jedan trenutak kad shvatiš da si, koliko god dobro radio marketing, zapravo u tuđim rukama. Danas te algoritam voli, sutra te zakopa. Danas ti oglasi rade, sutra poskupe i pokvare matematiku. I u toj tišini između dve promene, meni je postalo jasno: ako ne posedujem kanal komunikacije sa ljudima, ne posedujem ništa. Zato je i nastao moj newsletter plugin — ne kao “još jedan dodatak”, nego kao pokušaj da se vratim na teren koji kontrolišem. [1]

Početak: “treba mi nešto jednostavno, odmah”

Prva verzija je bila brutalno pragmatična. Nisam krenuo da pravim “platformu”, nego alat koji mi rešava jednu stvar: da mogu da pošaljem poruku ljudima kad god hoću, bez pretplate, bez spoljnih servisa, i bez toga da mi lista živi negde van mog sajta. To je bila osnovna ideja oko koje se sve kasnije gradilo: newsletter kao vlasništvo, ne kao usluga. [3]

Vremenom je taj plugin ostao sa strane. Radio je “dovoljno dobro” dok je sve bilo malo, dok se slalo povremeno, i dok niko nije postavljao pitanje “a šta ako pukne?”. A onda sam odlučio da ga oživim i pustim javno — i tu kreće prava priča. [2]

Sudar sa realnošću: WordPress.org nije mesto za “dovoljno dobro”

Kad praviš plugin samo za sebe, možeš da prećutiš gomilu stvari. Kad ga daješ svetu, nema skrivanja. WordPress.org ima jasna pravila i očekivanja — ne samo u kodu, nego i u prezentaciji, readme formatu, sigurnosti akcija u adminu, i u tome kako korisnik razume šta plugin radi. Ja sam prvi put osetio taj zid kroz Plugin Check i kroz insistiranje da sve bude u skladu sa praksom direktorijuma. [2][1]

Najvažnija lekcija iz tog perioda: plugin nije “zip fajl koji radi” — plugin je proizvod. Proizvod znači: pravila, disciplina verzija, dokumentacija, i ponašanje u najgorim uslovima, ne u najboljim. [1][2]

Prelomna tačka: import mailing liste (i zašto to menja sve)

U nekom trenutku sam shvatio da newsletter “samo za WP korisnike” nije ono što ljudima realno treba. Ljudi imaju kontakte svuda: u Excelu, u CSV-u, u mejlovima, u CRM-u. Ako ne mogu da uvezu svoju listu, plugin ostaje igračka.

Zato sam dodao import mailing liste, ali ne kao “uvez i ćao”, nego sa dve stvari koje štede živce:

  • preview pre upisa (da vidiš šta će da se desi pre nego što se desi)
  • merge pravila (update ili skip duplikate)
    To je razlika između alata koji deluje “simpatično” i alata koji neko stvarno koristi u radu. [1][2]

I tu dolazi sledeća lekcija: čim daš ljudima import, ulaziš u zonu odgovornosti. Newsletter nije igra — tu postoje pravila, odjava mora da postoji i mora da radi, i korisnik mora da razume da je on odgovoran za saglasnost/lawful basis. Ja nisam hteo da pravim “spam alat”, nego alat za normalan biznis, pa sam to morao jasno da ugradim u UX i dokumentaciju. [13][14][2]

Slanje emaila nije “klik i gotovo”: to je sistem koji mora da preživi realan hosting

Najveća zabluda koju sam imao (i koju većina ljudi ima) je da je slanje emaila “jedan request”. U praksi, to je batch sistem.

Na WordPressu često šalješ kroz WP-Cron, a WP-Cron nije server cron — on zavisi od poseta i okidanja događaja kroz WP mehanizam. To znači da moraš da:

  • šalješ u malim batch-ovima
  • štitiš se od preklapanja run-ova
  • imaš mogućnost ručnog okidanja kad treba
    U protivnom, dobićeš fantomske probleme: napredak skače, queue se čudno ponaša, a ti nemaš pojma zašto. [6][7]

Tu sam naučio jednu stvar koju danas smatram osnovom: softver mora da bude dizajniran za failure mode, ne za “idealne uslove”. [6][7]

Logovanje: trenutak kad prestaneš da nagađaš

Kad god sam ranije imao problem, radio sam ono što svi rade: gledam u ekran, menjam jednu opciju, probam ponovo, pa opet. To je samoprevara.

Tek kad sam dodao log fajl + admin viewer, stvari su postale ozbiljne. Jer onda više nema “mislim da se desilo”, nego vidiš:

  • šta je pokušao da pošalje
  • šta je palo
  • koji je error
  • gde tačno se sistem ponaša pogrešno
    Bez loga, ti testiraš na slepo. Sa logom, ti dijagnostikuješ. [5][8]

SMTP: trenutak kad sam morao da prihvatim ograničenja hostinga

Onda sam udario u još jedan zid: shared hosting često nema pouzdan “default mail” i/ili ima limite. I to nije “bug u plugin-u”, to je okruženje. Kad wp_mail ne može da pošalje, ti možeš da budeš genije u kodu, ali email neće otići. [3][5]

Zato sam ugradio SMTP podešavanja direktno u plugin. Nisam hteo da zahtevam dodatni plugin, nego da korisnik na jednom mestu podesi: host, port, enkripciju, user/pass — i da radi. A pošto većina ljudi neće verovati da “radi” dok ne vidi, dodao sam i SMTP Test u Settings, da se odmah proveri pre kampanje. [4][3][5]

Pošto dosta korisnika hostuje na Hostingeru, dodao sam i objašnjenja + preporuke za smtp.hostinger.com i za tipične limite/kvote, jer mnogo problema nastaje kad ljudi očekuju “pošalji 5.000 emailova sa shared hostinga bez posledica”. Ne ide tako. [11][12]

Stop dugme: mala stvar koja te spašava od panike

Kad jednom pustiš kampanju, dešava se život: greška u listi, pogrešan subject, pogrešna poruka, ili jednostavno želiš da pauziraš. Ako nemaš Stop/Resume, korisnik se oseća kao da je zarobljen.

Dodavanje Stop/Resume kontrole je bio momenat kad sam shvatio da dobar alat nije samo “može”, nego i “možeš da ga zaustaviš kad treba”. To je kontrola, a kontrola je poverenje. [15][16]

Template-i: od “svaki put isto pišem” do biblioteke

Newsletter je ponavljanje. U realnosti, ljudi stalno šalju slične poruke: launch, popust, obaveštenje, novosti. Zato je sledeći logičan korak bio da uvedem:

  • Save Template / Load Template
  • Manage Templates (edit/rename/duplicate/delete)
  • Import/Export template-a (JSON), da možeš da preneseš biblioteku između sajtova
    To je trenutak kad plugin prestaje da bude “sender” i postaje workflow. [10]

Šta sam naučio (i šta bih voleo da sam znao ranije)

  1. Ne praviš plugin da “radi”, nego da preživi.
    Razlika je ogromna. “Radi” je demo. “Preživi” je proizvod. [2]
  2. Najskuplji bug je onaj koji ne možeš da vidiš.
    Zato log nije dodatak — log je uslov. [5][8]
  3. Hosting limit nije problem koji rešavaš kodom.
    Možeš da optimizuješ, throttluješ, batch-uješ, ali kvote su kvote. Zato SMTP + test + jasna očekivanja. [12][11]
  4. Korisnik ne čita dokumentaciju kad je u panici.
    Zato sam u sam UI ubacivao objašnjenja, potvrde i guardrail-ove. Dokumentacija je važna, ali UX je ono što spašava. [1][2]
  5. Svaka nova opcija mora da uđe u opis.
    Ako korisnik ne razume vrednost za 15 sekundi na listing stranici, izgubićeš ga, ma koliko dobar plugin bio. WordPress.org listing ima svoja pravila i format, i tu nema improvizacije. [1]

Zašto sam sve ovo radio?

Jer sam hteo alat koji radi u stvarnom svetu, za stvarne sajtove, sa stvarnim ograničenjima. I jer sam hteo da imam kanal koji nije “na iznajmljivanje”.

My Newsletter je, u suštini, moj odgovor na jednostavno pitanje:
“Kako da budem siguran da mogu da se obratim svojim ljudima kad god hoću?” [1]


Izvori

[1] WordPress.org readme.txt i kako utiče na listing/Stable Tag: https://developer.wordpress.org/plugins/wordpress-org/how-your-readme-txt-works
[2] WordPress Plugin Directory smernice: https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/
[3] wp_mail() dokumentacija: https://developer.wordpress.org/reference/functions/wp_mail/
[4] phpmailer_init hook (SMTP konfiguracija): https://developer.wordpress.org/reference/hooks/phpmailer_init/
[5] wp_mail_failed hook (hvatanje grešaka slanja): https://developer.wordpress.org/reference/hooks/wp_mail_failed/
[6] wp_schedule_event() (WP-Cron scheduling): https://developer.wordpress.org/reference/functions/wp_schedule_event/
[7] set_transient() (lock mehanizam): https://developer.wordpress.org/reference/functions/set_transient/
[8] WP_Filesystem() (rad sa fajlovima): https://developer.wordpress.org/reference/functions/wp_filesystem/
[10] register_post_type() (storage template-a): https://developer.wordpress.org/reference/functions/register_post_type/
[11] Hostinger SMTP parametri (smtp.hostinger.com, portovi): https://www.hostinger.com/support/4305847-set-up-hostinger-email-on-your-applications-and-devices/
[12] Hostinger hosting plan limiti (kvote slanja): https://www.hostinger.com/support/6976044-parameters-and-limits-of-hosting-plans-in-hostinger/
[13] FTC CAN-SPAM compliance guide: https://www.ftc.gov/business-guidance/resources/can-spam-act-compliance-guide-business
[14] EU: kada je consent validan (GDPR): https://commission.europa.eu/law/law-topic/data-protection/rules-business-and-organisations/legal-grounds-processing-data/grounds-processing/when-consent-valid
[15] check_admin_referer() (nonce provera): https://developer.wordpress.org/reference/functions/check_admin_referer/
[16] check_ajax_referer() (nonce provera): https://developer.wordpress.org/reference/functions/check_ajax_referer/

Podeli:

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.