clickSomo

SaaS- en productteams

Jouw product weet dingen die geen enkele marketingtool kan zien

Wie de onboarding afrondde en wie vastliep bij stap drie. Wie een collega uitnodigde. Wie deze week twee keer de limiet raakte. Wie het ding al veertien dagen niet heeft opengedaan. Elk daarvan is een betere trigger dan alles wat uit een e-mailopen is afgeleid, en ze liggen allemaal twee regels code van elkaar verwijderd.

Events zijn de hele integratie

POST /v1/events met je eigen token: een naam die jij kiest, een contact, een payload, een idempotency-key. Dat is de hele verbinding. Er is geen SDK die je actueel moet houden, geen mappingscherm en geen woordenschat van ons waarin je je product moet vertalen.

Elk event komt op het append-only log van het contact terecht, en vanaf daar is het drie dingen tegelijk. Een trigger, zodat een funnel start zodra het binnenkomt. Een predicaat, zodat een segment kan zeggen "heeft dit in de afgelopen veertien dagen gedaan" of, nuttiger, "heeft het niet gedaan". En een doel, zodat een sequence eindigt op het moment dat iemand doet waar hij naartoe werd geprikkeld.

Dat derde is wat lifecycleberichten draaglijk maakt om te ontvangen. De prikkel om je account af te maken zou moeten ophouden te bestaan zodra het account is aangemaakt, en in de meeste tools gebeurt dat niet, omdat de sequence en het product niet met elkaar praten.

ActiveringRun #2 118
  • ⚡Triggerapi_event — signup.completed, abonnement free.
  • 2E-mail versturenHet enige wat je eerst moet doen. Geen rondleiding langs elf features.
  • 3Wacht 2 dagenwake_at op de run. Niets in de wachtrij, niets terug te draaien als je dit morgen herschrijft.
  • ?VoorwaardeIs project.created aangekomen? Nee → de hulptak. Ja → het doel hieronder.
  • 4HulptakEén bericht, dat het specifieke aanbiedt wat ze niet deden. Dan een tweede wachttijd.
  • 5Doelproject.created komt binnen. De run stopt. Nooit meer onboardingmail voor deze persoon.

Jouw eventnamenJouw definitie van geactiveerd

Vijf funnels

De levenscyclus, in de volgorde waarin hij echt plaatsvindt

1 · Activering

Trigger: aanmelding. Twee of drie berichten, elk over één actie, elk met een doel dat de sequence beëindigt zodra die actie plaatsvindt. De waardevolste funnel die je bouwt, en degene die het meest waard is om drie keer te herschrijven.

2 · De vastloper

Trigger: segment_enter — aangemeld, geen betekenisvol event in zeven dagen. Eén bericht dat vraagt in plaats van vertelt, en één dat iets specifieks aanbiedt. Dan stoppen. Een vierde bericht naar iemand die er drie negeerde, is een bericht aan niemand.

3 · Het uitbreidingsmoment

Trigger: een event dat betekent dat ze waarde krijgen — de limiet bereikt, een derde collega uitgenodigd, voor de tweede keer geëxporteerd. Dit is het enige moment waarop een upgrademelding welkom is, en het is een moment dat je product precies kan benoemen.

4 · Verlenging en dunning

Trigger: date_field vóór de verlenging, of een betalingsevent. Kennisgeving, herinnering en — als een betaling mislukt — een korte sequence die stopt op het moment dat het lukt. Doelknooppunten zijn bij dunning geen optie; ze zijn het verschil tussen een herinnering en een pesterij.

5 · Terugwinnen

Trigger: segment_enter — opgezegd of slapend gedurende zestig dagen. Twee berichten, eerlijke, dan een tag en stilte. Wat er is veranderd sinds ze weggingen, is een beter bericht dan een korting.

En de interne

notify_team waarschuwt een mens zodra een account die een mens waard is een grens overschrijdt. Een funnel hoeft niet te eindigen in een e-mail naar een klant; soms is de juiste actie iemand aan jouw kant bellen.

Niemand zegt op met opzet. Ze stoppen gewoon met openen.

Waarom een ontwikkelaar dit misschien echt leuk vindt

De onderdelen die ertoe doen als jij degene bent die integreert

Geen privé-endpoints

Elk scherm is te bouwen met de publieke API, omdat er geen andere soort is. Als je een campagnerapport in je eigen admin wilt inbedden, staat niets je in de weg en hoeft niets te worden gereverse-engineerd.

Idempotency-keys overal

Op elke muterende route. Jouw retry-logica, je at-least-once-wachtrij en je wankelende netwerk worden allemaal iemand anders' probleem — in het bijzonder dat van een unieke index.

Simuleren voordat je live gaat

POST /v1/simulate doorloopt een contact als proefrun door een funnel en geeft het pad terug plus elk bericht dat het zou versturen. Zet het gerust in je CI: een funnel is een graaf, en een graaf is te testen.

Een MCP-server

Wijs een agent aan op /mcp en laat hem funnels opstellen en controleren. Tools die kunnen versturen vereisen een expliciete bevestiging en zijn begrensd door quota, zodat een mislezen prompt niet uitgroeit tot vijftigduizend e-mails.

Webhooks naar buiten

Ondertekend, opnieuw geprobeerd met backoff, minstens één keer. Dezelfde gebeurteniswoordenschat die de rapporten gebruiken, zodat je datawarehouse en je dashboard het niet oneens zijn over wat "afgeleverd" betekent.

Wissing die daadwerkelijk aankomt

Een verwijderverzoek verwijdert het contact en de berichtgeschiedenis hier en verdeelt zich over elke zusterservice die een kopie bewaarde. Eén verzoek, één uitkomst, en iets waarnaar je kunt verwijzen als iemand het vraagt.

Waar de grens ligt

ClickSomo beheert een mailinglijst en wat die lijst deed. Het is niet jouw gebruikersdatabase en wil dat ook niet zijn: een contact draagt nooit een inloggegeven, logt nooit in en wordt nooit een account. Je gebruikers wonen in je product; contacten wonen hier, en de twee worden verbonden door een e-mailadres en de events die je kiest te versturen.

Die scheiding is bewust gekozen en is de reden waarom het toestemmingsmodel werkt. Jij bent de gegevensbeheerder voor je gebruikers; wij verwerken in jouw opdracht. Een ontwerp waarin een marketingtool stilletjes de identiteitsopslag wordt, is er een die later niet meer te ontwarren valt — en dat is precies de valkuil waar dit ontwerp tegen gebouwd is.

De praktische versie: stuur de events, stuur de attributen waarop je wilt segmenteren, en laat de rest waar het is. Als je merkt dat je je hele schema hierin probeert te duwen, is het segment dat je probeert te bouwen waarschijnlijk een query in je eigen database die als één booleaans attribuut binnen zou moeten komen.