diff --git a/App/client-ios/Resources/client-ios.entitlements b/App/client-ios/Resources/client-ios.entitlements
index 88e463326dd0fda0a358f095f60612c555c77d3b..c5460225092202a6000d72287bc8888a6f72e8d4 100644
--- a/App/client-ios/Resources/client-ios.entitlements
+++ b/App/client-ios/Resources/client-ios.entitlements
@@ -4,6 +4,10 @@
 <dict>
 	<key>aps-environment</key>
 	<string>development</string>
+	<key>com.apple.developer.associated-domains</key>
+	<array>
+		<string>applinks:xx.network</string>
+	</array>
 	<key>com.apple.developer.icloud-container-identifiers</key>
 	<array>
 		<string>iCloud.xxm-cloud</string>
diff --git a/Sources/App/AppDelegate.swift b/Sources/App/AppDelegate.swift
index 9b4a816dad120c5e01dbd428933a4161d71a1feb..40780f6fa7e0066ef993d1c6a519d5417a319357 100644
--- a/Sources/App/AppDelegate.swift
+++ b/Sources/App/AppDelegate.swift
@@ -142,21 +142,32 @@ public class AppDelegate: UIResponder, UIApplicationDelegate {
         open url: URL,
         options: [UIApplication.OpenURLOptionsKey : Any] = [:]
     ) -> Bool {
-        if let username = getUsernameFromInvitationDeepLink(url) {
-            let router = try! DependencyInjection.Container.shared.resolve() as PushRouter
-            router.navigateTo(.search(username: username), {})
-            return true
-        } else {
-            return dropboxService.handleOpenUrl(url)
+        dropboxService.handleOpenUrl(url)
+    }
+
+    public func application(
+        _ application: UIApplication,
+        continue userActivity: NSUserActivity,
+        restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
+    ) -> Bool {
+        guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
+              let incomingURL = userActivity.webpageURL,
+              let username = getUsernameFromInvitationDeepLink(incomingURL) else {
+            return false
         }
+
+        let router = try! DependencyInjection.Container.shared.resolve() as PushRouter
+        router.navigateTo(.search(username: username), {})
+        return true
     }
 }
 
 func getUsernameFromInvitationDeepLink(_ url: URL) -> String? {
     if let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
-       components.scheme == "xxnetwork",
-       components.host == "messenger",
-       let queryItem = components.queryItems?.first(where: { $0.name == "invitation" }),
+       components.scheme == "https",
+       components.host == "xx.network",
+       components.path == "/messenger/invitation",
+       let queryItem = components.queryItems?.first(where: { $0.name == "username" }),
        let username = queryItem.value {
         return username
     }
diff --git a/Sources/MenuFeature/ViewModels/MenuViewModel.swift b/Sources/MenuFeature/ViewModels/MenuViewModel.swift
index 98bc5d74b66c3e85e43ea5f9b7a21129db7cd55d..20a9ebd2565fefcb3b49756e8a60023902c6d879 100644
--- a/Sources/MenuFeature/ViewModels/MenuViewModel.swift
+++ b/Sources/MenuFeature/ViewModels/MenuViewModel.swift
@@ -42,6 +42,6 @@ final class MenuViewModel {
     }
 
     var referralDeeplink: String {
-        "xxnetwork://messenger?invitation=\(username)"
+        "https://xx.network/messenger/invitation?username=\(username)"
     }
 }
diff --git a/Tests/AppTests/General/InvitationTests.swift b/Tests/AppTests/General/InvitationTests.swift
index 146c885afab3c85686cc5f216c8e85ff851911b5..d29258e324a1d6da30fb6dc1f695dfe347115be7 100644
--- a/Tests/AppTests/General/InvitationTests.swift
+++ b/Tests/AppTests/General/InvitationTests.swift
@@ -3,19 +3,33 @@ import XCTest
 @testable import App
 
 final class AppDelegateTests: XCTestCase {
-    func test_invitationDeeplink() {
-        XCTAssertNil(
-            getUsernameFromInvitationDeepLink(URL(string: "http://messenger?invitation=john_doe")!)
-        )
-
-        XCTAssertNotEqual(
-            getUsernameFromInvitationDeepLink(URL(string: "xxnetwork://messenger?invitation=the_rock")!),
-            "john_doe"
-        )
-
-        XCTAssertEqual(
-            getUsernameFromInvitationDeepLink(URL(string: "xxnetwork://messenger?invitation=john_doe")!),
-            "john_doe"
-        )
+    func test_invitationUniversalLink() {
+        XCTAssertNil(getUsernameFromInvitationDeepLink(
+            URL(string: "https://xx.network/messenger/invite?username=some")!
+        ))
+
+        XCTAssertNil(getUsernameFromInvitationDeepLink(
+            URL(string: "http://xx.network/messenger/invitation?username=some")!
+        ))
+
+        XCTAssertNil(getUsernameFromInvitationDeepLink(
+            URL(string: "https://network.xx/messenger/invitation?username=some")!
+        ))
+
+        XCTAssertEqual(getUsernameFromInvitationDeepLink(
+            URL(string: "https://xx.network/messenger/invitation?username=brad")!
+        ), "brad")
+
+        XCTAssertNil(getUsernameFromInvitationDeepLink(
+            URL(string: "https://xx.network/messenger/invitation?password=value")!
+        ))
+
+        XCTAssertNil(getUsernameFromInvitationDeepLink(
+            URL(string: "https://xx.network/xxmessenger/invitation?username=some")!
+        ))
+
+        XCTAssertNotEqual(getUsernameFromInvitationDeepLink(
+            URL(string: "https://xx.network/messenger/invitation?username=anderson")!
+        ), "silva")
     }
 }