# 1. Email Campaigns — Test Cases

User Type: **Super Administrator**
Source: *Mi Digital Academy - Education CRM Features Document*
Spec: email_campaigns.md — every feature, sub-feature, and rule covered

---

## Test Execution Policy
- Zero tolerance: any deviation from documented behavior = FAILED = bug
- Every bug is immediately logged/reported (Bug ID, feature, sub-feature,
  expected vs actual, severity) and fixed 100% before the group passes
- Feature group passes only at 100% test pass rate

## Coverage Matrix
| Feature | Sub-feature / Rule | Test IDs |
|---------|--------------------|----------|
| 1.1 Drip Campaigns for Onboarding | Drip campaign: the campaign (the campaign, the email, the sequence, the trigger, the schedule) | TC-SA-20-01-001 |
| 1.1 Drip Campaigns for Onboarding | Email: the email (the email, the subject, the body, the link) | TC-SA-20-01-002 |
| 1.1 Drip Campaigns for Onboarding | Sequence: the sequence (the sequence of the emails, the order, the timing) | TC-SA-20-01-003 |
| 1.1 Drip Campaigns for Onboarding | Trigger: the trigger (the trigger of the campaign, e.g., the signup, the course start) | TC-SA-20-01-004 |
| 1.1 Drip Campaigns for Onboarding | Schedule: the schedule (the schedule of the emails, the delay, the frequency) | TC-SA-20-01-005 |
| 1.1 Drip Campaigns for Onboarding | Campaign status: the status (the active, the paused, the completed) | TC-SA-20-01-006 |
| 1.1 Drip Campaigns for Onboarding | Campaign view: the view (the campaigns, the emails, the sequences, the schedules) | TC-SA-20-01-007 |
| 1.1 Drip Campaigns for Onboarding | Audit logging of the drip campaign configuration | TC-SA-20-01-008 |
| 1.1 Drip Campaigns for Onboarding | Rule: the drip campaign is the sequence (the campaign, the email, the sequence, the trigger, the schedule); the drip is the flow | TC-SA-20-01-001 |
| 1.1 Drip Campaigns for Onboarding | Rule: the email is the message (the email, the subject, the body, the link); the email is the content | TC-SA-20-01-002 |
| 1.1 Drip Campaigns for Onboarding | Rule: the sequence is the order (the sequence of the emails, the order, the timing); the sequence is the path | TC-SA-20-01-003 |
| 1.1 Drip Campaigns for Onboarding | Rule: the trigger is the start (the trigger of the campaign, e.g., the signup, the course start); the trigger is the event | TC-SA-20-01-004 |
| 1.1 Drip Campaigns for Onboarding | Rule: the drip is running (the campaigns, the emails, the sequences, the schedules); the onboarding is managed | TC-SA-20-01-007 |
| 1.1 Drip Campaigns for Onboarding | Rule: drip campaign configuration is audit-logged with the campaign, trigger, and timestamp | TC-SA-20-01-008 |
| 1.2 Re-engagement Emails for Inactive Users | Re-engagement email: the email (the email, the user, the trigger, the schedule) | TC-SA-20-01-009 |
| 1.2 Re-engagement Emails for Inactive Users | Inactive user: the user (the inactive user, the inactivity, the date) | TC-SA-20-01-010 |
| 1.2 Re-engagement Emails for Inactive Users | Inactivity trigger: the trigger (the trigger of the inactivity, e.g., the 7 days, the 30 days) | TC-SA-20-01-011 |
| 1.2 Re-engagement Emails for Inactive Users | Email content: the content (the content of the email, the subject, the body, the offer) | TC-SA-20-01-012 |
| 1.2 Re-engagement Emails for Inactive Users | Schedule: the schedule (the schedule of the email, the delay, the frequency) | TC-SA-20-01-013 |
| 1.2 Re-engagement Emails for Inactive Users | Campaign status: the status (the active, the paused, the completed) | TC-SA-20-01-014 |
| 1.2 Re-engagement Emails for Inactive Users | Campaign view: the view (the emails, the users, the triggers, the schedules) | TC-SA-20-01-015 |
| 1.2 Re-engagement Emails for Inactive Users | Audit logging of the re-engagement email configuration | TC-SA-20-01-016 |
| 1.2 Re-engagement Emails for Inactive Users | Rule: the re-engagement email is the win-back (the email, the user, the trigger, the schedule); the email is the message | TC-SA-20-01-009 |
| 1.2 Re-engagement Emails for Inactive Users | Rule: the inactive user is the target (the inactive user, the inactivity, the date); the user is the recipient | TC-SA-20-01-010 |
| 1.2 Re-engagement Emails for Inactive Users | Rule: the inactivity trigger is the condition (the trigger of the inactivity, e.g., the 7 days, the 30 days); the trigger is the rule | TC-SA-20-01-011 |
| 1.2 Re-engagement Emails for Inactive Users | Rule: the schedule is the timing (the schedule of the email, the delay, the frequency); the schedule is the control | TC-SA-20-01-013 |
| 1.2 Re-engagement Emails for Inactive Users | Rule: the re-engagement is running (the emails, the users, the triggers, the schedules); the win-back is managed | TC-SA-20-01-015 |
| 1.2 Re-engagement Emails for Inactive Users | Rule: re-engagement email configuration is audit-logged with the email, trigger, and timestamp | TC-SA-20-01-016 |
| 1.3 Promotional Email Blasts | Promotional email: the email (the email, the audience, the content, the date) | TC-SA-20-01-017 |
| 1.3 Promotional Email Blasts | Audience: the audience (the audience of the email, the segment, the count) | TC-SA-20-01-018 |
| 1.3 Promotional Email Blasts | Email content: the content (the content of the email, the subject, the body, the offer) | TC-SA-20-01-019 |
| 1.3 Promotional Email Blasts | Send date: the date (the date of the send, the time) | TC-SA-20-01-020 |
| 1.3 Promotional Email Blasts | Send status: the status (the scheduled, the sent, the completed) | TC-SA-20-01-021 |
| 1.3 Promotional Email Blasts | Open rate: the rate (the rate of the opens, the percentage) | TC-SA-20-01-022 |
| 1.3 Promotional Email Blasts | Click rate: the rate (the rate of the clicks, the percentage) | TC-SA-20-01-023 |
| 1.3 Promotional Email Blasts | Audit logging of the promotional email blast | TC-SA-20-01-024 |
| 1.3 Promotional Email Blasts | Rule: the promotional email is the broadcast (the email, the audience, the content, the date); the email is the message | TC-SA-20-01-017 |
| 1.3 Promotional Email Blasts | Rule: the audience is the target (the audience of the email, the segment, the count); the audience is the recipient | TC-SA-20-01-018 |
| 1.3 Promotional Email Blasts | Rule: the send date is the moment (the date of the send, the time); the date is the schedule | TC-SA-20-01-020 |
| 1.3 Promotional Email Blasts | Rule: the open rate is the measure (the rate of the opens, the percentage); the rate is the engagement | TC-SA-20-01-022 |
| 1.3 Promotional Email Blasts | Rule: the blast is sent (the emails, the audiences, the content, the dates); the broadcast is managed | TC-SA-20-01-021 |
| 1.3 Promotional Email Blasts | Rule: promotional email blast is audit-logged with the email, audience, and timestamp | TC-SA-20-01-024 |
| 1.4 Personalized Course Recommendations | Recommendation: the recommendation (the recommendation, the user, the course, the reason, the date) | TC-SA-20-01-025 |
| 1.4 Personalized Course Recommendations | User: the user (the user, the profile, the history) | TC-SA-20-01-026 |
| 1.4 Personalized Course Recommendations | Course: the course (the course, the name, the recommendation) | TC-SA-20-01-027 |
| 1.4 Personalized Course Recommendations | Recommendation reason: the reason (the reason of the recommendation, e.g., the history, the interest) | TC-SA-20-01-028 |
| 1.4 Personalized Course Recommendations | Recommendation date: the date (the date of the recommendation, the time) | TC-SA-20-01-029 |
| 1.4 Personalized Course Recommendations | Recommendation status: the status (the sent, the opened, the clicked) | TC-SA-20-01-030 |
| 1.4 Personalized Course Recommendations | Recommendation view: the view (the recommendations, the users, the courses, the dates) | TC-SA-20-01-031 |
| 1.4 Personalized Course Recommendations | Audit logging of the recommendation sending | TC-SA-20-01-032 |
| 1.4 Personalized Course Recommendations | Rule: the recommendation is the personalization (the recommendation, the user, the course, the reason, the date); the recommendation is the match | TC-SA-20-01-025 |
| 1.4 Personalized Course Recommendations | Rule: the user is the recipient (the user, the profile, the history); the user is the target | TC-SA-20-01-026 |
| 1.4 Personalized Course Recommendations | Rule: the course is the content (the course, the name, the recommendation); the course is the offer | TC-SA-20-01-027 |
| 1.4 Personalized Course Recommendations | Rule: the recommendation reason is the logic (the reason of the recommendation, e.g., the history, the interest); the reason is the basis | TC-SA-20-01-028 |
| 1.4 Personalized Course Recommendations | Rule: the recommendation is sent (the recommendations, the users, the courses, the dates); the personalization is managed | TC-SA-20-01-031 |
| 1.4 Personalized Course Recommendations | Rule: recommendation sending is audit-logged with the recommendation, user, and timestamp | TC-SA-20-01-032 |
| 1.5 A/B Testing for Campaigns | A/B test: the test (the test, the variant, the audience, the metric, the result) | TC-SA-20-01-033 |
| 1.5 A/B Testing for Campaigns | Variant: the variant (the variant of the test, e.g., the A, the B) | TC-SA-20-01-034 |
| 1.5 A/B Testing for Campaigns | Audience: the audience (the audience of the test, the segment, the count) | TC-SA-20-01-035 |
| 1.5 A/B Testing for Campaigns | Test metric: the metric (the metric of the test, e.g., the open rate, the click rate) | TC-SA-20-01-036 |
| 1.5 A/B Testing for Campaigns | Test result: the result (the result of the test, the winner, the percentage) | TC-SA-20-01-037 |
| 1.5 A/B Testing for Campaigns | Test status: the status (the running, the completed, the analyzed) | TC-SA-20-01-038 |
| 1.5 A/B Testing for Campaigns | Test view: the view (the tests, the variants, the audiences, the metrics) | TC-SA-20-01-039 |
| 1.5 A/B Testing for Campaigns | Audit logging of the A/B test configuration | TC-SA-20-01-040 |
| 1.5 A/B Testing for Campaigns | Rule: the A/B test is the experiment (the test, the variant, the audience, the metric, the result); the test is the comparison | TC-SA-20-01-033 |
| 1.5 A/B Testing for Campaigns | Rule: the variant is the option (the variant of the test, e.g., the A, the B); the variant is the choice | TC-SA-20-01-034 |
| 1.5 A/B Testing for Campaigns | Rule: the audience is the target (the audience of the test, the segment, the count); the audience is the recipient | TC-SA-20-01-035 |
| 1.5 A/B Testing for Campaigns | Rule: the test metric is the measure (the metric of the test, e.g., the open rate, the click rate); the metric is the value | TC-SA-20-01-036 |
| 1.5 A/B Testing for Campaigns | Rule: the test is complete (the tests, the variants, the audiences, the metrics); the experiment is managed | TC-SA-20-01-039 |
| 1.5 A/B Testing for Campaigns | Rule: A/B test configuration is audit-logged with the test, variant, and timestamp | TC-SA-20-01-040 |

## 1.1 Drip Campaigns for Onboarding

### TC-SA-20-01-001 — Drip campaign: the campaign (the campaign, the email, the sequence, the trigger, the schedule); the drip is the flow
**Type:** Positive
**Covers:** 1.1 → Drip campaign: the campaign (the campaign, the email, the sequence, the trigger, the schedule); Rule: the drip campaign is the sequence (the campaign, the email, the sequence, the trigger, the schedule); the drip is the flow
**Preconditions:** Super Admin is logged in; new users are signing up.
**Steps:**
1. Open Marketing & Communication → Email Campaigns → Drip Campaigns for Onboarding.
2. Run the drip campaign: the campaign (the campaign, the email, the sequence, the trigger, the schedule) — verify the drip campaign is the sequence.
3. Verify the campaign shows the email, the sequence, the trigger, and the schedule.
4. A new user signs up — verify the drip campaign starts for that user.
**Expected Result:** The drip campaign is run — the campaign, the email, the sequence, the trigger, and the schedule are the flow.
**Priority:** Critical

### TC-SA-20-01-002 — Email: the email (the email, the subject, the body, the link); the email is the content
**Type:** Positive
**Covers:** 1.1 → Email: the email (the email, the subject, the body, the link); Rule: the email is the message (the email, the subject, the body, the link); the email is the content
**Preconditions:** A drip campaign is being configured.
**Steps:**
1. Create the emails: the email (the email, the subject, the body, the link) — verify the email is the message.
2. Verify each email shows the subject, the body, and the link.
3. Verify the emails are attached to the drip campaign in order.
**Expected Result:** The emails are created — the email, the subject, the body, and the link are the content.
**Priority:** High

### TC-SA-20-01-003 — Sequence: the sequence (the sequence of the emails, the order, the timing); the sequence is the path
**Type:** Positive
**Covers:** 1.1 → Sequence: the sequence (the sequence of the emails, the order, the timing); Rule: the sequence is the order (the sequence of the emails, the order, the timing); the sequence is the path
**Preconditions:** A drip campaign with multiple emails exists.
**Steps:**
1. Set the sequence: the sequence (the sequence of the emails, the order, the timing) — verify the sequence is the order.
2. Verify the emails are sent in the defined order.
3. Verify the timing between emails matches the sequence.
**Expected Result:** The sequence is set — the sequence of the emails, the order, and the timing are the path.
**Priority:** High

### TC-SA-20-01-004 — Trigger: the trigger (the trigger of the campaign, e.g., the signup, the course start); the trigger is the event
**Type:** Edge
**Covers:** 1.1 → Trigger: the trigger (the trigger of the campaign, e.g., the signup, the course start); Rule: the trigger is the start (the trigger of the campaign, e.g., the signup, the course start); the trigger is the event
**Preconditions:** A drip campaign is configured with the signup trigger; a user who signs up twice (duplicate trigger edge) is also prepared.
**Steps:**
1. Set the trigger: the trigger (the trigger of the campaign, e.g., the signup, the course start) — verify the trigger is the start.
2. A user signs up — verify the drip campaign starts exactly once.
3. A user triggers the same event again — verify the campaign does not restart or duplicate (no double drip).
**Expected Result:** The trigger works — the trigger of the campaign (the signup, the course start) is the event; duplicate triggers do not restart the drip.
**Priority:** High

### TC-SA-20-01-005 — Schedule: the schedule (the schedule of the emails, the delay, the frequency); the schedule is the timing
**Type:** Positive
**Covers:** 1.1 → Schedule: the schedule (the schedule of the emails, the delay, the frequency)
**Preconditions:** A drip campaign with a defined schedule exists.
**Steps:**
1. Set the schedule: the schedule (the schedule of the emails, the delay, the frequency) — verify the schedule is the timing.
2. Verify each email is sent after the defined delay.
3. Verify the frequency matches the schedule.
**Expected Result:** The schedule is set — the schedule of the emails, the delay, and the frequency are the timing.
**Priority:** High

### TC-SA-20-01-006 — Campaign status: the status (the active, the paused, the completed); the status is the state
**Type:** Positive
**Covers:** 1.1 → Campaign status: the status (the active, the paused, the completed)
**Preconditions:** Drip campaigns with active, paused, and completed statuses exist.
**Steps:**
1. View the campaign status: the status (the active, the paused, the completed) — verify the status is the state.
2. Pause an active campaign — verify emails stop being sent; resume it — verify sending resumes.
3. Verify a finished campaign shows the completed status.
**Expected Result:** The campaign status is shown — the active, the paused, and the completed are the state.
**Priority:** High

### TC-SA-20-01-007 — Campaign view: the view (the campaigns, the emails, the sequences, the schedules); the onboarding is managed
**Type:** Positive
**Covers:** 1.1 → Campaign view: the view (the campaigns, the emails, the sequences, the schedules); Rule: the drip is running (the campaigns, the emails, the sequences, the schedules); the onboarding is managed
**Preconditions:** Multiple drip campaigns exist.
**Steps:**
1. View the campaigns: the view (the campaigns, the emails, the sequences, the schedules) — verify the drip is running.
2. Verify each campaign shows the emails, the sequences, and the schedules.
3. Verify the onboarding is managed (create, pause, resume, complete).
**Expected Result:** The campaigns are viewed — the campaigns, the emails, the sequences, and the schedules are visible; the onboarding is managed.
**Priority:** High

### TC-SA-20-01-008 — Drip campaign configuration is audit-logged with the campaign, trigger, and timestamp
**Type:** Positive
**Covers:** 1.1 → Audit logging of the drip campaign configuration; Rule: drip campaign configuration is audit-logged with the campaign, trigger, and timestamp
**Preconditions:** Super Admin has configured a drip campaign.
**Steps:**
1. Open the audit trail and filter by "drip campaign".
2. Verify entries show the campaign, the trigger, and the timestamp.
**Expected Result:** The drip campaign configuration is audit-logged with the campaign, trigger, and timestamp.
**Priority:** Critical

## 1.2 Re-engagement Emails for Inactive Users

### TC-SA-20-01-009 — Re-engagement email: the email (the email, the user, the trigger, the schedule); the email is the message
**Type:** Positive
**Covers:** 1.2 → Re-engagement email: the email (the email, the user, the trigger, the schedule); Rule: the re-engagement email is the win-back (the email, the user, the trigger, the schedule); the email is the message
**Preconditions:** Super Admin is logged in; inactive users exist.
**Steps:**
1. Open Marketing & Communication → Email Campaigns → Re-engagement Emails for Inactive Users.
2. Send the re-engagement email: the email (the email, the user, the trigger, the schedule) — verify the re-engagement email is the win-back.
3. Verify the email shows the user, the trigger, and the schedule.
4. An inactive user crosses the inactivity threshold — verify the email is sent.
**Expected Result:** The re-engagement email is sent — the email, the user, the trigger, and the schedule are the message.
**Priority:** Critical

### TC-SA-20-01-010 — Inactive user: the user (the inactive user, the inactivity, the date); the user is the recipient
**Type:** Positive
**Covers:** 1.2 → Inactive user: the user (the inactive user, the inactivity, the date); Rule: the inactive user is the target (the inactive user, the inactivity, the date); the user is the recipient
**Preconditions:** Inactive users with inactivity dates exist.
**Steps:**
1. Select the inactive users: the user (the inactive user, the inactivity, the date) — verify the inactive user is the target.
2. Verify each user shows the inactivity and the date.
3. Verify only inactive users are targeted (active users are excluded).
**Expected Result:** The inactive users are selected — the inactive user, the inactivity, and the date are the recipient.
**Priority:** High

### TC-SA-20-01-011 — Inactivity trigger: the trigger (the trigger of the inactivity, e.g., the 7 days, the 30 days); the trigger is the rule
**Type:** Edge
**Covers:** 1.2 → Inactivity trigger: the trigger (the trigger of the inactivity, e.g., the 7 days, the 30 days); Rule: the inactivity trigger is the condition (the trigger of the inactivity, e.g., the 7 days, the 30 days); the trigger is the rule
**Preconditions:** A re-engagement campaign is configured with the 30-day trigger; a user at exactly 30 days (boundary edge) and one at 29 days also exist.
**Steps:**
1. Set the inactivity trigger: the trigger (the trigger of the inactivity, e.g., the 7 days, the 30 days) — verify the inactivity trigger is the condition.
2. A user reaches exactly 30 days of inactivity — verify the email is sent.
3. A user at 29 days — verify no email is sent (threshold not crossed).
**Expected Result:** The inactivity trigger works — the trigger of the inactivity (the 7 days, the 30 days) is the rule; the boundary is handled exactly.
**Priority:** High

### TC-SA-20-01-012 — Email content: the content (the content of the email, the subject, the body, the offer); the content is the message
**Type:** Positive
**Covers:** 1.2 → Email content: the content (the content of the email, the subject, the body, the offer)
**Preconditions:** A re-engagement campaign is being configured.
**Steps:**
1. Create the email content: the content (the content of the email, the subject, the body, the offer) — verify the content is the message.
2. Verify the content shows the subject, the body, and the offer.
3. Verify the offer in the content is valid and clickable.
**Expected Result:** The email content is created — the content of the email, the subject, the body, and the offer are the message.
**Priority:** High

### TC-SA-20-01-013 — Schedule: the schedule (the schedule of the email, the delay, the frequency); the schedule is the control
**Type:** Positive
**Covers:** 1.2 → Schedule: the schedule (the schedule of the email, the delay, the frequency); Rule: the schedule is the timing (the schedule of the email, the delay, the frequency); the schedule is the control
**Preconditions:** A re-engagement campaign is configured with a schedule.
**Steps:**
1. Set the schedule: the schedule (the schedule of the email, the delay, the frequency) — verify the schedule is the timing.
2. Verify the email is sent after the defined delay.
3. Verify the frequency matches the schedule.
**Expected Result:** The schedule is set — the schedule of the email, the delay, and the frequency are the control.
**Priority:** High

### TC-SA-20-01-014 — Campaign status: the status (the active, the paused, the completed); the status is the state
**Type:** Positive
**Covers:** 1.2 → Campaign status: the status (the active, the paused, the completed)
**Preconditions:** Re-engagement campaigns with active, paused, and completed statuses exist.
**Steps:**
1. View the campaign status: the status (the active, the paused, the completed) — verify the status is the state.
2. Pause an active campaign — verify emails stop being sent; resume it — verify sending resumes.
3. Verify a finished campaign shows the completed status.
**Expected Result:** The campaign status is shown — the active, the paused, and the completed are the state.
**Priority:** High

### TC-SA-20-01-015 — Campaign view: the view (the emails, the users, the triggers, the schedules); the win-back is managed
**Type:** Positive
**Covers:** 1.2 → Campaign view: the view (the emails, the users, the triggers, the schedules); Rule: the re-engagement is running (the emails, the users, the triggers, the schedules); the win-back is managed
**Preconditions:** Multiple re-engagement campaigns exist.
**Steps:**
1. View the campaigns: the view (the emails, the users, the triggers, the schedules) — verify the re-engagement is running.
2. Verify each campaign shows the emails, the users, the triggers, and the schedules.
3. Verify the win-back is managed (create, pause, resume, complete).
**Expected Result:** The campaigns are viewed — the emails, the users, the triggers, and the schedules are visible; the win-back is managed.
**Priority:** High

### TC-SA-20-01-016 — Re-engagement email configuration is audit-logged with the email, trigger, and timestamp
**Type:** Positive
**Covers:** 1.2 → Audit logging of the re-engagement email configuration; Rule: re-engagement email configuration is audit-logged with the email, trigger, and timestamp
**Preconditions:** Super Admin has configured a re-engagement email.
**Steps:**
1. Open the audit trail and filter by "re-engagement".
2. Verify entries show the email, the trigger, and the timestamp.
**Expected Result:** The re-engagement email configuration is audit-logged with the email, trigger, and timestamp.
**Priority:** Critical

## 1.3 Promotional Email Blasts

### TC-SA-20-01-017 — Promotional email: the email (the email, the audience, the content, the date); the email is the message
**Type:** Positive
**Covers:** 1.3 → Promotional email: the email (the email, the audience, the content, the date); Rule: the promotional email is the broadcast (the email, the audience, the content, the date); the email is the message
**Preconditions:** Super Admin is logged in; an audience is available.
**Steps:**
1. Open Marketing & Communication → Email Campaigns → Promotional Email Blasts.
2. Send the promotional email: the email (the email, the audience, the content, the date) — verify the promotional email is the broadcast.
3. Verify the email shows the audience, the content, and the date.
4. Send the blast — verify all audience members receive the email.
**Expected Result:** The promotional email is sent — the email, the audience, the content, and the date are the message.
**Priority:** Critical

### TC-SA-20-01-018 — Audience: the audience (the audience of the email, the segment, the count); the audience is the recipient
**Type:** Positive
**Covers:** 1.3 → Audience: the audience (the audience of the email, the segment, the count); Rule: the audience is the target (the audience of the email, the segment, the count); the audience is the recipient
**Preconditions:** Multiple audience segments exist.
**Steps:**
1. Select the audience: the audience (the audience of the email, the segment, the count) — verify the audience is the target.
2. Verify the audience shows the segment and the count.
3. Verify the blast is sent only to the selected audience.
**Expected Result:** The audience is selected — the audience of the email, the segment, and the count are the recipient.
**Priority:** High

### TC-SA-20-01-019 — Email content: the content (the content of the email, the subject, the body, the offer); the content is the message
**Type:** Positive
**Covers:** 1.3 → Email content: the content (the content of the email, the subject, the body, the offer)
**Preconditions:** A promotional blast is being configured.
**Steps:**
1. Create the email content: the content (the content of the email, the subject, the body, the offer) — verify the content is the message.
2. Verify the content shows the subject, the body, and the offer.
3. Verify the offer in the content is valid and clickable.
**Expected Result:** The email content is created — the content of the email, the subject, the body, and the offer are the message.
**Priority:** High

### TC-SA-20-01-020 — Send date: the date (the date of the send, the time); the date is the schedule
**Type:** Positive
**Covers:** 1.3 → Send date: the date (the date of the send, the time); Rule: the send date is the moment (the date of the send, the time); the date is the schedule
**Preconditions:** A promotional blast is configured with a future send date.
**Steps:**
1. Set the send date: the date (the date of the send, the time) — verify the send date is the moment.
2. Verify the blast is not sent before the send date.
3. Wait for the send date — verify the blast is sent at the exact time.
**Expected Result:** The send date is set — the date of the send and the time are the schedule; the blast fires at the exact moment.
**Priority:** High

### TC-SA-20-01-021 — Send status: the status (the scheduled, the sent, the completed); the broadcast is managed
**Type:** Positive
**Covers:** 1.3 → Send status: the status (the scheduled, the sent, the completed); Rule: the blast is sent (the emails, the audiences, the content, the dates); the broadcast is managed
**Preconditions:** Promotional blasts with scheduled, sent, and completed statuses exist.
**Steps:**
1. View the send status: the status (the scheduled, the sent, the completed) — verify the status is the state.
2. Verify a blast before its send date shows scheduled; after sending, sent; after delivery completes, completed.
3. Verify the broadcast is managed (schedule, send, complete).
**Expected Result:** The send status is shown — the scheduled, the sent, and the completed are the state; the broadcast is managed.
**Priority:** High

### TC-SA-20-01-022 — Open rate: the rate (the rate of the opens, the percentage); the rate is the engagement
**Type:** Edge
**Covers:** 1.3 → Open rate: the rate (the rate of the opens, the percentage); Rule: the open rate is the measure (the rate of the opens, the percentage); the rate is the engagement
**Preconditions:** A blast has been sent; a blast with zero opens (division edge) also exists.
**Steps:**
1. View the open rate: the rate (the rate of the opens, the percentage) — verify the open rate is the measure.
2. Verify the rate is calculated correctly (opens / delivered × 100).
3. View the blast with zero opens — verify the rate shows 0% (no division error).
**Expected Result:** The open rate is shown — the rate of the opens and the percentage are the engagement; a zero-open blast is handled.
**Priority:** High

### TC-SA-20-01-023 — Click rate: the rate (the rate of the clicks, the percentage); the rate is the engagement
**Type:** Positive
**Covers:** 1.3 → Click rate: the rate (the rate of the clicks, the percentage)
**Preconditions:** A blast has been sent with clicks recorded.
**Steps:**
1. View the click rate: the rate (the rate of the clicks, the percentage) — verify the click rate is the measure.
2. Verify the rate is calculated correctly (clicks / delivered × 100).
3. Verify the click rate is ≤ the open rate (clicks cannot exceed opens).
**Expected Result:** The click rate is shown — the rate of the clicks and the percentage are the engagement.
**Priority:** High

### TC-SA-20-01-024 — Promotional email blast is audit-logged with the email, audience, and timestamp
**Type:** Positive
**Covers:** 1.3 → Audit logging of the promotional email blast; Rule: promotional email blast is audit-logged with the email, audience, and timestamp
**Preconditions:** Super Admin has sent a promotional email blast.
**Steps:**
1. Open the audit trail and filter by "promotional blast".
2. Verify entries show the email, the audience, and the timestamp.
**Expected Result:** The promotional email blast is audit-logged with the email, audience, and timestamp.
**Priority:** Critical

## 1.4 Personalized Course Recommendations

### TC-SA-20-01-025 — Recommendation: the recommendation (the recommendation, the user, the course, the reason, the date); the recommendation is the match
**Type:** Positive
**Covers:** 1.4 → Recommendation: the recommendation (the recommendation, the user, the course, the reason, the date); Rule: the recommendation is the personalization (the recommendation, the user, the course, the reason, the date); the recommendation is the match
**Preconditions:** Super Admin is logged in; users with course history exist.
**Steps:**
1. Open Marketing & Communication → Email Campaigns → Personalized Course Recommendations.
2. Send the recommendation: the recommendation (the recommendation, the user, the course, the reason, the date) — verify the recommendation is the personalization.
3. Verify the recommendation shows the user, the course, the reason, and the date.
4. A user completes a course — verify a relevant recommendation is generated.
**Expected Result:** The recommendation is sent — the recommendation, the user, the course, the reason, and the date are the match.
**Priority:** Critical

### TC-SA-20-01-026 — User: the user (the user, the profile, the history); the user is the target
**Type:** Positive
**Covers:** 1.4 → User: the user (the user, the profile, the history); Rule: the user is the recipient (the user, the profile, the history); the user is the target
**Preconditions:** Users with profiles and history exist.
**Steps:**
1. Select the users: the user (the user, the profile, the history) — verify the user is the recipient.
2. Verify each user shows the profile and the history.
3. Verify recommendations are based on the user's profile and history.
**Expected Result:** The users are selected — the user, the profile, and the history are the target.
**Priority:** High

### TC-SA-20-01-027 — Course: the course (the course, the name, the recommendation); the course is the offer
**Type:** Positive
**Covers:** 1.4 → Course: the course (the course, the name, the recommendation); Rule: the course is the content (the course, the name, the recommendation); the course is the offer
**Preconditions:** Courses available for recommendation exist.
**Steps:**
1. Select the courses: the course (the course, the name, the recommendation) — verify the course is the content.
2. Verify each course shows the name and the recommendation.
3. Verify the recommended course is relevant to the user's history.
**Expected Result:** The courses are selected — the course, the name, and the recommendation are the offer.
**Priority:** High

### TC-SA-20-01-028 — Recommendation reason: the reason (the reason of the recommendation, e.g., the history, the interest); the reason is the basis
**Type:** Positive
**Covers:** 1.4 → Recommendation reason: the reason (the reason of the recommendation, e.g., the history, the interest); Rule: the recommendation reason is the logic (the reason of the recommendation, e.g., the history, the interest); the reason is the basis
**Preconditions:** Recommendations with reasons exist.
**Steps:**
1. Set the recommendation reason: the reason (the reason of the recommendation, e.g., the history, the interest) — verify the recommendation reason is the logic.
2. Verify each recommendation shows the reason.
3. Verify the reason matches the user's actual history or interest.
**Expected Result:** The recommendation reason is set — the reason of the recommendation (the history, the interest) is the basis.
**Priority:** High

### TC-SA-20-01-029 — Recommendation date: the date (the date of the recommendation, the time); the date is the moment
**Type:** Positive
**Covers:** 1.4 → Recommendation date: the date (the date of the recommendation, the time)
**Preconditions:** A recommendation is being sent.
**Steps:**
1. Set the recommendation date: the date (the date of the recommendation, the time) — verify the recommendation date is the moment.
2. Verify the recommendation is sent on the set date.
3. Verify the date is shown on the recommendation.
**Expected Result:** The recommendation date is set — the date of the recommendation and the time are the moment.
**Priority:** High

### TC-SA-20-01-030 — Recommendation status: the status (the sent, the opened, the clicked); the status is the state
**Type:** Positive
**Covers:** 1.4 → Recommendation status: the status (the sent, the opened, the clicked)
**Preconditions:** Recommendations with sent, opened, and clicked statuses exist.
**Steps:**
1. View the recommendation status: the status (the sent, the opened, the clicked) — verify the status is the state.
2. A user opens the recommendation — verify the status updates to opened.
3. A user clicks the recommendation — verify the status updates to clicked.
**Expected Result:** The recommendation status is shown — the sent, the opened, and the clicked are the state.
**Priority:** High

### TC-SA-20-01-031 — Recommendation view: the view (the recommendations, the users, the courses, the dates); the personalization is managed
**Type:** Positive
**Covers:** 1.4 → Recommendation view: the view (the recommendations, the users, the courses, the dates); Rule: the recommendation is sent (the recommendations, the users, the courses, the dates); the personalization is managed
**Preconditions:** Multiple recommendations exist.
**Steps:**
1. View the recommendations: the view (the recommendations, the users, the courses, the dates) — verify the recommendation is sent.
2. Verify each recommendation shows the user, the course, and the date.
3. Verify the personalization is managed (create, send, track).
**Expected Result:** The recommendations are viewed — the recommendations, the users, the courses, and the dates are visible; the personalization is managed.
**Priority:** High

### TC-SA-20-01-032 — Recommendation sending is audit-logged with the recommendation, user, and timestamp
**Type:** Positive
**Covers:** 1.4 → Audit logging of the recommendation sending; Rule: recommendation sending is audit-logged with the recommendation, user, and timestamp
**Preconditions:** Super Admin has sent a recommendation.
**Steps:**
1. Open the audit trail and filter by "recommendation".
2. Verify entries show the recommendation, the user, and the timestamp.
**Expected Result:** The recommendation sending is audit-logged with the recommendation, user, and timestamp.
**Priority:** Critical

## 1.5 A/B Testing for Campaigns

### TC-SA-20-01-033 — A/B test: the test (the test, the variant, the audience, the metric, the result); the test is the comparison
**Type:** Positive
**Covers:** 1.5 → A/B test: the test (the test, the variant, the audience, the metric, the result); Rule: the A/B test is the experiment (the test, the variant, the audience, the metric, the result); the test is the comparison
**Preconditions:** Super Admin is logged in; a campaign is available for testing.
**Steps:**
1. Open Marketing & Communication → Email Campaigns → A/B Testing for Campaigns.
2. Run the A/B test: the test (the test, the variant, the audience, the metric, the result) — verify the A/B test is the experiment.
3. Verify the test shows the variant, the audience, the metric, and the result.
4. Start the test — verify the audience is split between variants.
**Expected Result:** The A/B test is run — the test, the variant, the audience, the metric, and the result are the comparison.
**Priority:** Critical

### TC-SA-20-01-034 — Variant: the variant (the variant of the test, e.g., the A, the B); the variant is the choice
**Type:** Positive
**Covers:** 1.5 → Variant: the variant (the variant of the test, e.g., the A, the B); Rule: the variant is the option (the variant of the test, e.g., the A, the B); the variant is the choice
**Preconditions:** An A/B test is being configured.
**Steps:**
1. Create the variants: the variant (the variant of the test, e.g., the A, the B) — verify the variant is the option.
2. Verify variant A and variant B each have distinct content.
3. Verify each variant is assigned to a portion of the audience.
**Expected Result:** The variants are created — the variant of the test (the A, the B) is the choice.
**Priority:** High

### TC-SA-20-01-035 — Audience: the audience (the audience of the test, the segment, the count); the audience is the recipient
**Type:** Positive
**Covers:** 1.5 → Audience: the audience (the audience of the test, the segment, the count); Rule: the audience is the target (the audience of the test, the segment, the count); the audience is the recipient
**Preconditions:** An A/B test is being configured; audience segments exist.
**Steps:**
1. Select the audience: the audience (the audience of the test, the segment, the count) — verify the audience is the target.
2. Verify the audience shows the segment and the count.
3. Verify the audience is split evenly (or per configured ratio) between variants.
**Expected Result:** The audience is selected — the audience of the test, the segment, and the count are the recipient.
**Priority:** High

### TC-SA-20-01-036 — Test metric: the metric (the metric of the test, e.g., the open rate, the click rate); the metric is the value
**Type:** Positive
**Covers:** 1.5 → Test metric: the metric (the metric of the test, e.g., the open rate, the click rate); Rule: the test metric is the measure (the metric of the test, e.g., the open rate, the click rate); the metric is the value
**Preconditions:** An A/B test is being configured.
**Steps:**
1. Set the test metric: the metric (the metric of the test, e.g., the open rate, the click rate) — verify the test metric is the measure.
2. Verify the metric is tracked for each variant.
3. Verify the metric values are accurate per variant.
**Expected Result:** The test metric is set — the metric of the test (the open rate, the click rate) is the value.
**Priority:** High

### TC-SA-20-01-037 — Test result: the result (the result of the test, the winner, the percentage); the result is the outcome
**Type:** Edge
**Covers:** 1.5 → Test result: the result (the result of the test, the winner, the percentage)
**Preconditions:** An A/B test has completed; a test where both variants tie (tie edge) also exists.
**Steps:**
1. View the test result: the result (the result of the test, the winner, the percentage) — verify the test result is the outcome.
2. Verify the winner is the variant with the higher metric value.
3. View the tied test — verify the tie is handled consistently (no arbitrary winner, or a documented tie-break).
**Expected Result:** The test result is shown — the result of the test, the winner, and the percentage are the outcome; ties are handled consistently.
**Priority:** High

### TC-SA-20-01-038 — Test status: the status (the running, the completed, the analyzed); the status is the state
**Type:** Positive
**Covers:** 1.5 → Test status: the status (the running, the completed, the analyzed)
**Preconditions:** A/B tests with running, completed, and analyzed statuses exist.
**Steps:**
1. View the test status: the status (the running, the completed, the analyzed) — verify the status is the state.
2. Verify a test in progress shows running; after the audience is exhausted, completed; after results are reviewed, analyzed.
3. Verify the status transitions are correct.
**Expected Result:** The test status is shown — the running, the completed, and the analyzed are the state.
**Priority:** High

### TC-SA-20-01-039 — Test view: the view (the tests, the variants, the audiences, the metrics); the experiment is managed
**Type:** Positive
**Covers:** 1.5 → Test view: the view (the tests, the variants, the audiences, the metrics); Rule: the test is complete (the tests, the variants, the audiences, the metrics); the experiment is managed
**Preconditions:** Multiple A/B tests exist.
**Steps:**
1. View the tests: the view (the tests, the variants, the audiences, the metrics) — verify the test is complete.
2. Verify each test shows the variants, the audiences, and the metrics.
3. Verify the experiment is managed (create, run, analyze).
**Expected Result:** The tests are viewed — the tests, the variants, the audiences, and the metrics are visible; the experiment is managed.
**Priority:** High

### TC-SA-20-01-040 — A/B test configuration is audit-logged with the test, variant, and timestamp
**Type:** Positive
**Covers:** 1.5 → Audit logging of the A/B test configuration; Rule: A/B test configuration is audit-logged with the test, variant, and timestamp
**Preconditions:** Super Admin has configured an A/B test.
**Steps:**
1. Open the audit trail and filter by "A/B test".
2. Verify entries show the test, the variant, and the timestamp.
**Expected Result:** The A/B test configuration is audit-logged with the test, variant, and timestamp.
**Priority:** Critical
