IT Guide18 min read

Outlook Signature Deployment Guide for Microsoft 365

You’ve got a new company signature. Now you need to get it into 50 mailboxes. Here’s every method available, with actual code and step-by-step instructions — Exchange transport rules, PowerShell scripts, Group Policy, Intune, and what a third-party tool adds on top. Pick the method that fits your environment and follow it through to verification.

By the NeatStamp Team · Published March 2026 · 18 min read

Method 1: Exchange Transport Rules

Exchange transport rules (called mail flow rules in the Exchange Admin Center) let you inject a signature at the server level — after the email is sent and before it reaches the recipient. This is the most reliable method for guaranteed delivery across all devices, because the signature is applied server-side regardless of what client or device the sender used. Outlook Mobile, Apple Mail, a web browser — it doesn’t matter. The signature gets appended.

When to use this method

  • You need signatures on emails sent from mobile devices — this is the only built-in Microsoft method that covers mobile.
  • Compliance is a priority and you cannot rely on users to set up their own signatures.
  • You have a small IT team and want a set-it-and-forget-it approach.
  • Your signature doesn't need to be visible to users while they're composing (they won't see it until after sending).

Step-by-step in Exchange Admin Center

1

Go to admin.exchange.microsoft.com and sign in as an Exchange admin.

2

In the left sidebar, select Mail flow → Rules.

3

Click Add a rule → Apply disclaimers.

4

Name the rule (e.g. "Company email signature — outbound").

5

Under Apply this rule if, select The sender is located → Inside the organization.

6

Under Do the following, select Append the disclaimer → Enter text. Paste your HTML signature into the text box. Set Fallback action to Wrap.

7

If you want the signature only on external emails, add an exception: The recipient is located → Inside the organization.

8

Set Priority to 0 if this should run before other rules. Save the rule.

9

Test by sending an email from an affected mailbox to an external address and checking the raw source of the received message.

HTML template with Active Directory placeholders

Exchange resolves Active Directory attribute tokens at send time. Use this template as a starting point — paste it into the disclaimer text box in the admin center:

<table cellpadding="0" cellspacing="0" border="0"
  style="font-family: Arial, sans-serif; font-size: 13px;
         color: #333333; border-top: 3px solid #2563EB;
         padding-top: 12px; margin-top: 16px;">
  <tr>
    <td style="padding-right: 16px; vertical-align: top;">
      <img src="https://yourdomain.com/logo.png"
           width="120" height="40"
           alt="Company logo"
           style="display: block;" />
    </td>
    <td style="border-left: 1px solid #e2e8f0;
               padding-left: 16px; vertical-align: top;">
      <strong style="font-size: 14px; color: #1e293b;">
        %%DisplayName%%
      </strong><br/>
      <span style="color: #64748b;">%%Title%%</span><br/>
      <span style="color: #64748b;">%%Company%%</span><br/>
      <a href="tel:%%PhoneNumber%%"
         style="color: #2563EB; text-decoration: none;">
        %%PhoneNumber%%
      </a>
    </td>
  </tr>
  <tr>
    <td colspan="2"
        style="padding-top: 10px; font-size: 11px;
               color: #94a3b8;">
      This email and any attachments are confidential.
      If you are not the intended recipient, please delete
      this message and notify the sender immediately.
    </td>
  </tr>
</table>

Available Active Directory tokens: %%DisplayName%%, %%Title%%, %%PhoneNumber%%, %%Department%%, %%Company%%, %%City%%, %%StateOrProvince%%, %%CountryOrRegion%%. These are resolved from the sender’s Azure AD profile at the time the email is sent.

Limitations to know before choosing this method

  • Applies to all emails including internal — you need an exception condition to exclude internal messages.
  • No per-user customization beyond what's in Azure AD. Everyone gets the same template with their AD attributes filled in.
  • The signature is appended at the bottom of the entire email thread on replies, not at the cursor position.
  • If an AD attribute is empty (e.g. the user has no phone number), you get an empty line or a bare HTML element — no conditional logic.
  • Exchange strips some CSS. Avoid margin, padding shorthand, CSS classes, and background-image.
  • Users never see the signature in their compose window — only in sent items after the fact.

Method 2: PowerShell Set-MailboxMessageConfiguration

The Set-MailboxMessageConfiguration cmdlet lets you set the signature that appears in the Outlook compose window for any mailbox in your tenant. Unlike transport rules, users see their signature while composing. Unlike Group Policy, this works for Outlook on the Web (OWA) as well as desktop Outlook.

This is the right method when you want users to see their signature in the compose window, you have per-user variation (different departments, different signatures), and you’re comfortable running PowerShell scripts with Exchange Online credentials. For a broader look at managing signatures in Microsoft 365, see the Microsoft 365 email signature management guide.

Connect to Exchange Online

Install the Exchange Online PowerShell module if you haven’t already, then connect:

# Install the module (run once, as administrator)
Install-Module -Name ExchangeOnlineManagement -Force -AllowClobber

# Connect — this opens a browser login window
Connect-ExchangeOnline -UserPrincipalName [email protected]

# Verify the connection
Get-OrganizationConfig | Select-Object DisplayName

Set the same signature for all users

This script sets an HTML signature for every mailbox in your tenant. Replace the HTML string with your actual signature code:

$signatureHTML = @"
<table cellpadding="0" cellspacing="0" border="0"
  style="font-family:Arial,sans-serif;font-size:13px;color:#333;">
  <tr>
    <td style="padding-right:16px;">
      <img src="https://yourdomain.com/logo.png"
           width="120" alt="Logo" />
    </td>
    <td style="border-left:1px solid #e2e8f0;padding-left:16px;">
      <strong>EMPLOYEE_NAME</strong><br/>
      <span style="color:#64748b;">EMPLOYEE_TITLE</span><br/>
      <a href="tel:EMPLOYEE_PHONE"
         style="color:#2563EB;">EMPLOYEE_PHONE</a>
    </td>
  </tr>
</table>
"@

# Get all user mailboxes and apply the signature
Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox |
  ForEach-Object {
    Set-MailboxMessageConfiguration -Identity $_.UserPrincipalName `
      -SignatureHTML $signatureHTML `
      -AutoAddSignature $true `
      -AutoAddSignatureOnReply $false
    Write-Host "Set signature for $($_.UserPrincipalName)"
  }

Per-department signatures

To apply different signatures by department, get the department attribute from Azure AD and switch on it:

# Define signatures per department
$sigSales = "<table><!-- Sales signature HTML --></table>"
$sigLegal = "<table><!-- Legal signature with compliance text --></table>"
$sigDefault = "<table><!-- Default company signature --></table>"

Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox |
  ForEach-Object {
    $mbx = $_
    # Get department from Azure AD
    $user = Get-User -Identity $mbx.UserPrincipalName
    $sig = switch ($user.Department) {
      "Sales"  { $sigSales }
      "Legal"  { $sigLegal }
      default  { $sigDefault }
    }
    Set-MailboxMessageConfiguration -Identity $mbx.UserPrincipalName `
      -SignatureHTML $sig `
      -AutoAddSignature $true `
      -AutoAddSignatureOnReply $false
    Write-Host "$($mbx.UserPrincipalName) -> $($user.Department)"
  }

Full script with CSV input

For the most control, generate personalized HTML for each user from a CSV of employee data. The CSV should have columns: email, display_name, title, phone, department.

# employees.csv columns:
# email,display_name,title,phone,department

$employees = Import-Csv -Path "C:\signatures\employees.csv"

foreach ($emp in $employees) {

  # Build conditional phone line
  $phoneLine = if ($emp.phone) {
    "<a href='tel:$($emp.phone)'
       style='color:#2563EB;text-decoration:none;'>$($emp.phone)</a>"
  } else { "" }

  $html = @"
<table cellpadding="0" cellspacing="0" border="0"
  style="font-family:Arial,sans-serif;font-size:13px;
         color:#333333;border-top:3px solid #2563EB;
         padding-top:12px;margin-top:16px;">
  <tr>
    <td style="padding-right:16px;vertical-align:top;">
      <img src="https://yourdomain.com/logo.png"
           width="120" height="40" alt="Logo" />
    </td>
    <td style="border-left:1px solid #e2e8f0;
               padding-left:16px;vertical-align:top;">
      <strong style="font-size:14px;color:#1e293b;">
        $($emp.display_name)
      </strong><br/>
      <span style="color:#64748b;">$($emp.title)</span><br/>
      <span style="color:#64748b;">Your Company Ltd</span><br/>
      $phoneLine
    </td>
  </tr>
  <tr>
    <td colspan="2"
        style="padding-top:10px;font-size:11px;color:#94a3b8;">
      This email is confidential. If received in error,
      please delete and notify the sender.
    </td>
  </tr>
</table>
"@

  try {
    Set-MailboxMessageConfiguration `
      -Identity $emp.email `
      -SignatureHTML $html `
      -AutoAddSignature $true `
      -AutoAddSignatureOnReply $false
    Write-Host "OK: $($emp.email)"
  } catch {
    Write-Warning "FAILED: $($emp.email) — $_"
  }
}

Write-Host "Done. $($employees.Count) mailboxes processed."
Disconnect-ExchangeOnline -Confirm:$false

Important notes

  • AutoAddSignature $true sets the signature for new emails. AutoAddSignatureOnReply $false prevents it appending on every reply in a thread — set to $true if your policy requires signatures on replies.
  • This method does not work for mobile (Outlook iOS/Android). For mobile, combine with an Exchange transport rule.
  • The signature is set in the mailbox configuration — if the user manually changes their signature in Outlook, your setting is overwritten. Re-run the script periodically (e.g. via a scheduled task) to enforce the corporate signature.
  • You need Exchange Administrator or Global Administrator permissions to run Set-MailboxMessageConfiguration on other users' mailboxes.

Method 3: Group Policy for Classic Outlook

If your organization runs classic Outlook (2016, 2019, or the LTSC version) on domain-joined Windows PCs, you can deploy signatures via Group Policy. GPO sets registry keys that Outlook reads on startup. The signature appears in the Outlook compose window.

This method has a hard requirement: domain-joined PCs with classic Outlook installed. It does not work on the new Outlook for Windows, Outlook on the Web, or any non-Windows device. If your team is a mix of old and new Outlook, you need a secondary method for everyone not covered by GPO. For more on managing Outlook signatures for a whole company, including non-domain scenarios, that guide covers the full picture.

Registry keys Outlook reads for signatures

Outlook 2016 and later reads signature settings from:

HKCU\Software\Microsoft\Office\16.0\Common\MailSettings

Key: NewSignature
Type: REG_SZ
Value: Name of the signature (must match a .htm file in the signatures folder)

Key: ReplySignature
Type: REG_SZ
Value: Name of the signature for replies (can be the same or different)

Key: SignaturePickerForced
Type: REG_DWORD
Value: 1 (prevents users from switching to a different signature)

The signature file itself (the .htm file) needs to be placed in the user’s Outlook signatures folder: %APPDATA%\Microsoft\Signatures\

GPO setup steps

1

Open Group Policy Management Console (gpmc.msc) on a domain controller or management PC.

2

Create or edit a GPO linked to the OU containing your users (not computers — signatures are per-user settings).

3

Navigate to User Configuration → Preferences → Windows Settings → Files. Add a file action to copy the .htm signature file from a network share (\\server\signatures\company-signature.htm) to %APPDATA%\Microsoft\Signatures\CompanySignature.htm on each user's machine.

4

Navigate to User Configuration → Preferences → Windows Settings → Registry. Add registry items for NewSignature (REG_SZ, value: CompanySignature) and ReplySignature (REG_SZ, value: CompanySignature).

5

Under Common tab for each preference item, enable Apply once and do not reapply if you want users to be able to change their signature after initial setup, or leave it unchecked to re-apply on every Group Policy refresh.

6

Run gpupdate /force on a test machine and open Outlook to verify the signature appears in the compose window.

Limitation: classic Outlook only

These registry keys are ignored by the new Outlook for Windows and by Outlook on the Web. If any of your users have switched to the new Outlook experience (the toggle in the top-right corner of classic Outlook), GPO signatures will stop working for them. You need to supplement with the PowerShell method or a third-party tool. Also, GPO cannot personalize signatures per user without scripting — the same .htm file applies to everyone unless you build per-user file distribution logic using item-level targeting in Group Policy Preferences.

Method 4: Intune for Managed Devices

If you use Microsoft Intune to manage your Windows devices, you can deploy signatures via a PowerShell script that runs on each managed endpoint. This works for both classic Outlook and the new Outlook for Windows, and doesn’t require domain membership — making it the right choice for hybrid or cloud-only organizations.

Deploying a PowerShell script via Intune

1

Go to intune.microsoft.com → Devices → Scripts and remediations → Platform scripts.

2

Click Add → Windows 10 and later. Give it a name (e.g. "Deploy Outlook Signature").

3

Upload your PowerShell script. The script should write the signature .htm file to %APPDATA%\Microsoft\Signatures\ and set the registry keys (for classic Outlook) or call Set-MailboxMessageConfiguration via Exchange Online PowerShell if you want to target OWA as well.

4

Set Run this script using the logged on credentials to Yes — signatures are per-user and need to be written to the user's profile, not the system profile.

5

Assign the script to the user group or device group you want to target.

6

Monitor deployment status under Devices → Monitor → Script deployment status.

Pros

  • Works without domain join — ideal for cloud-only M365 tenants.
  • Targets specific user groups or devices with Intune assignment.
  • Runs automatically on new device enrollments.
  • Can combine registry keys (for classic Outlook) and Exchange cmdlets in one script.

Cons

  • Script runs on device — if the user is not logged in, it doesn't run.
  • Signature updates require a new script version and re-deployment.
  • Requires Intune P1 or P2 license — not available on basic M365 plans.
  • Still doesn't cover mobile (Outlook iOS/Android) without pairing with a transport rule.

For organizations running Intune-managed devices, combining Intune script deployment with an Exchange transport rule gives you the broadest coverage: desktop users see the signature in their compose window, and mobile users get it appended server-side. The Outlook Mobile signature guide covers the mobile side in detail.

Method 5: Third-party tools

The native Microsoft methods each have gaps: transport rules work on mobile but users can’t see their signature in compose; PowerShell gives compose-window visibility but needs re-running when things change; Group Policy is desktop-only; Intune requires a specific license tier and per-deployment script updates.

Third-party tools are built to fill those gaps without requiring you to chain multiple methods together. They typically provide a no-code template editor, directory sync (Azure AD, Google Workspace, or CSV), and a deployment layer that handles different clients.

NeatStamp: master template + deployment script

NeatStamp’s workflow for Outlook 365 deployment works like this: you build the master template in the signature editor — logo, colors, social links, promotional banners, and the legal disclaimer are set centrally and locked. Variable fields (name, title, phone) are marked as employee-fillable or pulled from your directory.

Once the template is ready, you upload your team via CSV or sync with Azure AD. NeatStamp generates a personalized signature for each user and provides two deployment paths:

  • Self-service: each employee gets an email with a personal link to their signature setup page, with step-by-step instructions specific to their Outlook version. See the full Outlook 365 setup steps in the email signature Outlook 365 guide.
  • Admin-push via PowerShell: NeatStamp generates a ready-to-run PowerShell script that calls Set-MailboxMessageConfiguration for each user in your team. You run it once with Exchange admin credentials. No scripting required on your part.

When you update the master template — new logo, new banner, new legal text — you re-generate the signatures and re-run the deployment script. The whole cycle takes about 5 minutes rather than the 2-4 hours a manual update typically requires. For organizations that want a comparison with enterprise alternatives, the Exclaimer alternative page and CodeTwo alternative page break down the feature and pricing differences.

For Teams users, the Teams plan covers multi-user signature management with an admin dashboard showing who has installed their signature and who hasn’t. The pricing page has details on per-seat costs for different team sizes.

Comparison: all 5 deployment methods

Each method fits a different situation. Here’s how they stack up across the factors that matter most for IT deployments:

MethodEase of setupPer-user controlMobile supportVisible in composeCostMaintenance
Exchange Transport RulesEasyAD attributes onlyYesNoFreeLow
PowerShell (Set-MailboxMessageConfiguration)ModerateFull per-user HTMLNoYesFreeModerate (re-run to update)
Group PolicyModerateLimited (same file for all)NoYes (classic Outlook)FreeModerate (update share file)
Intune ScriptModerateFull (scripted per-user)NoYesRequires Intune licenseModerate (re-deploy script)
Third-party (NeatStamp)EasyFull — template + directory syncVia transport rule pairingYesSubscriptionLow (template update = done)

For most organizations under 200 people, the PowerShell method or a third-party tool gives the best balance of control and maintainability. Transport rules are a solid addition for mobile coverage regardless of which primary method you choose.

Post-deployment: how to verify signatures are working

Don’t assume deployment worked — verify it. Each method has a slightly different verification approach.

For Exchange transport rules

Send a test email from an affected mailbox to an external address. Check the received email in its raw form (in Gmail: three-dot menu → Show original; in Outlook: File → Properties → Internet headers). Look for your HTML signature in the message body. Confirm the AD attribute tokens have been replaced with actual values.

Common mistake: sending to a mailbox in the same tenant. Internal emails may bypass external-only transport rules. Always test with an external address.

For PowerShell-deployed signatures

Log into Outlook on the Web (outlook.office.com) using the affected user’s credentials (or impersonate via Exchange admin). Go to Settings → Mail → Compose and reply. You should see the signature in the signature field.

For desktop Outlook, open the Outlook client and go to File → Options → Mail → Signatures. The signature should be listed there. Compose a new email and confirm it auto-inserts.

To verify all users at once using PowerShell:

# Check signature status for all user mailboxes
Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox |
  Get-MailboxMessageConfiguration |
  Select-Object Identity, AutoAddSignature, SignatureHTML |
  Export-Csv -Path "C:signatureserification-report.csv" -NoTypeInformation

# Quick summary count
$results = Get-Mailbox -ResultSize Unlimited -RecipientTypeDetails UserMailbox |
  Get-MailboxMessageConfiguration
$withSig = $results | Where-Object { $_.SignatureHTML -ne $null -and $_.SignatureHTML -ne "" }
Write-Host "$($withSig.Count) of $($results.Count) mailboxes have a signature set"

For Group Policy deployments

On a test machine, run gpupdate /force in Command Prompt, then open Outlook. Check File → Options → Mail → Signatures. If the signature doesn’t appear, verify the .htm file was copied to %APPDATA%\Microsoft\Signatures\ and the registry keys are set using reg query HKCU\Software\Microsoft\Office\16.0\Common\MailSettings.

Troubleshooting common issues

These are the problems that come up most often after deploying signatures in Microsoft 365, with the specific fix for each.

Signature not applying after PowerShell script
  • Check the script output for errors. Set-MailboxMessageConfiguration fails silently if it can't find the mailbox identity — make sure you're passing the UserPrincipalName, not just the display name.
  • Verify the cmdlet ran successfully by checking the mailbox: Get-MailboxMessageConfiguration -Identity [email protected] | Select SignatureHTML
  • If OWA doesn't show the signature, try logging out and back in. OWA caches settings and may not pick up the change immediately.
  • For desktop Outlook: close Outlook completely, open it again. On first open after a signature change, Outlook re-syncs settings from the server.
Transport rule variables showing as %%DisplayName%% (not resolved)
  • This happens when the Azure AD attribute is empty. Go to Microsoft 365 Admin Center → Users → select the user → Edit contact information. Fill in the Display Name, Job Title, and Phone Number fields.
  • Changes to Azure AD attributes can take up to 15 minutes to propagate to Exchange. Wait and re-test.
  • If the attribute is populated but still not resolving, confirm the token syntax is exact — it's %%DisplayName%% with double percent signs, not single.
HTML signature rendering badly in Outlook
  • Outlook uses the Word HTML rendering engine, which strips many CSS properties. Use table-based layout instead of divs. Use only inline styles — no style blocks or CSS classes.
  • Avoid: margin, padding on <p> tags, background-image, border-radius, CSS flexbox, CSS grid, most shorthand properties. These are stripped or mishandled.
  • Use: inline style attributes, cellpadding/cellspacing on tables, font-family and font-size as inline styles, direct px or pt measurements.
  • Test by actually sending the email to an Outlook recipient. Do not rely on browser previews — Outlook renders HTML differently from any browser.
Signature appearing twice in emails
  • This usually means both a transport rule and a client-side signature are active for the same user. The user's Outlook client inserts the signature at compose time, and the transport rule appends another one at the server.
  • Fix: if using transport rules, disable the signature in the client (set AutoAddSignature to $false in the PowerShell script, or instruct users to set their signature to 'none' in Outlook settings).
  • Alternatively, add a condition to the transport rule: except when the message header contains X-NeatStamp-Signed or similar — then set that header in your client-side signature. This prevents double-appending.
Signature not showing on mobile (Outlook iOS/Android)
  • Set-MailboxMessageConfiguration and Group Policy do not control the mobile app. Outlook Mobile has its own signature settings.
  • The only way to enforce a corporate signature on Outlook Mobile without the user manually setting it is Exchange transport rules (server-side injection). Add a transport rule with a condition to catch mail from mobile clients, or simply apply it to all outbound messages.
  • Some organizations use Intune app configuration policies for Outlook Mobile, which can push a default signature via managed app config. This requires Intune App Protection Policies and an Intune license.

Frequently asked questions

What is the fastest way to deploy signatures to all Outlook 365 users?

Exchange transport rules are the fastest to set up — you can have a server-side signature appending to all outbound emails in under 10 minutes. The limitation is that users never see the signature in their compose window. If you need users to see their signature while writing, a PowerShell script via Set-MailboxMessageConfiguration is the next fastest option, taking around 30 minutes for a team of 50.

Can I deploy different signatures to different departments in Microsoft 365?

Yes. Exchange transport rules support conditions, so you can apply different rules based on department, group membership, or any attribute in Azure AD. With PowerShell, you can loop through a CSV filtered by department and apply different HTML templates. Both approaches let you give Sales a signature with a promotional banner while Legal gets a signature with specific compliance text.

Does the PowerShell Set-MailboxMessageConfiguration method work on mobile?

No. Set-MailboxMessageConfiguration sets the signature in the Outlook desktop and web clients, but it does not apply to Outlook Mobile on iOS or Android. For mobile, the only reliable approaches are Exchange transport rules (which add the signature server-side, so they work on any device) or a third-party tool that handles mobile separately.

Will Group Policy work for users on the new Outlook for Windows?

No. Group Policy registry keys for signatures (under HKCU\Software\Microsoft\Office\16.0\Common\MailSettings) only work with classic Outlook. The new Outlook for Windows uses a web-based architecture that ignores these registry settings entirely. For the new Outlook, use Exchange transport rules, PowerShell, or a third-party tool.

How do I use Active Directory attributes in Exchange transport rules?

In the HTML you add to your transport rule disclaimer, use Active Directory property tokens wrapped in double percent signs: %%DisplayName%%, %%Title%%, %%PhoneNumber%%, %%Department%%, %%Company%%, %%City%%, %%StateOrProvince%%, and %%CountryOrRegion%%. Exchange resolves these at send time using the sender's Azure AD attributes. If an attribute is empty, the token is replaced with an empty string.

What happens if an employee's Azure AD profile doesn't have a phone number?

If the Azure AD attribute is empty, the %%PhoneNumber%% token renders as an empty string. This means you get a blank line in the signature where the phone number should be. To avoid this, wrap phone lines in conditional logic — which transport rules don't support natively. A PowerShell script with conditional checks, or a third-party tool, handles missing fields more gracefully by hiding the entire line if the field is empty.

How do I verify that a deployed signature is working correctly?

Send a test email from the affected mailbox to an external address you control (not another mailbox in your tenant — internal emails may bypass transport rules). Check the received email in the raw source view to confirm the HTML is present and the variables resolved correctly. For PowerShell-deployed signatures, log into Outlook on the Web for the test mailbox and check Settings → Mail → Compose and reply to see the installed signature.

What should I do if the HTML signature renders badly in Outlook?

Outlook (both desktop and 365) uses the Word rendering engine for HTML, which strips many CSS properties including margin, padding on certain elements, CSS classes, and background images. Build your HTML signature using table-based layout rather than div/flexbox. Use inline styles only. Avoid background-image. Use only web-safe fonts or include fallbacks. Test specifically in Outlook by sending to a test account — what looks fine in Gmail may render differently in Outlook.

Skip the scripting — deploy in 30 minutes

NeatStamp generates the PowerShell script for you. Build your master template, upload your team via CSV, and get a ready-to-run deployment script for Outlook 365.