Variante A — Pill discrète (recommandée)
Variante B — Lien texte minimaliste
Variante C — Bannière visuelle (pour les emails importants)
1

Architecture overview All tools included in M365 standard licences — zero additional cost

This solution combines five native M365 tools to cover the full newsletter lifecycle: subscription, content creation, delivery, archiving, and promotion.

LayerToolRoleLicence
Subscription formMicrosoft FormsSelf-service opt-in / opt-outAll plans
Subscriber databaseSharePoint ListStores emails, names, statusAll plans
AutomationPower AutomateSubscribe/unsubscribe flows + send loopBusiness Standard+
DeliveryOutlook (Send Email V2)HTML email via service mailboxBusiness Standard+
Content / EditorOutlook Newsletter or SharePoint NewsVisual editor for content creationAll plans
ArchivesSharePoint PagesPermanent per-edition archive pageAll plans
PromotionExchange Transport RuleNewsletter promo block in email signaturesAll plans
No Viva Suite or Employee Communications & Communities licence required. Viva Engage Newsletters (the paid feature for newsletter creation) is intentionally excluded. Everything described here uses tools already available in your tenant.
2

Subscription management Microsoft Forms + SharePoint List + Power Automate

2.1 — SharePoint List structure (« Subscribers »)

Create a SharePoint list named Subscribers on your Communication site with the following columns:

Column nameTypeNotes
TitleSingle line of textFull name (default column, rename to « Name »)
EmailSingle line of textPrimary key — used to match on unsubscribe
StatusChoiceValues: Active / Inactive — default: Active
SubscribedOnDate and timeSet by flow at subscription time
UnsubscribedOnDate and timeSet by flow at unsubscription — do not delete rows
i
Do not delete rows on unsubscribe — set Status to Inactive instead. This preserves audit history and allows re-subscription without duplicate entries.

2.2 — Subscription flow (Power Automate)

1
Trigger — When a new Forms response is submitted
Select your « Subscribe to newsletter » MS Forms form. This fires every time someone submits the form.
2
Get response details
Retrieve the submitted email and name from the form response.
3
Get items — Check if email already exists in Subscribers list
Filter query: Email eq '@{outputs('Get_response_details')?['body/responderEmail']}'
4
Condition — Does the item exist?
If yes: Update item — set Status to Active, clear UnsubscribedOn.
If no: Create item — Email, Name, Status = Active, SubscribedOn = utcNow().
5
Send confirmation email
Send a welcome email to the subscriber confirming their subscription and providing the unsubscribe link.

2.3 — Unsubscribe flow

The unsubscribe link in every newsletter email should point to a dedicated MS Forms form (or a SharePoint page with an embedded form) asking for the user’s email. A separate Power Automate flow handles it:

Power Automate — Unsubscribe logic
// Trigger: When new Forms response submitted (Unsubscribe form)
// Action 1: Get items from Subscribers list
Filter Query: Email eq '@{triggerOutputs()?['body/responderEmail']}'

// Action 2: Apply to each result
  Update item:
    Status        → "Inactive"
    UnsubscribedOn → utcNow()

// Action 3: Send goodbye email
  To:      responder email
  Subject: "You have been unsubscribed"
  Body:    confirmation + re-subscribe link
3

HTML email template Outlook-compatible table-based layout with dynamic variables

Store this template in a SharePoint List column named TemplateHtml (multiline text, 100,000 chars). Power Automate retrieves it at send time and replaces the {{VARIABLES}} using the replace() expression.

!
Outlook HTML rules: Use <table> for layout (no div/flexbox), inline CSS only (no <style> in <head>), no border-radius on images, and host images on a publicly accessible URL or SharePoint with guest access settings checked.

Dynamic variables reference

VariableReplaced byWhen
{{COMPANY_NAME}}Your organisation nameAt flow initialisation
{{NEWSLETTER_TITLE}}Edition title (from trigger input)At flow initialisation
{{SUBTITLE}}Edition subtitleAt flow initialisation
{{EDITION_NUMBER}}e.g. « #12 »At flow initialisation
{{MONTH_EDITION}}e.g. « April 2026 »At flow initialisation
{{INTRO_TEXT}}Editorial intro paragraphAt flow initialisation
{{ARTICLE_1_TITLE}}, {{ARTICLE_1_SUMMARY}}, {{ARTICLE_1_LINK}}Lead article contentAt flow initialisation
{{ARTICLE_2_*}}, {{ARTICLE_3_*}}Secondary articlesAt flow initialisation
{{SP_PAGE_LINK}}Link to the SharePoint archive page for this editionAt flow initialisation
{{RECIPIENT_FIRSTNAME}}Subscriber’s first nameInside the loop (per recipient)
{{UNSUBSCRIBE_LINK}}Unsubscribe form URL + encoded email paramInside the loop (per recipient)

Power Automate — replace() chain for global variables

Power Automate Expression
// Compose action — "htmlBase" variable
replace(
  replace(
    replace(
      replace(
        outputs('Get_template_item')?['fields']?['TemplateHtml'],
        '{{NEWSLETTER_TITLE}}', triggerBody()?['text_TITLE']
      ),
      '{{SUBTITLE}}', triggerBody()?['text_SUBTITLE']
    ),
    '{{INTRO_TEXT}}', triggerBody()?['text_INTRO']
  ),
  '{{SP_PAGE_LINK}}', triggerBody()?['text_SP_LINK']
)
// Chain as many replace() as you have variables

Per-recipient personalisation (inside the Apply to each loop)

Power Automate Expression — inside loop
replace(
  replace(
    variables('htmlBase'),
    '{{RECIPIENT_FIRSTNAME}}',
    items('Apply_to_each')?['FirstName']
  ),
  '{{UNSUBSCRIBE_LINK}}',
  concat(
    'https://company.sharepoint.com/sites/Communication/SitePages/unsubscribe.aspx?email=',
    encodeUriComponent(items('Apply_to_each')?['Email'])
  )
)
4

Power Automate — Send flow Manual trigger → get template → loop subscribers → send → log

1
Trigger — Manually trigger a flow
Input fields: Title, Subtitle, Intro, Edition number, Month, SP page link, 3× article (title / summary / link), 2× event (day / month / title / detail).

Alternative: trigger on « When an item is created » in a SharePoint « Editions » list — the editor fills in the list and the flow starts automatically.
2
Get item — SharePoint « EmailTemplates » list (ID: 1)
Retrieves the HTML stored in the TemplateHtml column. This is the single source of truth for the email design — edit once, applies to all future editions.
3
Initialize variable « htmlBase » — Compose with replace() chain
Substitutes all global {{VARIABLES}} into the template HTML. See the expression in Section 3.
4
Get items — SharePoint « Subscribers » list
OData filter: Status eq 'Active' — Top count: 5000. Only active subscribers receive the email.
5
Apply to each — loop on active subscribers
Set Degree of Parallelism to 1 in the loop settings to avoid Exchange Online throttling (limit: ~30 emails/min on standard accounts). For larger volumes, use Graph API Send Mail with concurrency 5.
6
Inside loop — Compose personalised HTML
Replace {{RECIPIENT_FIRSTNAME}} and {{UNSUBSCRIBE_LINK}} with per-recipient values. See expression in Section 3.
7
Inside loop — Send an email (V2)
To: items('Apply_to_each')?['Email']
Subject: concat('[Newsletter] ', triggerBody()?['text_TITLE'])
Body: outputs('Compose_personalised_html')
Is HTML: Yes
From: newsletter@company.com (dedicated shared mailbox)
8
Inside loop — Create item in « SendLogs » list
Columns: Email, Edition title, DateSent (utcNow()), Status = « Sent ». Enables basic send statistics and error detection.
9
End — Notify the editor
Send a Teams message or email to the flow trigger user: « Newsletter sent to X subscribers — Edition: {{TITLE}} »
!
500 recipients limit on Send Email (V2): the native PA connector limits the To/CC/BCC field to 500 addresses. Since this flow sends one email per recipient in a loop, this limit does not apply — but Exchange Online may throttle rapid sequential sends. Keep parallelism at 1 for audiences under 500. For larger lists, switch to the Office 365 Outlook — Send email from a shared mailbox action or Graph API.
5

Outlook Newsletter (native editor) outlook.office.com/newsletters — no technical setup required for the editor

Generally Available since August 2025. Enabled by default (ReadWrite) for all tenants. Access directly at outlook.office.com/newsletters or via the Newsletters icon in the new Outlook left navigation.

5.1 — Admin activation (Exchange Online PowerShell)

Verify current status and configure access levels per team:

PowerShell — Exchange Online
# Connect to Exchange Online
Connect-ExchangeOnline

# Check current state across all policies
Get-OwaMailboxPolicy | Select Name, OutlookNewslettersAccessLevel

# Enable for the whole tenant (ReadWrite = create + read)
Set-OwaMailboxPolicy -Identity "OwaMailboxPolicy-Default" `
  -OutlookNewslettersAccessLevel ReadWrite `
  -OutlookNewslettersReactions   DefaultOn `
  -OutlookNewslettersShowMore     DefaultOn

# --- RESTRICT to a pilot group only ---
# Set default to ReadOnly (everyone can read, not create)
Set-OwaMailboxPolicy -Identity "OwaMailboxPolicy-Default" `
  -OutlookNewslettersAccessLevel ReadOnly

# Create a dedicated policy for the Communication team
New-OwaMailboxPolicy -Name "OwaPolicy-NewsletterAuthors"
Set-OwaMailboxPolicy -Identity "OwaPolicy-NewsletterAuthors" `
  -OutlookNewslettersAccessLevel ReadWrite

# Assign policy to specific users
Set-CASMailbox -Identity "alice@company.com" `
  -OwaMailboxPolicy "OwaPolicy-NewsletterAuthors"

# Or assign to all members of a group (no direct group assignment in EAC)
Get-DistributionGroupMember -Identity "NL-Newsletter-Authors" | ForEach-Object {
  Set-CASMailbox -Identity $_.PrimarySmtpAddress `
    -OwaMailboxPolicy "OwaPolicy-NewsletterAuthors"
}

5.2 — Visibility options when creating a newsletter series

VisibilityWho can subscribeBest for
My organisationAnyone in the tenant — discoverable via Outlook searchAll-staff newsletter
UnlistedOnly users with the direct linkDepartment-level, testing
PrivateManually invited users only — no subscriptionsExecutive committee, HR

5.3 — Analytics available per edition

MetricAvailable
Subscriber countYes
Email open rateYes
Reactions (likes etc.)Yes
CommentsYes
Click tracking on linksNo
Per-subscriber statsNo
Subscriber export (CSV)Yes — from Admin menu

5.4 — Known limitations

LimitationWorkaround
No scheduled sendingPublish manually at the desired time
Linear layout only (no multi-column)Use Power Automate + HTML template for rich 2-column layout
No AAD group targetingCreate one newsletter series per audience segment
No link click trackingAdd UTM parameters to SP links + use SP Analytics
New Outlook / OWA onlyDirect link: outlook.office.com/newsletters
Images must be uploaded in editorCannot link to external image URLs directly
6

Archives — SharePoint Pages One page per edition, indexed via a News WebPart

Each newsletter edition should have a permanent SharePoint page. This page serves as the web version of the email and as the archive entry. It also allows you to track page views natively.

6.1 — Structure

ElementDetails
SiteCommunication site (e.g. /sites/Communication)
LibrarySite Pages — default SharePoint pages library
Naming conventionnewsletter-2026-04.aspx (year-month)
Page typeNews post (not standard page — enables News WebPart aggregation)
MetadataAdd a « Edition » column (Number) and « Month » column to filter/sort

6.2 — Archive index page

Create a Newsletter Archives communication page with a News WebPart configured to:

  • Source: This site
  • Filter: News category = « Newsletter » (use a custom page property)
  • Layout: Cards or List
  • Sort by: Date published — Descending
  • Show: Title, thumbnail, date, author
i
Include the {{SP_PAGE_LINK}} variable in every newsletter email pointing to the current edition’s SP page. This gives readers a « View in browser » fallback and directs them to the searchable archive.
7

Promoting via email signature Exchange Transport Rule — centralised, zero effort for users

A Transport Rule (Exchange mail flow rule) automatically appends a newsletter promotion block to outgoing emails from targeted users — no individual action required.

7.1 — Choose your target group

Distribution List

Classic Exchange DL. Works well but no dynamic membership based on AAD attributes.

AAD Attribute (Dept.)

Target by Department or JobTitle value. Requires PowerShell condition — not available in the EAC UI.

Individual mailboxes

List specific addresses. Simple but hard to maintain for more than 10 users.

7.2 — Signature HTML blocks (3 variants)

Replace YOUR_SUBSCRIPTION_LINK with your MS Forms or Outlook Newsletter URL.

Variant A — Pill button (recommended)

Email preview

John Smith · M365 Consultant


📩 Internal newsletter Subscribe →
M365 & SharePoint updates · Monthly
HTML — Variant A (Pill)
<hr style="border:none;border-top:1px solid #e0e0e0;margin:12px 0;">
<table cellpadding="0" cellspacing="0" border="0">
  <tr>
    <td style="padding-right:10px;font-family:Arial,sans-serif;
            font-size:12px;color:#666;vertical-align:middle;">
      📩 Internal newsletter
    </td>
    <td style="vertical-align:middle;">
      <a href="YOUR_SUBSCRIPTION_LINK"
         style="display:inline-block;background:#0078d4;color:#ffffff;
                font-size:11px;font-weight:bold;padding:4px 10px;
                border-radius:12px;text-decoration:none;">
        Subscribe →
      </a>
    </td>
  </tr>
  <tr>
    <td colspan="2"
        style="font-family:Arial,sans-serif;font-size:11px;
               color:#999;padding-top:3px;">
      M365 &amp; SharePoint updates &amp;middot; Monthly
    </td>
  </tr>
</table>

Variant B — Plain text link

HTML — Variant B (Text link)
<hr style="border:none;border-top:1px solid #e0e0e0;margin:12px 0;">
<p style="font-family:Arial,sans-serif;font-size:12px;color:#555;margin:0;">
  📬 <a href="YOUR_SUBSCRIPTION_LINK"
        style="color:#0078d4;text-decoration:none;font-weight:bold;">
    Subscribe to our monthly internal newsletter
  </a>
  <span style="color:#bbb;"> · M365 &amp; SharePoint</span>
</p>

7.3 — Creating the Transport Rule

Option A — Exchange Admin Center (UI)

Go to admin.exchange.microsoft.com → Mail flow → Rules → + Add a rule → Apply disclaimers. Configure:

SettingValue
Apply this rule if…The sender is a member of → select your M365 group (e.g. « NL-Newsletter-Senders »)
Do the followingAppend a disclaimer → paste the HTML from Variant A → Fallback: Wrap
Except if…The sender is → newsletter@company.com (avoids double block on newsletter emails themselves)
Rule nameSIG – Newsletter promo – [GROUP_NAME]
ModeEnforce (not Test)

Option B — PowerShell (recommended for repeatability)

PowerShell — Exchange Online
Connect-ExchangeOnline

# HTML block to append (store in variable)
$signatureHtml = @"
<hr style='border:none;border-top:1px solid #e0e0e0;margin:12px 0;'>
<table cellpadding='0' cellspacing='0' border='0'>
  <tr>
    <td style='padding-right:10px;font-family:Arial,sans-serif;
               font-size:12px;color:#666;vertical-align:middle;'>
      📩 Internal newsletter
    </td>
    <td style='vertical-align:middle;'>
      <a href='YOUR_SUBSCRIPTION_LINK'
         style='display:inline-block;background:#0078d4;color:#ffffff;
                font-size:11px;font-weight:bold;padding:4px 10px;
                border-radius:12px;text-decoration:none;'>
        Subscribe →
      </a>
    </td>
  </tr>
  <tr>
    <td colspan='2'
        style='font-family:Arial,sans-serif;font-size:11px;
               color:#999;padding-top:3px;'>
      M365 & SharePoint updates · Monthly
    </td>
  </tr>
</table>
"@

# Create the transport rule scoped to a group
New-TransportRule `
  -Name                          "SIG – Newsletter promo – Communication" `
  -FromMemberOf                  "NL-Newsletter-Senders" `
  -ApplyHtmlDisclaimerLocation   Append `
  -ApplyHtmlDisclaimerText       $signatureHtml `
  -ApplyHtmlDisclaimerFallbackAction Wrap `
  -ExceptIfFrom                  "newsletter@company.com" `
  -Enabled                       $true

# Update the HTML later (e.g. new subscription link) without recreating the rule
Set-TransportRule `
  -Identity                    "SIG – Newsletter promo – Communication" `
  -ApplyHtmlDisclaimerText     $signatureHtml_updated

7.4 — Managing the target group

The group NL-Newsletter-Senders is the only thing to maintain. Adding a user to the group automatically applies the signature block to their outbound emails — no rule changes needed.

For dynamic membership based on an AAD attribute (requires Entra ID P1, included in M365 E3):

Entra ID — Dynamic group membership rule
// Auto-include all users in the "Communication" department
(user.department -eq "Communication") or
(user.jobTitle -contains "Director")
!
Transport Rules apply server-side. The signature block will not appear in the sender’s Sent Items — only in the received email. Always test by sending from a group member account to an external or different internal mailbox.
8

Statistics Native M365 analytics — no third-party tool required

MetricSourceHow to access
Active subscriber countSharePoint « Subscribers » listList view filtered on Status = Active — count displayed in list header
Unsubscription count / rateSharePoint « Subscribers » listList view filtered on Status = Inactive with UnsubscribedOn date range
Successful sends per editionSharePoint « SendLogs » listFilter by Edition title — count rows with Status = Sent
SP page views per editionSharePoint Page AnalyticsOpen the edition page → Page details (top right) → Analytics tab
Email open rateOutlook Newsletter (if using native editor)Edition → Analytics tab in Outlook Newsletters UI
Reactions & commentsOutlook NewsletterEdition → Analytics tab
Link click trackingNot natively availableAdd UTM parameters to SP links: ?utm_source=newsletter&utm_medium=email&utm_campaign=apr2026 — track via SP Analytics

8.1 — Simple KPI dashboard (SharePoint list view)

Create a calculated view on the « SendLogs » list grouped by Edition with these aggregations:

  • Total sends — Count of ID column
  • Success rate — Calculated column: =IF(Status="Sent","OK","KO")
  • Date range — Filter by DateSent between edition start/end
i
Open rate tracking without Viva: embed a 1×1 transparent PNG image in the email HTML with a unique URL per edition (hosted on SharePoint, accessible without login). SharePoint file access logs will show unique opens — not perfect but zero cost. Alternatively, use a Power BI report connected to the SendLogs and SP Analytics data sources for a combined dashboard.
Microsoft 365 · Internal Newsletter
Two approaches — which one fits your needs?
Outlook Newsletter native vs. Power Automate + HTML custom flow — full feature comparison
Scenario A
Outlook Newsletter
outlook.office.com/newsletters
Scenario B
Power Automate + HTML
Custom flow · SharePoint List
Subscriber opt-in Native — zero setup Subscribers click « Subscribe » in Outlook or via the newsletter link. Microsoft manages the subscriber list automatically. Custom — build required MS Forms → Power Automate flow → SharePoint « Subscribers » list. ~2h setup.
Unsubscribe Native — auto-generated link Microsoft includes an unsubscribe link in every sent email. Handled entirely by the platform. Custom — build required Encoded URL in email footer → PA flow sets Status = Inactive in SP List.
Subscriber list Managed by Microsoft Visible in the Subscribers tab of your newsletter. CSV export available. No SharePoint list to create or maintain. SharePoint List Columns: Email, Name, Status (Active/Inactive), SubscribedOn, UnsubscribedOn. Full control, full maintenance.
Content editor Visual block editor Text, image, button, poll, author card blocks. No technical knowledge required. Any M365 user can write and publish. HTML in SP List Full HTML template with {{VARIABLES}} replaced by Power Automate expressions. Requires HTML maintenance.
Layout & design Linear only No multi-column layout, no custom CSS. Microsoft controls the visual structure. Branding is limited to logo + theme colour. Fully custom Complete HTML/CSS inline control. 2-column layout, coloured sections, agenda blocks, custom header — pixel-perfect design.
Sending 1-click Publish Microsoft sends to all subscribers automatically on publish. Sender = your own mailbox. PA Apply to each loop Loop on active SP List items → Send Email (V2) per recipient → log to SendLogs list. Sent from a shared mailbox (newsletter@company.com).
Scheduled sending Not available Immediate publish only. Workaround: open Outlook at the desired time and publish manually. Yes — Scheduled flow Recurrence trigger or manual flow run at any chosen time and frequency.
Audience targeting Per series only Each newsletter series has its own subscriber base. No AAD group or department filter. Create multiple series to segment audiences. OData filter on SP List Filter by Department, AAD group, custom column, or any attribute stored in the list. Full segmentation control.
Personalisation None Same email content for every subscriber. No « Hello {{FirstName}} » or conditional sections. Per-recipient replace() inside the loop — first name, encoded unsubscribe link, conditional content blocks based on subscriber attributes.
Archives Native in Outlook Every published edition has a permanent URL accessible from Outlook/OWA. No SharePoint page required. Searchable from Outlook. SharePoint Pages One SP News page per edition + an index page using a filtered News WebPart. Requires manual page creation per edition.
Open rate tracking Native — per edition Analytics tab in the Outlook Newsletter UI shows open rate, reactions, and comment counts. Workaround needed Embed a 1×1 transparent PNG with a unique SP-hosted URL per edition. SP access logs act as a basic open counter.
Click tracking Not available No link click data in Outlook Newsletter analytics. Workaround: add UTM parameters to SP links and read via SP Analytics. Not available natively Same UTM workaround applies. No native click tracking without a third-party tool.
Reactions & comments Native Readers can react (like, etc.) and comment directly on each edition inside Outlook. Visible in Analytics. Not available Standard Outlook email — no native reaction or comment features on the email itself.
Email signature promo Same setup Exchange Transport Rule with -FromMemberOf targeting a group. HTML pill block linking to the newsletter series subscription URL. Same setup Identical Transport Rule configuration. HTML pill block linking to the MS Forms subscription form.
Setup time ~15 minutes Enable via 1 PowerShell command + create the series in Outlook. That’s it. ~4–6 hours SP Lists (Subscribers, EmailTemplates, SendLogs), 2 PA flows (subscribe + send), HTML template, archive pages.
Technical skill None required Any M365 user can create, write, and publish. One-time admin PowerShell command to enable the feature. M365 intermediate Requires knowledge of Power Automate, SharePoint Lists, HTML email, and Exchange Online.
Minimum licence Business Basic+ / E1+ Included in all M365 plans with Exchange Online. No add-on required. Business Standard+ / E3+ Power Automate flows require Business Standard or above. SP Lists and Outlook are available on all plans.

Choose Outlook Newsletter if…

  • You want to launch in under 30 minutes
  • The editor will be used by non-technical staff
  • You don’t need personalisation per recipient
  • Subscription management handled automatically is a priority
  • Open rate + reactions analytics are sufficient
  • You’re on Business Basic or E1

Choose Power Automate + HTML if…

  • You need pixel-perfect branding / multi-column layout
  • You want personalisation (« Hello John »)
  • You need scheduled or conditional sending
  • You need audience segmentation by department / AAD group
  • You want full control over the subscriber data
  • You’re comfortable maintaining HTML and PA flows
Recommendation for most internal use cases: start with Outlook Newsletter native — zero build time, subscription and unsubscribe managed by Microsoft, open rate analytics included. If you hit a wall on layout, personalisation, or targeting, migrate the delivery layer to a Power Automate flow while keeping the Outlook Newsletter editor for content creation (write in Outlook → copy content → send via PA). The two approaches are not mutually exclusive.