Skip to content
Tolinku
Tolinku
Sign In Start Free
Use Cases · · 6 min read

Onboarding for Marketplace Apps: Two-Sided Approach

By Tolinku Staff
|
Tolinku e commerce deep linking dashboard screenshot for use cases blog posts

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

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:

  1. Account creation (social login preferred)
  2. Category/interest selection (optional, improves recommendations)
  3. 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:

  1. Account creation
  2. Business information (name, type, category)
  3. First listing (guided)
  4. Payment setup (how they'll get paid)
  5. 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

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 });
}

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;
}

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.

Ready to add deep linking to your app?

Set up Universal Links, App Links, deferred deep linking, and analytics in minutes. Free to start.