Publishers & Channels
This guide covers creating and managing Publishers and Channels in OpenDev for organizing your distribution strategy.
Overview
Publishers
Publishers represent the entities that publish your applications:
- Company or individual
- App store accounts
- Distribution partners
Channels
Channels represent distribution paths:
- App stores (Google Play, App Store)
- Web distribution
- Direct downloads
- Regional variations
Publishers
Understanding Publishers
A Publisher contains:
- Publisher name and identifier
- Contact information
- Associated OAuth configurations
- Platform credentials
Creating a Publisher
- Go to Publishers in the sidebar
- Click Create Publisher
- Fill in the details:
| Field | Required | Description |
|---|---|---|
| Publisher ID | Yes | Unique identifier |
| Name | Yes | Display name |
| Description | No | Internal notes |
| Contact Email | No | Publisher contact |
| Website | No | Publisher website |
- Click Create
Publisher Configuration
{
"publisherId": "acme_corp",
"name": "ACME Corporation",
"description": "Main publishing entity",
"contact": {
"email": "publishing@acme.com",
"website": "https://acme.com"
},
"platforms": {
"googlePlay": {
"developerAccount": "ACME Corp",
"serviceAccountEmail": "acme@project.iam.gserviceaccount.com"
},
"appStore": {
"teamId": "XXXXXXXXXX",
"providerId": "12345678"
}
}
}
Managing Publishers
Edit Publisher
- Click on a publisher in the list
- Click Edit
- Modify fields as needed
- Click Save
Delete Publisher
- Click on the publisher
- Click Delete
- Confirm deletion
Warning: Cannot delete publishers linked to active channels.
Channels
Understanding Channels
A Channel defines:
- Distribution platform
- Regional configuration
- OAuth provider mappings
- Payment settings
Channel Types
| Type | Description | Examples |
|---|---|---|
| Mobile Store | Official app stores | Google Play, App Store |
| Web | Web distribution | Your website, PWA |
| Desktop | Desktop distribution | Steam, direct download |
| Alternative | Third-party stores | Samsung, Amazon |
| Regional | Market-specific | China, Japan versions |
Creating a Channel
- Go to Channels in the sidebar
- Click Create Channel
- Fill in the details:
| Field | Required | Description |
|---|---|---|
| Channel Key | Yes | Unique identifier |
| Name | Yes | Display name |
| Publisher | Yes | Associated publisher |
| Platform | Yes | Target platform |
| Description | No | Channel purpose |
- Click Create
Channel Configuration
{
"channelKey": "google_play_global",
"name": "Google Play Global",
"publisherId": "acme_corp",
"platform": "android",
"region": "global",
"oauth": {
"providers": ["google", "facebook"],
"appId": "com.acme.myapp"
},
"payment": {
"enabled": true,
"providers": ["google_play"]
}
}
OAuth Channels
Understanding OAuth Channels
OAuth Channels link authentication providers to distribution channels:
- Which login methods are available
- Provider credentials per channel
- Channel-specific configurations
Creating OAuth Channel
- Go to OAuth Channels in the sidebar
- Click Create OAuth Channel
- Configure the provider:
| Field | Required | Description |
|---|---|---|
| Provider | Yes | OAuth provider (Google, Facebook, etc.) |
| Client ID | Yes | Provider app ID |
| Client Secret | Yes | Provider secret |
| Scopes | Yes | Requested permissions |
| Callback URL | Yes | OAuth callback |
OAuth Channel Examples
Google OAuth Channel
{
"provider": "google",
"clientId": "xxxxx.apps.googleusercontent.com",
"clientSecret": "GOCSPX-xxxxx",
"scopes": ["email", "profile"],
"callbackUrl": "https://yourdomain.com/auth/callback"
}
Apple Sign In Channel
{
"provider": "apple",
"clientId": "com.yourapp.web",
"teamId": "XXXXXXXXXX",
"keyId": "XXXXXXXXXX",
"privateKey": "-----BEGIN PRIVATE KEY-----\n...",
"scopes": ["email", "name"]
}
Binding Channels to Apps
In Application Settings
- Go to your application details
- Click Channels tab
- Click Bind Channel
- Select channels to associate
- Click Save
Channel Binding Options
| Option | Description |
|---|---|
| All Channels | App available on all channels |
| Specific Channels | App limited to selected channels |
| Exclude Channels | App blocked from certain channels |
Configuration Workflow
Typical Setup
1. Create Publishers
└── ACME Corp (main publisher)
└── ACME Games (games division)
2. Create Channels
└── google_play_global
└── app_store_global
└── web_direct
└── china_domestic
3. Create OAuth Channels
└── Google OAuth for all
└── Apple Sign In for iOS
└── WeChat for China
4. Bind to Applications
└── MyApp → google_play, app_store, web
└── MyGame → google_play, app_store
└── MyApp China → china_domestic
Best Practices
Publisher Organization
By Business Unit:
├── acme_main (main company)
├── acme_games (games studio)
└── acme_enterprise (B2B products)
By Region:
├── acme_global (worldwide)
├── acme_china (China entity)
└── acme_japan (Japan entity)
Channel Naming
Platform + Region:
├── google_play_global
├── google_play_china
├── app_store_global
├── app_store_china
├── web_global
└── web_china
OAuth Strategy
- Unified providers - Use same OAuth apps across channels when possible
- Regional providers - Add region-specific (WeChat, QQ) where needed
- Fallback options - Always provide email/password option
- Consistent experience - Same user ID across channels
Integration
Client Configuration
Your app receives channel info in config:
{
"channel": {
"key": "google_play_global",
"name": "Google Play Global",
"platform": "android"
},
"oauth": {
"providers": [
{
"id": "google",
"clientId": "xxxxx.apps.googleusercontent.com"
},
{
"id": "facebook",
"appId": "1234567890"
}
]
}
}
Detecting Channel
// Android
const channelKey = BuildConfig.CHANNEL_KEY;
// iOS
const channelKey = Bundle.main.infoDictionary["ChannelKey"];
// Web
const channelKey = process.env.REACT_APP_CHANNEL_KEY;
Troubleshooting
OAuth Not Working
Possible causes:
- Incorrect client ID/secret
- Wrong callback URL
- Missing scopes
Solutions:
- Verify credentials in provider console
- Check callback URL matches exactly
- Review scope permissions
Channel Not Found
Possible causes:
- Typo in channel key
- Channel not created
- Case sensitivity issues
Solutions:
- Verify channel exists in dashboard
- Check key is exact match (case-sensitive)
- Review app channel bindings
Publisher Access Issues
Possible causes:
- Permissions not granted
- Publisher not linked to account
- Role restrictions
Solutions:
- Check user role in team settings
- Verify publisher ownership
- Contact account administrator