SMS Flow Kampagner System

Teknisk & Kommerciel Handover Guide

Version: 1.0 | Dato: Januar 2025 | App: Loanly24 | Platform: Base44 + Twilio SMS

📋 Indholdsfortegnelse

1. System Oversigt

1.1 Formål

SMS Flow Kampagner systemet er et automatiseret marketing automation system, der:

  • Sender personaliserede SMS beskeder til leads baseret på triggers
  • Håndterer multi-step kampagner med delays
  • Respekterer opt-out regler (GDPR compliance)
  • Tracker clicks og engagement
  • Integrerer med Twilio for SMS levering

1.2 Hovedkomponenter

Campaign (Flow) → CampaignStep (Steps) → CampaignJob (Scheduled)
↓
Lead (Målgruppe) → Cron Job Processor → Twilio (SMS)
↓
SmsOptOut (GDPR) → SmsLog & Tracking (Analytics)

2. Arkitektur & Data Model

2.1 Database Entities

Campaign (Kampagne)

Hovedentitet for en SMS kampagne.

name: string
type: flow | broadcast
status: draft | scheduled | running | paused | completed | cancelled
trigger_type: manual | on_lead_created | on_lead_inactive

CampaignStep (Kampagne Trin)

campaign_id: string
name: string
order_index: 0, 1, 2, etc.
delay_hours: 24
sms_template: Hej navn!
stop_if_converted: true

Eksempel flow:

  • Step 0: delay_hours=0 → "Velkommen! {{name}}"
  • Step 1: delay_hours=24 → "Hej igen {{name}}, har du set vores tilbud?"
  • Step 2: delay_hours=72 → "Sidste chance {{name}}!"

3. Twilio Integration

3.1 Opsætning

Systemet bruger Twilio til at sende SMS beskeder.

Environment Variables (Secrets):

TWILIO_ACCOUNT_SID=ACxxxxxxxx...
TWILIO_AUTH_TOKEN=xxxxxxxx...
TWILIO_MESSAGING_SERVICE_SID=MGxxxxxxxx...

3.2 E.164 Telefonnummer Format

⚠️ Kritisk vigtig! Twilio kræver E.164 format.

function normalizePhone(phone) {
let cleaned = phone.replace(/[\s\-\(\)]/g, '');
cleaned = cleaned.replace(/^(\+45|0045|45)/, '');
if (cleaned.length === 8) {
return `+45${cleaned}`;
}
return cleaned;
}

5. Cron Jobs & Automatisering

5.1 Arkitektur

SMS beskeder sendes IKKE real-time. De scheduleres og processeres af cron jobs.

Cron Job Setup

Brug en ekstern cron service (cron-job.org, EasyCron, GitHub Actions)

External Cron Service
↓
GET /api/functions/processFlowCampaigns?secret=xxx
↓
1. Hent alle "planned" jobs hvor scheduled_at <= now
2. For hver job:
- Check opt-out status
- Check if lead converted
- Replace template variables
- Send via Twilio
- Update job status
- Log to SmsLog
3. Return summary

5.2 Opsætning af Cron Job

Mulighed 1: cron-job.org (Gratis)

  1. Gå til https://cron-job.org/
  2. Opret konto
  3. Create ny cron job
  4. URL: https://nordic-loan-992ca5e8.base44.app/api/functions/processFlowCampaigns?secret=YOUR_SECRET
  5. Schedule: */5 * * * * (hver 5. minut)

Mulighed 2: GitHub Actions

name: Process SMS Campaigns
on: schedule: cron: '*/5 * * * *'
jobs:
process:
runs-on: ubuntu-latest
steps:
- name: Trigger SMS Processing
run: curl -X GET "URL?secret=SECRET"

6. Opt-Out System

6.1 GDPR & Legal Requirements

✅ Krav:

  • • Hver SMS skal have afmeld mulighed
  • • Afmelding skal være enkel og gratis
  • • Afmeldte skal respekteres med det samme
  • • Audit log af alle opt-out/opt-in handlinger
  • • Mulighed for re-aktivering (med consent)

6.2 Opt-Out Landing Page

Se pages/Afmeld.jsx for komplet implementation.

7. Link Shortening & Tracking

7.1 Hvorfor Link Tracking?

  • SMS har karakter begrænsning (160 tegn for single SMS)
  • Lange URLs bruger værdifuld plads
  • Tracking af clicks giver vigtig engagement data
  • Kan måle kampagne effektivitet

9. Faldgruber & Best Practices

9.1 Almindelige Fejl

❌ Fejl #1: Manglende E.164 Format

// FORKERT
const phone = "20 12 34 56";
await twilioClient.messages.create({ to: phone });
// KORREKT
const phone = normalizePhone("20 12 34 56");
await twilioClient.messages.create({ to: phone });

❌ Fejl #2: Ikke Checke Opt-Out

// KORREKT - Check opt-out ALTID
const optOut = await base44.entities.SmsOptOut.filter({
phone: normalizedPhone,
opted_out: true
});
if (optOut.length > 0) {
console.log("User opted out, skipping");
return;
}

9.4 GDPR Compliance Checklist

  • ☐ Opt-out link i ALLE marketing SMS
  • ☐ Respektér opt-outs med det samme
  • ☐ Audit log af alle opt-out actions
  • ☐ Data retention policy
  • ☐ User kan downloade deres data
  • ☐ Clear consent ved signup
  • ☐ Privacy policy link

10. Deployment & Monitoring

10.1 Deployment Checklist

Pre-deployment

  • ☐ Test all functions locally
  • ☐ Verify Twilio credentials
  • ☐ Setup cron job service
  • ☐ Test opt-out flow
  • ☐ Verify link tracking

Deployment

  • ☐ Deploy functions to Base44
  • ☐ Set environment variables
  • ☐ Create initial campaigns
  • ☐ Test with small batch
  • ☐ Monitor logs for errors

Post-deployment

  • ☐ Monitor cron executions
  • ☐ Check Twilio usage
  • ☐ Review opt-out rates
  • ☐ Analyze CTR
  • ☐ Setup alerts

10.4 Cost Monitoring

💰 Twilio Costs:

  • • SMS til Danmark: ~$0.08 per SMS
  • • Estimat: 1000 leads × 3 steps = 3000 SMS = $240
  • • Med 10% opt-out: 2700 SMS = $216

Sample SMS Templates

Welcome SMS

Hej [first_name]! 👋
Tak for din interesse i lån hos [lender_name].
Vi kontakter dig snart med dit tilbud.
Afmeld: [unsubscribe]

Follow-up SMS (Step 1)

Hej igen [first_name]!
Har du set vores seneste lånetilbud?
Klik her: [link]
Spørgsmål? Svar på denne SMS.
Afmeld: [unsubscribe]

Last Chance SMS (Step 2)

Sidste chance [first_name]! ⏰
Dit lånetilbud udløber snart.
Se tilbud nu: [link]
Afmeld: [unsubscribe]

Support & Resources

Twilio Resources

Base44 Resources

🚀

Held og lykke med videreudviklingen!

Version 1.0 | Januar 2025

Loanly24

Vi sammenligner lån for at hjælpe dig med at træffe et informeret valg. Tjenesten er gratis og uforpligtende.

Kontakt

Nexa Finance A/S

Vesterbrogade 149

1620 København V

CVR: DK37979307

info@loanly24.dk

Loanly24.dk er en uafhængig sammenligningsservice for finansielle produkter. Vi tilbyder ikke egne lån eller kredit, men formidler forespørgsler videre til vores samarbejdspartnere, som er registrerede finansielle virksomheder under tilsyn af Finanstilsynet. Loanly24.dk kan modtage kommission for henvisning til låneudbydere, hvilket kan have indflydelse på sorteringsrækkefølgen. Oversigten er ikke udtømmende for samtlige lånemuligheder på markedet. Vi garanterer ikke godkendelse af lån, og alle vilkår og renter fastsættes af den enkelte långiver. Informationen på siden kan indeholde fejl eller ufuldstændige oplysninger. Opdaterede vilkår finder du altid hos långiver.

© 2026 Loanly24. Alle rettigheder forbeholdes.|Privatlivspolitik|Cookies