Getting Started with Aeion Marketing
Create your first email campaign, build a welcome automation journey, configure domain authentication, run your first Wilson Score A/B test, and set up SMS — all in Aeion OS.
Configure Your Email Provider
Before sending anything, configure your sending domain and email provider.
Navigate: Marketing → Settings → Email Providers
Configure SendGrid, Mailgun, Resend, Postmark, or SMTP:
json
{
"provider": "sendgrid",
"label": "Production",
"apiKey": "SG.xxxxx",
"fromEmail": "noreply@yourdomain.com",
"fromName": "Your Brand",
"isActive": true,
"webhookUrl": "https://yourtenant.aeionos.com/bridge/marketing/webhook"
}
Required webhook URL: Webhook events (opens, clicks, bounces, complaints) route here and update your send records automatically.
Test the provider: Click Send Test Email — a diagnostic email is sent, latency and success/failure recorded in the provider record.
If you haven't configured DNS:
- Run Domain Authentication Check — probes your domain's SPF, DKIM, and DMARC records
- Tests the common DKIM selector patterns used by major providers (Google, SendGrid, Mailgun, etc.)
- Grades: A (proceed), B (proceed with warning), C/F (block and fix)
- Result cached briefly to avoid unnecessary repeat DNS lookups
- Follow the recommendations to add DNS records
Upload Your Subscriber List
Navigate: Marketing → Subscribers → Import CSV
CSV format:
csv
email,name,rfm_lifetime_value,consent_text
sarah@example.com,Sarah Chen,450,I consent to receive marketing emails
mike@example.com,Mike Ross,120,I consent to receive marketing emails
lisa@example.com,Lisa Park,890,I consent to receive marketing emails
What happens during import:
- The CSV is parsed, including quoted fields
- Each subscriber is found or created
- A subscription record is created for the newsletter
- If double opt-in is required: status = "pending", and a 72-hour confirmation token is generated
- If confirmation is skipped (admin import): status = "active" immediately
Consent tracking: Every imported subscriber has their consent text recorded — required for GDPR Article 7 compliance.
Double opt-in flow:
- Subscriber receives confirmation email with a link
- The link contains a unique, unguessable token
- The token expires after 72 hours
- After expiry, subscriber must re-subscribe
Build Your First Email Template
Navigate: Marketing → Templates → New Template
The email editor is a visual MJML canvas — drag and drop blocks, style them, and the compiler produces standards-compliant HTML.
Block types:
- Hero — Large image + headline
- Text — Rich text with
{{handlebars}}variable support - Image — Optimized via Media module, lazy-loaded
- Button — CTA button
- Columns — 2-column or 3-column layout
- Spacer — Vertical spacing control
- Divider — Horizontal rule
- Footer — Unsubscribe link (auto-generated, RFC 8058 compliant)
Handlebars variables:
``` Hello {{firstName}},
{{#if rfm.isChampion}} As one of our best customers, enjoy 20% off your next order. {{else}} Thanks for shopping with us! {{/if}} ```
Variable evaluation: Variables resolve at render time, per subscriber. A 100K-subscriber campaign renders 100K personalized emails from one template.
Preview: See how the email renders across Gmail, Apple Mail, Outlook, and Yahoo.
Create Your First Campaign
Navigate: Marketing → Campaigns → New Campaign
json
{
"name": "Q2 Product Launch",
"subject": "{{#if subscriber.rfm.isChampion}}Exclusive: {{productName}} is here{{else}}{{productName}} is now available{{/if}}",
"templateId": "template_01J8XK4N3P",
"segment": {
"conditions": [
{ "field": "rfm.category", "operator": "equals", "value": "champion" },
{
"field": "lastEngagementAt",
"operator": "greaterThan",
"value": "-90d"
}
],
"logic": "AND"
},
"fromEmail": "noreply@yourdomain.com",
"fromName": "Your Brand"
}
A/B test variant:
Variant A: "Your cart is waiting, {{firstName}}"
Variant B: "Don't leave your cart behind"
Split: 50% to Variant A, 50% to Variant B. Wilson Score evaluates after significance is reached.
Send: Click Launch Campaign:
- The campaign is validated — a duplicate launch (double-click or retry) can't re-send to your whole list
- Status is set to "sending"
- Recipients are chunked into isolated batches, so one bad batch never affects the rest of the send
- Batches are processed concurrently (10K+ msgs/sec)
- Each send includes pre-processed HTML, a unique tracking token, and a List-Unsubscribe header
Build a Welcome Automation Journey
Navigate: Marketing → Automations → New Automation
Welcome sequence (7 days):
[Trigger: Subscriber joins list]
↓
[Email 1: Welcome + your best-seller]
↓
[Wait: 2 days]
↓
[Condition: Opened email?]
├─ Yes → [Email 2: Cross-sell product] → [Wait: 3 days] → [Goal: Purchase → Exit]
└─ No → [SMS: "Did you miss our email?"] → [Wait: 2 days] → [Exit: Inactive]
Node execution:
- Email node: Renders the MJML template and sends it
- Wait node: Schedules a delayed step; enrollment status moves to "waiting" and resumes automatically when the timer fires. A recursion guard protects against runaway loops
- Condition node: Evaluates
subscriber.rfm.category === 'at-risk', branches true/false - SMS node: Composes and sends via AWS SNS or Twilio
- Goal node: Sets enrollment status → "completed"
- Exit node: Logs exit reason
Re-enrollment: Set allowReEnrollment: true on the automation for repeatable journeys.
Analyze A/B Test Results with Wilson Score
| Variant | Sent | Opens | Open Rate | Wilson Lower Bound | Winner? |
|---|---|---|---|---|---|
| A: "Your cart is waiting, {{firstName}}" | 5,000 | 1,100 | 22.0% | 0.209 | ✅ |
| B: "Don't leave your cart behind" | 5,000 | 980 | 19.6% | 0.187 | — |
Set Up SMS
Navigate: Marketing → Settings → SMS Providers
json
{
"provider": "twilio",
"accountSid": "ACxxxx",
"authToken": "xxx",
"fromNumber": "+1555xxxxxxx",
"isActive": true
}
SMS in automation journeys: Add an SMS node to any automation. Dispatches via AWS SNS or Twilio. 160-char single-segment limit, 306 for concatenated.
SMS use cases:
- Abandoned cart:
"{{firstName}}, you left {{productName}} in your cart. Complete: {{checkoutUrl}}" - Appointment reminder:
"Your appointment is tomorrow at {{time}}. Reply CANCEL to reschedule." - Shipping notification:
"Your order #{{orderId}} has shipped! Track: {{trackingUrl}}"
RFM Segmentation for Smarter Campaigns
| Score | Recency | Frequency | Monetary |
|---|---|---|---|
| 4 | ≤7 days | 20+ | $500+ |
| 3 | 8–30 days | 10–19 | $100–499 |
| 2 | 31–90 days | 4–9 | $20–99 |
| 1 | 91+ days | 0–3 | $0–19 |
Compliance: GDPR, Unsubscribe, Suppression
GDPR Anonymization: When a subscriber requests deletion, email, name, and IP are hashed with SHA-256. Metrics stay intact, PII is irrecoverable. GDPR Article 20 right to portability → JSON export.
Unsubscribe (RFC 8058): Every email includes List-Unsubscribe: <url> and List-Unsubscribe-Post: List-Unsubscribe=One-Click. Gmail, Yahoo, Outlook show native unsubscribe button. One click → suppressed.
Suppression: Hard bounces, complaints, unsubscribes, GDPR deletions, and role addresses are all suppressed automatically, checked before every send. Fail-open: never block a campaign on a database hiccup.