| 📩 Newsletter interne | S’abonner → |
📬 Abonnez-vous à notre newsletter interne mensuelle · Actualités M365 & SharePoint
| 📨 Newsletter interne — Actualités M365 Conseils SharePoint, Power Platform & outils · 1×/mois S’abonner gratuitement → |
Setting Up an Internal Newsletter
Without Extra Licences
A complete operational guide — subscription management, HTML template, Power Automate flow, archives, promotion via email signature, and statistics.
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.
| Layer | Tool | Role | Licence |
|---|---|---|---|
| Subscription form | Microsoft Forms | Self-service opt-in / opt-out | All plans |
| Subscriber database | SharePoint List | Stores emails, names, status | All plans |
| Automation | Power Automate | Subscribe/unsubscribe flows + send loop | Business Standard+ |
| Delivery | Outlook (Send Email V2) | HTML email via service mailbox | Business Standard+ |
| Content / Editor | Outlook Newsletter or SharePoint News | Visual editor for content creation | All plans |
| Archives | SharePoint Pages | Permanent per-edition archive page | All plans |
| Promotion | Exchange Transport Rule | Newsletter promo block in email signatures | All plans |
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 name | Type | Notes |
|---|---|---|
| Title | Single line of text | Full name (default column, rename to « Name ») |
| Single line of text | Primary key — used to match on unsubscribe | |
| Status | Choice | Values: Active / Inactive — default: Active |
| SubscribedOn | Date and time | Set by flow at subscription time |
| UnsubscribedOn | Date and time | Set by flow at unsubscription — do not delete rows |
2.2 — Subscription flow (Power Automate)
Email eq '@{outputs('Get_response_details')?['body/responderEmail']}'If no: Create item — Email, Name, Status = Active, SubscribedOn = utcNow().
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:
// 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 linkHTML 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.
<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
| Variable | Replaced by | When |
|---|---|---|
{{COMPANY_NAME}} | Your organisation name | At flow initialisation |
{{NEWSLETTER_TITLE}} | Edition title (from trigger input) | At flow initialisation |
{{SUBTITLE}} | Edition subtitle | At flow initialisation |
{{EDITION_NUMBER}} | e.g. « #12 » | At flow initialisation |
{{MONTH_EDITION}} | e.g. « April 2026 » | At flow initialisation |
{{INTRO_TEXT}} | Editorial intro paragraph | At flow initialisation |
{{ARTICLE_1_TITLE}}, {{ARTICLE_1_SUMMARY}}, {{ARTICLE_1_LINK}} | Lead article content | At flow initialisation |
{{ARTICLE_2_*}}, {{ARTICLE_3_*}} | Secondary articles | At flow initialisation |
{{SP_PAGE_LINK}} | Link to the SharePoint archive page for this edition | At flow initialisation |
{{RECIPIENT_FIRSTNAME}} | Subscriber’s first name | Inside the loop (per recipient) |
{{UNSUBSCRIBE_LINK}} | Unsubscribe form URL + encoded email param | Inside the loop (per recipient) |
Power Automate — replace() chain for global variables
// 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 variablesPer-recipient personalisation (inside the Apply to each 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'])
)
)Power Automate — Send flow Manual trigger → get template → loop subscribers → send → log
Alternative: trigger on « When an item is created » in a SharePoint « Editions » list — the editor fills in the list and the flow starts automatically.
TemplateHtml column. This is the single source of truth for the email design — edit once, applies to all future editions.{{VARIABLES}} into the template HTML. See the expression in Section 3.Status eq 'Active' — Top count: 5000. Only active subscribers receive the email.{{RECIPIENT_FIRSTNAME}} and {{UNSUBSCRIBE_LINK}} with per-recipient values. See expression in Section 3.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)Outlook Newsletter (native editor) outlook.office.com/newsletters — no technical setup required for the editor
5.1 — Admin activation (Exchange Online PowerShell)
Verify current status and configure access levels per team:
# 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
| Visibility | Who can subscribe | Best for |
|---|---|---|
| My organisation | Anyone in the tenant — discoverable via Outlook search | All-staff newsletter |
| Unlisted | Only users with the direct link | Department-level, testing |
| Private | Manually invited users only — no subscriptions | Executive committee, HR |
5.3 — Analytics available per edition
| Metric | Available |
|---|---|
| Subscriber count | Yes |
| Email open rate | Yes |
| Reactions (likes etc.) | Yes |
| Comments | Yes |
| Click tracking on links | No |
| Per-subscriber stats | No |
| Subscriber export (CSV) | Yes — from Admin menu |
5.4 — Known limitations
| Limitation | Workaround |
|---|---|
| No scheduled sending | Publish manually at the desired time |
| Linear layout only (no multi-column) | Use Power Automate + HTML template for rich 2-column layout |
| No AAD group targeting | Create one newsletter series per audience segment |
| No link click tracking | Add UTM parameters to SP links + use SP Analytics |
| New Outlook / OWA only | Direct link: outlook.office.com/newsletters |
| Images must be uploaded in editor | Cannot link to external image URLs directly |
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
| Element | Details |
|---|---|
| Site | Communication site (e.g. /sites/Communication) |
| Library | Site Pages — default SharePoint pages library |
| Naming convention | newsletter-2026-04.aspx (year-month) |
| Page type | News post (not standard page — enables News WebPart aggregation) |
| Metadata | Add 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
{{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.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
M365 Group Recommended
Existing AAD group (e.g. « NL-Newsletter-Senders »). Managed from M365 admin portal. Supports dynamic membership rules.
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)
John Smith · M365 Consultant
| 📩 Internal newsletter | Subscribe → |
| M365 & SharePoint updates · Monthly | |
<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 &middot; Monthly
</td>
</tr>
</table>Variant B — Plain 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 & 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:
| Setting | Value |
|---|---|
| Apply this rule if… | The sender is a member of → select your M365 group (e.g. « NL-Newsletter-Senders ») |
| Do the following | Append 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 name | SIG – Newsletter promo – [GROUP_NAME] |
| Mode | Enforce (not Test) |
Option B — PowerShell (recommended for repeatability)
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_updated7.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):
// Auto-include all users in the "Communication" department
(user.department -eq "Communication") or
(user.jobTitle -contains "Director")Statistics Native M365 analytics — no third-party tool required
| Metric | Source | How to access |
|---|---|---|
| Active subscriber count | SharePoint « Subscribers » list | List view filtered on Status = Active — count displayed in list header |
| Unsubscription count / rate | SharePoint « Subscribers » list | List view filtered on Status = Inactive with UnsubscribedOn date range |
| Successful sends per edition | SharePoint « SendLogs » list | Filter by Edition title — count rows with Status = Sent |
| SP page views per edition | SharePoint Page Analytics | Open the edition page → Page details (top right) → Analytics tab |
| Email open rate | Outlook Newsletter (if using native editor) | Edition → Analytics tab in Outlook Newsletters UI |
| Reactions & comments | Outlook Newsletter | Edition → Analytics tab |
| Link click tracking | Not natively available | Add 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
| 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
