Portal App Deeplinks: Required URL Format (with Region)

Last updated: October 23, 2026

TL;DR

Every Portal deeplink must use this format:

https://applink.zuddl.com/link/{appId}/{region}/{eventId}/{type}/{primaryId}[/{subPageId}]

Old links without region, type and id, such as https://applink.zuddl.com/link/com.zuddl.portal/event/{eventId}, are rejected by the app with z_deeplink_invalid_url.

URL segments

Segment

Allowed values / notes

link

Required. The literal word link.

{appId}

Required. App bundle ID: com.zuddl.portal for the Zuddl app, or the customer's white-label ID (e.g. com.zuddl.<customer>). Android only opens links whose appId matches the installed app.

{region}

Required. US or EU, whichever region the event is hosted in. Use uppercase.

{eventId}

Required. Event UUID.

{type}

Required. page (open a portal page) or game (gamification QR check-in). Any other value is ignored.

{primaryId}

Required. For page: the portal page ID. For game: the QR code value.

{subPageId}

Optional. page links only: the child page ID to open inside the page.

Examples

Open a portal page in a US event:

https://applink.zuddl.com/link/com.zuddl.portal/US/{eventId}/page/{pageId}

Open a sub-page:

https://applink.zuddl.com/link/com.zuddl.portal/US/{eventId}/page/{pageId}/{subPageId}

Gamification QR code in an EU event:

https://applink.zuddl.com/link/com.zuddl.portal/EU/{eventId}/game/{qrCode}

White-label app:

https://applink.zuddl.com/link/com.zuddl.<customer>/US/{eventId}/page/{pageId}

Wrong vs right

Status

Link

❌ Wrong (old)

https://applink.zuddl.com/link/com.zuddl.portal/event/{eventId}

❌ Wrong (region only, no type/id)

https://applink.zuddl.com/link/com.zuddl.portal/US/{eventId}

❌ Wrong (unknown type)

https://applink.zuddl.com/link/com.zuddl.portal/US/{eventId}/event/x

✅ Right

https://applink.zuddl.com/link/com.zuddl.portal/US/{eventId}/page/{pageId}

Important: the new format has no "open event only" link. Adding the region to an old event link is not enough. A link needs a type (page or game) and its id, or the app rejects it.

What the app does with each link

  • Valid link: logs z_deeplink_opened, then after splash/login opens the event and the target page or game.

  • Not logged in: logs z_deeplink_login_required, sends the user to login, and resumes the link afterwards.

  • Invalid link (fewer than 6 path segments, or missing region/type/id): logs z_deeplink_invalid_url and does not deep-navigate. On iOS, the user may still land in the app through the install-redirect fallback, but not on the intended screen.

  • Unknown type: the link is dropped silently.

Why this matters: live example

Shared link: https://applink.zuddl.com/link/com.zuddl.portal/event/974bae1d-c524-4466-9dd7-ee8e4cacc7c0 (old format).

  • 84 devices opened it (82 iOS, 2 Android), mostly in the US, Canada and the UK.

  • 84 of 84 logged z_deeplink_invalid_url.

  • 71 iOS devices reached the app only through the install-redirect fallback. About 8 devices show no later activity for the event.

Checklist before sharing a deeplink

  1. Is the host applink.zuddl.com and the path /link/...?

  2. Does the appId match the app attendees will install: com.zuddl.portal or the white-label ID?

  3. Does the region match the event's hosting region: US or EU?

  4. Is the type page or game, followed by the page ID or QR code?

  5. Test the link on one iOS and one Android device, both logged in and logged out, before sending it to attendees.

  6. Replace any old-format links already sent: emails, QR codes and landing pages.

Source of truth (code)

  • iOS: portal-ios/.../PortalApp.swift → parseDeepLink (requires 6 or more segments; types game/page)

  • Android: portal-android/.../presentation/deepLink/DeepLinkActivity.kt (validates appId/region/eventId/type/primaryId), utils/DeepLinkManager.kt, DeepLinkDispatcher.kt

  • Android intent filter: AndroidManifest.xml → pathPrefix="/link/${applicationId}"