Kontakter & samtycke
En lista du kan försvara, inte bara en lista du har
Vem som helst kan lagra tiotusen e-postadresser. Frågan som spelar roll — den som en tillsynsmyndighet, en leverantör och ditt eget samvete alla ställer med lite olika ord — är var var och en av dem kommer ifrån och på vilken grund du får skriva till den. ClickSomo gör det till en lagrad faktum i stället för något du skulle behöva rekonstruera.
Identiteten är e-postadressen
En kontakt per adress per projekt, upprätthållen av databasen i stället för av hopp. Adresser normaliseras när de skrivs, aldrig när de läses — normaliserar man vid läsning är villkoret bara en dekoration som släpper in både Anna@ och anna@.
Telefonnummer lagras i E.164 där de finns, men ett telefonnummer är en attribut, inte en identitet. Det finns ingen graf för identitetsupplösning, inget sammanslagningsprotokoll och ingen spårlogg över sammanslagningar, eftersom varje kontakt här kommer in via en kanal som redan har en adress: en import, ett formulär, en prenumeration eller din egen kod.
Namnet lagras som en helhet
display_name sparas exakt som det angavs och delas aldrig upp i delar. Namnuppdelning är en buggfabrik — "van der Berg", "Kim Min-jun", mononymer, titlar och varje sorteringskonvention som inte är anglosaxisk — och en felaktig uppdelning syns i en sammanfogningsflagga som "Hej van,", vilket är sämre än ingen personalisering alls.
Strukturerade delar finns bara för källor som redan levererar dem åtskilda. Inget härleder dem. Och ett namn någon själv har skrivit in skrivs aldrig över av en senare CSV som råkat se något annat, eftersom sist-skriv-vinner låter det slarvigaste importen vinna.
- 1IdentitetE-post, normaliserad. Unik inom projektet.
- 2NamnLagras som helhet.
first_namehärleds vid rendering, lagras aldrig. - 3AttributVad du vill, som JSON. Dina, och interpolerbara som
attrs.*. - 4Taggar och listorTaggar är förstklassiga och finns i ett enda lager; listor är uttryckligt medlemskap.
- 5SamtyckeEn rad per kanal, med en laglig grund och dess bevis.
- 6HändelserEn logg som bara läggs till, över allt den här personen gjorde. Tabellen som produkten vilar på.
- ×AldrigInget lösenord, ingen hash, ingen session, ingen API-nyckel. En kolumn som autentiserar någon vore en incident, inte en funktion.
Avgränsat till både tenant och projekt
Samtyckesregistret
Avsaknad är inte tillåtelse
En rad per kontakt per kanal — e-post, SMS, brev, push — var och en med ett tillstånd, en laglig grund, en källa, beviset, tidsstämplarna och jurisdiktionen. En kontakt utan grundrad för en kanal kan inte få något skickat på den kanalen. Inte "är flaggad". Kan inte.
consent
Någon har aktivt bett om det. En formulärinskickning med beviset lagrat, en dubbel opt-in, en kryssruta personen själv kryssade i. Detta är den starkaste grunden och den enda ett formulär kan ge upphov till.
legitimate_interest
Det bästa en CSV-import kan hamna som. Ett kalkylblad kan inte minnas att någon gått med på något, så det får aldrig påstå att de gjorde det — och att ladda upp samma fil igen höjer den inte.
contract
Du skriver till personen på grund av något ni båda är part i. Serviceminnelsen, förnyelseaviseringen, det personen skulle bli irriterad på att inte få.
Innan en kampanj skickas ser du grundfördelningen i dess målgrupp: hur många av dessa personer har bett om det, hur många du når under berättigat intresse, och hur många som finns där på grund av ett avtal. Det är en siffra som har stoppat fler dåliga utskick än något varningsbanderoll någonsin skrivits.
Varför detta är strängare än det behöver vara för dig: det handlar egentligen inte om dig. Ryktet för massutskick är en delad resurs, och en slarvig lista förgiftar brunnens vatten för alla som skickar från samma infrastruktur. Klagomål- och avvisningsfrekvenser per tenant övervakas, och ett konto vars frekvenser överskrider tröskeln stryps här — innan en leverantör gör det för alla på en gång.

Bakom varje rad i listan har någon sagt ja.
Fyra vägar in
Varje väg in i din lista är du, som agerar på dina egna data
Det finns ingen ingest-länk för servicetokens och inget syskonprodukt som tyst skriver in sig i dina kontakter. Om du vill ha någon på en lista är det en av dessa fyra som har placerat dem där.
CSV-import
Mappad kolumn för kolumn, normaliserad vid skrivning, MX-kontrollerad så att döda och felskrivna domäner fångas innan de studsar hårt, och landad med en grund du ställer in uttryckligen. Importen får ett id, och varje kontakt den skapade pekar tillbaka på det.
Ett ClickSomo-formulär
Renderat från samma dokument som allt annat, med validering, en honeypot och en hastighetsgräns. En inskickning är den enda väg som legitimt kan ge upphov till consent, eftersom det är den enda där personen är närvarande.
En sida du byggde i dash-b
Instrumentpanelsdesignern publicerar sidor; ett formulär på en av dem postar hit med dina egna uppgifter. Samma validering, samma samtyckeshantering, ingen andra integration att underhålla.
Det publika API:et
POST /v1/contacts med din egen token, upsert-semantik, idempotensnyckel respekteras. Din app vet redan vem som registrerade sig; detta är den kortaste vägen från det faktumet till en tratt.
Segment är ett predikat, kompilerat
Ett segment är ett lagrat predikatträd över kontaktfält, attribut, taggar, listmedlemskap och beteende, kompilerat till SQL och cachat med ett antal. Operatorerna är de vanliga — lika med, inte lika med, in, inte in, börjar med, slutar med, innehåller, är satt, är inte satt — kombinerade med and, or och not till det djup du behöver.
Förhandsgranska det innan du använder det. Slutpunkten returnerar riktiga kontakter, så frågan "vem är egentligen med här" besvarar du genom att titta i stället för att skicka och upptäcka det.
Segment gör sedan dubbel tjänst: som målgrupp för en kampanj, som villkor på en trattgren och som utlösare i sig — segment_enter startar en körning i samma ögonblick någon blir kvalificerad.
- 1Tagg
tags contains "regular" - 2Attribut
attrs.total_orders >= 3— ditt fält, ditt namn på det. - 3BeteendeIngen
order.paid-händelse de senaste 90 dagarna. - 4SamtyckeEn användbar e-postgrund. Kontakter utan en sådan räknas inte med, eftersom de ändå inte kunde nås.
- iFörhandsgranskning412 kontakter, listade. Räknas om vid utskick, eftersom ett segment är en fråga och inte en ögonblicksbild.
Kompilerat till SQLAntal cachat, svar live
Undertryckning, och när den kontrolleras
Undertryckningar är projektspecifika och globala: hårda studsar, klagomål, avprenumerationer, manuella poster och rolladresser. De kontrolleras vid utskickstillfället, och sedan igen i själva utskickstjänsten.
Det andra kontrollen är den som gör jobbet. En tratt med ett tre dagars väntande har ett tre dagars fönster där någon hinner avprenumerera, och ett system som kontrollerade undertryckning när meddelandet köades skickar ändå till dem. Kontroll vid utskick är skillnaden mellan att respektera en avprenumeration och att bara registrera en.
Radering fungerar på samma sätt: en begäran om radering tar bort kontakten och dess meddelandehistorik här, och når varje systerjänst som höll en kopia via samma interna kanal som resten av familjen använder. Det finns ett ställe att fråga och en sak som händer.