What it does
mam-universal-link-manager makes links and apps work together. It does three jobs:
- Publishes the iOS trust file (AASA). Writes
apple-app-site-associationto your web root and/.well-known/so iOS opens your app — not Safari — when someone taps a link to your site. Built from your Team ID, Bundle ID, and an optional path pattern. - Publishes the Android trust file. Writes the
assetlinks.jsonyou paste from the Play Console to/.well-known/assetlinks.jsonso Android App Links open your app. - Branch.io deep links (optional). With Branch keys configured, the plugin creates Branch deep links on demand. MAM Main’s contact invites automatically upgrade their invite links to Branch deep links (so the invite context arrives in the app after install, even when the invitee had to install it first), and MAM GeoDirectory uses the same factory for new-listing links.
When the app opens from a Branch deep link, it posts the link’s payload back to the site (the mam_deep_link_data subaction), where it is stored per device and used by other plugins — for example MAM In-App Purchase Manager attributes purchases to the venue whose link or QR code brought the user in.
Where it’s configured
Everything lives on one page: Local App Setup → Universal Link.
| Section | Settings |
|---|---|
| iOS Universal Links | iTunes Team ID, iTunes Bundle ID, New Account URL (the path pattern the app claims; blank = all paths) |
| Android App Links | Digital Asset Links JSON (pasted from the Play Console; validated before saving) |
| Branch.io (optional) | App ID, live/test keys and secrets, link domains, Use Test Keys toggle, App Tracking Permission Message |
Saving the page writes the trust files, adds a managed ForceType application/json block to .htaccess (marker-delimited, idempotent), and self-checks that both files are actually served as JSON (failures are logged to the MAM debug log as admin_alert).
Secrets stay home: the Branch live/test secrets are used only server-side and are never included in the app build payload — only the publishable keys and link domains are.
Data it stores
| Store | Contents | Lifecycle |
|---|---|---|
wp_mam_deep_link_data |
Per-device (pid) key/values delivered via the mam_deep_link_data app subaction |
One row per device + key; replaced on resubmission. Read by MAM In-App Purchase Manager for venue attribution |
| Options | ios_pn_team_id, ios_pn_app_bundle_id (shared with MAM Main push setup), mam_universal_link_account_url, mam_android_asset, mam_universal_link_tracking_message, branch_* |
Plugin-owned options and the table are removed on uninstall; shared options and the published trust files are preserved |
Good to know
- Single-site: the trust-file and
.htaccesswriters assume a standard single-site install; on multisite they write to the shared web root. - HTTPS is required by both Apple and Google for universal/app links.
- Deleting the plugin does not delete the published trust files — live apps depend on them. Remove them manually if the apps are retired.
Related articles
- Set up iOS universal links
- Set up Android App Links
- Set up Branch.io deep links
- Hook:
mam_universal_link_get_branch_link - Hook: the
mam_deep_link_dataendpoint and filters
Metadata
| Field | Value |
|---|---|
| Article type | Plugin Overview |
| Plugin slug | mam-universal-link-manager |
| Applies to plugin version | 26.24.1+ |
| Category | Plugin Reference |
| Depends on | MAM Main |
| Works with | MAM GeoDirectory (Branch links for new listings), MAM In-App Purchase Manager (venue attribution), Branch.io (optional) |
| Hooks exposed | mam_universal_link_enabled, mam_universal_link_get_branch_link, mam_universal_link_accept_deep_link_data, mam_universal_link_deep_link_data, mam_universal_link_deep_link_data_reply |
| Last verified | 2026-06-12 |
