Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

Module extension Outlook add-ins

A module extension add-in lets you surface a custom panel in the Outlook navigation bar, alongside modules like Mail, Calendar, and Tasks. Unlike standard message or appointment add-ins, a module extension isn't tied to a specific mail item. You can use it to embed business tools or external data within Outlook so your users don't need to switch applications.

Tip

Module extensions are only supported in classic Outlook on Windows. To provide a more modern solution that's available on various platforms, create personal tab apps that open in Outlook instead. With personal tab apps, your users will have access to business critical data and productivity tools not just in Outlook, but across Microsoft 365 applications, including Microsoft Teams, and various platforms.

Supported clients and manifests

To create and run module extension add-ins, you must:

  • Develop the add-in using an add-in only manifest. The unified manifest for Microsoft 365 doesn't support module extensions.
  • Run the add-in in classic Outlook on Windows (Outlook 2016 or later).

Open a module extension

To open a module extension, navigate to the Outlook navigation bar, select More Apps, then choose the module extension add-in.

👁 Available modules and module extension add-ins in the More Apps flyout.

Tip

In older versions of classic Outlook on Windows, the navigation bar appears at the bottom of the window. Access to a module extension varies depending on the layout of the navigation bar and the number of available module extensions.

Configure a module extension

When you select a module extension add-in, Outlook replaces the built-in module with your custom module so that you can interact with the add-in. You can use some of the features of the Outlook JavaScript API in your add-in. APIs that logically assume a specific Outlook item, such as a message or appointment, don't work in module extensions. The module can also include function commands in the Outlook ribbon that interact with the add-in's page. To facilitate this, your function commands must call the Office.onReady or Office.initialize method and the Event.completed method.

To test and learn how to configure a module extension, see the Office Add-ins module extension sample.

👁 The user interface of a sample module extension.

Example

The following is a section of a manifest file that defines a module extension. Key elements include:

  • <ExtensionPoint xsi:type="Module">: Declares the add-in as a module extension and sets the URL of the page that Outlook renders when the user opens it.
  • <CommandSurface>: Defines a custom tab on the Outlook ribbon with a button that triggers a function command.

<VersionOverrides xmlns="http://schemas.microsoft.com/office/mailappversionoverrides"
 xsi:type="VersionOverridesV1_0">
 <VersionOverrides xmlns="http://schemas.microsoft.com/office/mailappversionoverrides/1.1"
 xsi:type="VersionOverridesV1_1">
 <Requirements>
 <bt:Sets DefaultMinVersion="1.3">
 <bt:Set Name="Mailbox"/>
 </bt:Sets>
 </Requirements>
 <Hosts>
 <Host xsi:type="MailHost">
 <DesktopFormFactor>
 <!-- Sets the URL of the JavaScript file that contains the code to
 run the operations of a module extension add-in. -->
 <FunctionFile resid="residFunctionFileUrl"/>
 <!--Configures the add-in as a module extension. -->
 <ExtensionPoint xsi:type="Module">
 <SourceLocation resid="residExtensionPointUrl"/>
 <Label resid="residExtensionPointLabel"/>
 <CommandSurface>
 <CustomTab id="idTab">
 <Group id="idGroup">
 <Label resid="residGroupLabel"/>
 <Control xsi:type="Button" id="group.changeToAssociate">
 <Label resid="residChangeToAssociateLabel"/>
 <Supertip>
 <Title resid="residChangeToAssociateLabel"/>
 <Description resid="residChangeToAssociateDesc"/>
 </Supertip>
 <Icon>
 <bt:Image size="16" resid="residAssociateIcon16"/>
 <bt:Image size="32" resid="residAssociateIcon32"/>
 <bt:Image size="80" resid="residAssociateIcon80"/>
 </Icon>
 <Action xsi:type="ExecuteFunction">
 <FunctionName>changeToAssociateRate</FunctionName>
 </Action>
 </Control>
 </Group>
 <Label resid="residCustomTabLabel"/>
 </CustomTab>
 </CommandSurface>
 </ExtensionPoint>
 </DesktopFormFactor>
 </Host>
 </Hosts>
 <Resources>
 <bt:Images>
 <bt:Image id="residAssociateIcon16"
 DefaultValue="https://localhost:3000/assets/associate-16.png"/>
 <bt:Image id="residAssociateIcon32"
 DefaultValue="https://localhost:3000/assets/associate-32.png"/>
 <bt:Image id="residAssociateIcon80"
 DefaultValue="https://localhost:3000/assets/associate-80.png"/>
 </bt:Images>
 <bt:Urls>
 <bt:Url id="residFunctionFileUrl"
 DefaultValue="https://localhost:3000/module.html"/>
 <bt:Url id="residExtensionPointUrl"
 DefaultValue="https://localhost:3000/module.html"/>
 </bt:Urls>
 <bt:ShortStrings>
 <bt:String id="residExtensionPointLabel"
 DefaultValue="Billable Hours"/>
 <bt:String id="residGroupLabel"
 DefaultValue="Change billing rate"/>
 <bt:String id="residCustomTabLabel"
 DefaultValue="Billable hours"/>
 <bt:String id="residChangeToAssociateLabel"
 DefaultValue="Associate Rate"/>
 </bt:ShortStrings>
 <bt:LongStrings>
 <bt:String id="residChangeToAssociateDesc"
 DefaultValue="Change to the associate billing rate: $127/hr"/>
 </bt:LongStrings>
 </Resources>
 </VersionOverrides>
</VersionOverrides>

See also


Feedback

Was this page helpful?

Additional resources