Marketplace apps have a unique onboarding challenge: two different user types with different goals, different activation events, and different definitions of value. A buyer wants to find and purchase something. A seller wants to list something and get sales. The onboarding must route each user to the right experience quickly, and deep links often carry the context to determine which side of the marketplace the user belongs to.
For freemium onboarding, see Onboarding for Freemium Apps: Free to Paid Journey. For personalization, see Personalized Onboarding Flows with Deep Link Data. For general onboarding principles, see Onboarding Best Practices for Mobile Apps in 2026.
Role Detection and Routing
Deep Link-Based Role Detection
Often, the deep link itself reveals the user's role. For a deeper look at deep linking in marketplace contexts, see Marketplace App Deep Links: Connecting Buyers and Sellers.
| Link Source | Likely Role | How to Tell |
|---|---|---|
| Product listing shared | Buyer | Path: /product/{id} |
| Seller referral | Seller | Params: role=seller |
| Category ad | Buyer | Params: category=electronics |
| "Start selling" campaign | Seller | Path: /sell |
| Buyer referral | Buyer | Params: ref=buyer_123 |
| Partner integration | Seller | Params: partner=shopify |
async function detectRole() {
const deferred = await Tolinku.checkDeferredLink();
if (deferred) {
const params = deferred.params;
const path = deferred.path;
if (params.role === 'seller' || path.startsWith('/sell')) {
return 'seller';
}
if (path.startsWith('/product/') || params.category) {
return 'buyer';
}
if (params.partner) {
return 'seller'; // Partner integrations are typically seller-facing
}
}
return null; // Unknown, ask the user
}
Role Selection Screen
When the deep link doesn't indicate the role, ask:
function RoleSelection({ onSelect }) {
return (
<Screen>
<Heading>How do you want to use [App]?</Heading>
<RoleCard
title="I want to buy"
description="Browse products, compare prices, and purchase from sellers."
icon="shopping-bag"
onSelect={() => onSelect('buyer')}
/>
<RoleCard
title="I want to sell"
description="List your products and reach thousands of buyers."
icon="store"
onSelect={() => onSelect('seller')}
/>
<Text style={styles.note}>
You can switch anytime in Settings.
</Text>
</Screen>
);
}
Buyer Onboarding
Flow
Buyer onboarding should be minimal. Buyers want to browse, not fill out forms:
- Account creation (social login preferred)
- Category/interest selection (optional, improves recommendations)
- Browse products (immediate value)
function BuyerOnboarding({ intent }) {
const [step, setStep] = useState(0);
const steps = [
<QuickSignup />,
<InterestPicker
suggested={intent.category}
onComplete={(interests) => {
saveInterests(interests);
setStep(2);
}}
onSkip={() => setStep(2)}
/>,
];
if (step >= steps.length) {
// Onboarding complete, go to browsing
if (intent.productId) {
return <Redirect to={`/product/${intent.productId}`} />;
}
return <Redirect to="/browse" />;
}
return steps[step];
}
Buyer Activation Event
The buyer activation event depends on your marketplace model:
| Marketplace Type | Activation Event | Why |
|---|---|---|
| E-commerce | First purchase | Revenue-generating action |
| Service marketplace | First booking/request | Initiates the transaction |
| Rental marketplace | First inquiry | Shows serious intent |
| Content marketplace | First download/view of paid content | Monetization touchpoint |
Seller Onboarding
Flow
Seller onboarding is necessarily longer because sellers need to set up their presence:
- Account creation
- Business information (name, type, category)
- First listing (guided)
- Payment setup (how they'll get paid)
- Verification (if required)
function SellerOnboarding({ intent }) {
const [step, setStep] = useState(0);
const steps = [
<AccountCreation context="seller" />,
<BusinessProfile
partnerData={intent.partner} // Pre-fill from partner integration
/>,
<FirstListingGuide />,
<PaymentSetup />,
<VerificationUpload />,
];
return (
<View>
<ProgressBar current={step} total={steps.length} />
{steps[step]}
<NextButton
onPress={() => {
if (step < steps.length - 1) setStep(step + 1);
else completeSellerOnboarding();
}}
text={step === steps.length - 1 ? 'Finish Setup' : 'Next'}
/>
</View>
);
}
Guided First Listing
The first listing is the seller's activation event. Make it as easy as possible:
function FirstListingGuide() {
return (
<View>
<Heading>Create your first listing</Heading>
<Text>This is the most important step. Let's walk through it together.</Text>
<Form>
<PhotoUpload
label="Add photos"
hint="Listings with 3+ photos sell 2x faster"
minPhotos={1}
maxPhotos={10}
/>
<Input label="Title" placeholder="What are you selling?" />
<TextArea
label="Description"
placeholder="Describe your item..."
hint="Include condition, size, brand, and any defects"
/>
<PriceInput
label="Price"
suggestedPrice={getSuggestedPrice()} // Based on similar items
/>
<CategoryPicker label="Category" />
</Form>
<Button type="submit">Create Listing</Button>
</View>
);
}
Seller Activation Event
| Metric | Definition | Target |
|---|---|---|
| First listing created | Seller publishes at least one item | Within first session |
| First sale | Seller receives first order | Within first 30 days |
| Repeat listing | Seller creates 2+ listings | Within first 7 days |
Deep Links for Marketplace Onboarding
Product Deep Links (Buyer Path)
When a buyer taps a product deep link and doesn't have the app:
async function handleProductDeepLink(productId) {
const user = await getCurrentUser();
if (user === null) {
// New user: show product preview, then signup
navigation.navigate('ProductPreview', {
productId,
showSignupPrompt: true,
});
return;
}
// Existing user: go directly to product
navigation.navigate('ProductDetail', { productId });
}
Seller Invite Deep Links
Existing sellers inviting new sellers:
async function createSellerInviteLink(seller) {
const link = await Tolinku.createLink({
path: '/sell',
params: {
ref: seller.id,
role: 'seller',
category: seller.primaryCategory,
},
ogTitle: `${seller.storeName} invites you to sell on [App]`,
ogDescription: 'Join thousands of sellers. List your first item in minutes.',
});
return link.url;
}
Buyer-to-Seller Conversion Links
For buyers who might also want to sell:
function SellPrompt({ user }) {
if (user.role === 'seller') return null;
if (user.purchaseCount < 3) return null; // Only show to engaged buyers
return (
<Banner>
<Text>Have something to sell? List it in 2 minutes.</Text>
<Button
onPress={() => navigation.navigate('SellerOnboarding')}
size="small"
>
Start Selling
</Button>
</Banner>
);
}
Handling Both Sides
Dual-Role Users
Many marketplace users are both buyers and sellers. Handle role switching:
function RoleSwitcher({ currentRole, onSwitch }) {
return (
<SegmentedControl
options={[
{ label: 'Buying', value: 'buyer' },
{ label: 'Selling', value: 'seller' },
]}
selected={currentRole}
onChange={onSwitch}
/>
);
}
Onboarding for Dual-Role Users
If a buyer wants to start selling, they shouldn't go through full onboarding again:
function BuyerToSellerOnboarding({ user }) {
// Skip account creation (they already have an account)
// Skip verification if already verified as buyer
const steps = [
<BusinessProfile />,
<FirstListingGuide />,
user.paymentVerified === false ? <PaymentSetup /> : null,
].filter(Boolean);
return (
<View>
<Heading>Set up your seller profile</Heading>
<Text>You're already a member. Just a few more steps to start selling.</Text>
{steps[currentStep]}
</View>
);
}
Measuring Marketplace Onboarding
Buyer Metrics
| Metric | Definition | Benchmark |
|---|---|---|
| Signup completion | Account created / App opened | 50-65% |
| First browse | Viewed 3+ products / Signed up | 70-85% |
| First purchase | Purchased / Signed up | 5-15% (D7) |
| Repeat purchase | 2+ purchases / First purchase | 30-50% (D30) |
Seller Metrics
| Metric | Definition | Benchmark |
|---|---|---|
| Onboarding completion | Finished setup / Started setup | 40-60% |
| First listing | Listed 1+ items / Completed onboarding | 60-80% |
| First sale | Received order / Listed items | 20-40% (D30) |
| Listing quality score | Photos + description + pricing | > 70/100 |
Two-Sided Health
The marketplace is only as healthy as both sides. Track the balance:
async function marketplaceHealth() {
const buyers = await countActiveUsers({ role: 'buyer', period: '30d' });
const sellers = await countActiveUsers({ role: 'seller', period: '30d' });
const listings = await countActiveListings();
const transactions = await countTransactions({ period: '30d' });
return {
buyerToSellerRatio: (buyers / sellers).toFixed(1),
listingsPerSeller: (listings / sellers).toFixed(1),
transactionsPerBuyer: (transactions / buyers).toFixed(2),
liquidityRate: (transactions / listings * 100).toFixed(1) + '%',
};
}
A healthy marketplace typically has a 5-10:1 buyer-to-seller ratio. If onboarding is producing too many sellers and not enough buyers (or vice versa), adjust your acquisition channels and onboarding emphasis. Tailoring the experience based on user context can improve these ratios; see Personalized Onboarding Flows with Deep Link Data for implementation patterns.
For deep linking features, see Tolinku deep linking. For onboarding use cases, see the onboarding documentation.
Get deep linking tips in your inbox
One email per week. No spam.