All Oculus Quest developers MUST PASS the concept review prior to gaining publishing access to the Quest Store and additional resources. Submit a concept document for review as early in your Quest application development cycle as possible. For additional information and context, please see Submitting Your App to the Oculus Quest Store.
This article introduces three concepts: Destinations, Deep Linking and Rich Presence, which work together to enable you to build experiences that are more discoverable and social.
Destinations enable you to define deep-linkable locations, levels, or game modes within your app with rich media such as images and translated descriptions, and metadata such as player limits. The Oculus Store can display these destinations on your app store page as recommended activities for users, and can aggregate users’ presence. In addition, each destination will have an associated URL, which you can use to share new levels or game modes via social media.
The goal of destinations is enable you to create meetup places within an app that you can easily transport users to.
The Rich Presence API enables you to update the Oculus platform with a user’s current destination and status, whether they are joinable, and additional context that can help their friends know whether they can be joined in a social experience.
Whenever a user launches your app to join someone, or navigates to a destination, the Oculus Platform provides a deep-link message with this context, enabling you to take them to the right person or place in your app.
Using Destinations, Rich Presence and Deep Linking, you transport users to a specific destination, where they can play solo or join another user, or users can launch your app to the same destination for a shared social experience.
When users opt to share their Rich Presence, their friends can see whether they are in an app and looking for a match, playing a specific map, or participating in an event. Users control their online presence with an Activity privacy setting. A user can see a friend’s status, opt to join them, and be transported to the same destination as their friend.
For example, imagine a scenario where you add a new map to your game. With rich presence, destinations and deep linking:
To implement Rich Presence, you define one or more Destinations for your app or app grouping that you can then deep link to. A destination is a social gathering place within your app, which might be represented by a matchmaking pool, room multiplayer server or specific configuration of an activity.
Your app code sets destinations for users, which they can opt to share as their online presence with friends or with anyone.
When users opt to either join another user via their rich presence, or launch directly to a specific destination, deep linking is used to launch the app. You provide app code to check the launch status and transport the user to the correct destination.
Destinations can be configured to provide the most relevant context based on the user’s activity and whether they are joinable. For example, a destination can help users looking for a match in 1v1 game or provide a hub to direct users to an app lobby.
In summary, the steps to implement Rich Presence are:
The first step to implement rich presence is to create a destination on the developer dashboard.
In the Create Destination page, enter:
Note: A specific deep link URL should always take users to the same destination.
Repeat for each language you have entered.
Finally, optionally enter the following:
The following image shows an example of the Create Destination page.

The following image shows an example.

You define rich presence details for a user in your app by creating a RichPresenceOptions, a struct with several fields that describe a destination. The Oculus platform uses this information to display a status for the user.
The RichPresenceOptions struct has the following functions to set its fields:
SetApiName - Sets the api_name you specified for a destination in the developer dashboard.SetCurrentCapacity - Sets the current capacity at that destination.SetMaxCapacity - Sets the maximum capacity of the destination. Can be used with current capacity to see if a user can join. For example, when used with a room, set the max capacity of the destination to the max capacity of the room.SetIsJoinable - Sets a boolean to indicate whether the destination is joinable. You can check the current capacity against the max capacity to determine whether the room is joinable.SetDeeplinkMessageOverride - Sets an optional message to override the deep-link message set in the developer dashboard. This is where you can specify the ID for a room, party, matchmaking pool or group server.SetStartTime - Sets the time the current match starts or started.SetEndTime - Sets the time the current match ends.SetExtraContext - Sets extra information to set the user’s presence correctly.As the user moves through your app, you can set their presence to destinations as they are applicable.
Marking a user as joinable depends on the app you are trying to build. Following are a few examples of when to make a user joinable:
The following table shows how marking a user as joinable and providing extra context can affect the user’s status.
| RichPresenceOptions and result | Sample Status Displayed |
|---|---|
is_joinable. | ![]() |
current_capacity to max_capacity. | ![]() |
end_time. | ![]() |
start_time. | ![]() |
Once you’ve added a destination and set a user’s rich presence, the final step is to check for a deep link URI, which is passed in an application lifecycle update message, and navigate the user to the right place in your app.
Check the message queue for an application lifecycle message of type LaunchIntentChanged. A LaunchIntentChanged is sent when a launch intent is received for a cold or warm start.
ApplicationLifecyle_GetLaunchDetails() method and check the LaunchType.LaunchType is Deeplink, parse the LaunchDetails_DeeplinkMessage, Api_Name, UsersOptional, and RoomID fields, as follows:| Scenario | Example Fields | Example Behavior |
|---|---|---|
| Join a User: In headset, a user taps Go To on another user from the Friends List, Party panel, or Home feed. | "destination_api_name": "level3","deeplink_message":"deeplink message from the user's presence","users": {"id":"123456789","alias":"otherUser"} | Navigate this user to where the otherUser is at level3. |
| Direct Launch: Level 5 shows up in popular destinations based on a large number of people. A user accesses the destination from a deep link URL and remotely launches the app. | "destination_api_name":"level5","deeplink_message": "your deeplink to the destination","users": [] | Launch into level5. |
| Group Launch: A party of 2 users choose Boss Level from a list of possible places and both users tap Launch. | "destination_api_name": "bossLevel","deeplink_message": "your deeplink to the destination","room_id":"12345","users": [{"id":"123456789","alias":"user1Joining"}, {"id":"67891234","alias":"user2Joining"}] | Launch the users into boss_level using the room_id to ensure they launch into the same instance of boss_level. |
You can launch your app with a deep-link payload for testing purposes using the Android Adb tool with the shell command. To do this:
$ adb shell
am start -n com.your.app/com.your.activity -e intent_cmd '{"ovr_social_launch":{"type":"DEEPLINK","destination_api_name": "api_name","deeplink_message":"your deeplink","users":[{"id":"123456789","alias":"janedoe1234"},{"id":"12355555555","alias":"johndoe5678"}]}}'
destination_api_name and users along with deeplink_message from LaunchDetails to help you launch users to the correct destination.For more information about using the adb shell to start an activity, see the activity manager section of Android Debug Bridge (adb) in the Android documentation.
The following sections list some the implementation scenarios and how you might test these on an Oculus Quest device.
#1. Join a User based on their Rich Presence
#2. Direct Launch to a specific destination
#3. Group Launch
Following are some best practices and things to consider when you incorporate destinations and rich presence in your apps.
ExtraContext fields such as EndingIn to report additional details. This can help lead to social experiences. For example, a user could see that their friend has just a few minutes left in their solo game, and decide to launch the same game.