Create a project
A project is the home for one app business. It contains your apps, payment rails, products, entitlements, customers, and revenue history. Everything in Crossdeck resolves through a project.
One project per product business — not per platform. Your iOS app, Android app, and web app all live inside the same Crossdeck project so customers and entitlements stay unified.
What a project contains
A project is the top-level container for everything Crossdeck verifies and reports on. The objects inside it cross-reference each other through Crossdeck's identity graph.
| Object | What it is | Example |
|---|---|---|
App |
A client surface where users interact with your product. | iOS app, web app |
Payment rail |
A provider that verifies money movement. | App Store, Stripe, Google Play |
Product |
A purchasable item sold by a rail. | monthly_pro, annual_pro_web |
Entitlement |
A platform-independent access right your app unlocks. | pro, unlimited_exports |
Customer |
The unified user across every app and payment rail. | cust_8a2e1c |
Before you start
You only need a Crossdeck account to create a project. Payment-rail credentials and SDK installs come later — you can wire them in any order.
- A Crossdeck account (start free — no credit card)
- Your product name and the platforms you ship on
- Optional — Apple Developer, Stripe, or Google Play accounts when you're ready to connect rails
Step 1 · Create the project
From the dashboard, click + New project and fill in the three fields. The information here defines the mental model Crossdeck will use for every screen, query, and webhook downstream.
Use your product name, not your company name. This is what appears in the workspace switcher and on every dashboard surface.
subscription, one-time, or hybrid. Crossdeck uses this to preselect setup paths and surface the right dashboard widgets — you can change it later.
iOS, Android, and web. Crossdeck only generates SDK keys and surfaces setup steps for the platforms you select. Add or remove platforms whenever you ship new ones.
Use the @cross-deck/node (coming soon) server SDK if you're scripting workspace setup. The example below assumes you've already exported your account-level secret as CROSSDECK_SECRET_KEY.
import { CrossdeckServer } from "@cross-deck/node (coming soon)"
const cd = new CrossdeckServer({
secretKey: process.env.CROSSDECK_SECRET_KEY
})
const project = await cd.projects.create({
name: "Acme Inc.",
businessModel: "subscription",
platforms: ["ios", "web"]
})
console.log(project.projectId)
Step 2 · Project keys
Crossdeck issues two key types per environment. Public keys are safe to embed in client apps. Secret keys are server-only and never recoverable in plaintext after the first time they're shown.
Embed in iOS, Android, and web apps. Used for telemetry and entitlement reads. Cannot grant access on its own.
Use only on your backend. Required for server-side aliasing, manual entitlement grants, and bulk imports. Treat like a database password.
Crossdeck stores the hash of every secret key — not the value. If you lose a secret, rotate it from the dashboard. Existing rotations don't break in-flight requests.
Step 3 · Environments
Every project ships with two environments out of the box: sandbox and production. They have separate keys, separate webhook endpoints, and separate dashboard data — sandbox events never contaminate production metrics.
| Environment | Public key prefix | Use for |
|---|---|---|
sandbox |
cd_pub_test_… |
Local development, App Store sandbox, Stripe test mode |
production |
cd_pub_live_… |
Real customer traffic and verified revenue events |
Step 4 · Add platforms
Inside the project, each platform is its own app with its own SDK key and metadata. You can add platforms now or later — Crossdeck only surfaces setup steps for the ones you've enabled.
- iOS — bundle ID, App Store App ID, environment
- Android — package name, environment
- Web — allowed origin (domain), framework
Continue with the platform-specific guides:
Reference
The complete project shape returned by the API.
| Field | Type | Description |
|---|---|---|
projectId |
string |
Stable identifier, e.g. proj_8a2e1c |
name |
string |
Display name shown in the dashboard |
businessModel |
"subscription" | "one-time" | "hybrid" |
Drives default setup and dashboard widgets |
platforms |
{ ios, android, web } |
Boolean per platform — controls which apps you can register |
environments |
("sandbox" | "production")[] |
Always returns both — Crossdeck creates sandbox + production by default |
status |
"draft" | "live" |
A project becomes live when at least one rail is verified and a sandbox purchase passes |
What's next
Now that the project exists and your keys are in hand, set up a client surface and connect a payment rail.
- Add an iOS app — register a bundle ID and get the iOS public key
- Connect Apple — wire the App Store as a verified payment rail
- Install the SDK — drop in the Swift package and send your first event