A2P SDK
Flows

ISV Sole Prop Flow

ISV Sole Proprietor Flow

For ISVs registering customers in US/Canada who don't have a business Tax ID.

Overview

Steps: 4
Timeline: Profile (72hrs) → Trust Product (hours) → OTP (24hrs) → Campaign (10-15 days)
Limits: 1 campaign per brand, 1 phone per campaign, ~3,000 msgs/day
Prerequisites: Your ISV Primary Customer Profile must be approved first

Who This Is For

  • ISVs sending messages on behalf of customers
  • Customers in US or Canada without a Tax ID
  • Customers need low-volume messaging (~3,000 msgs/day)

ISV Prerequisites

Same as ISV Standard: your ISV Primary Customer Profile must be approved with business_identity: 'isv_reseller_or_partner'.

Step-by-Step

Step 1: Create Starter Profile

import { flows } from '@warp-message/a2p-sdk';

const step1 = await flows.isvSoleProp.step1_createStarterProfile(client, {
  email: 'customer@example.com',
  customerName: 'Jane Doe',
  starterProfile: {
    first_name: 'Jane',
    last_name: 'Doe',
    email: 'customer@example.com',
    phone_number: '+15555554444',
  },
  address: {
    city: 'Seattle',
    customerName: 'Jane Doe',
    isoCountry: 'US',
    postalCode: '98101',
    region: 'WA',
    street: '123 Pine St',
  },
});

Step 2: Create Sole Prop Trust Bundle

const step2 = await flows.isvSoleProp.step2_createSolePropTrustBundle(client, {
  email: 'customer@example.com',
  customerName: 'Jane Doe',
  customerProfileSid: step1.state.customerProfileSid!,
  solePropInfo: {
    first_name: 'Jane',
    last_name: 'Doe',
    email: 'customer@example.com',
    phone_number: '+15555554444',
    mobile_phone_number: '+15555554444',
    brand_name: 'Jane Doe Messaging',
  },
});

Step 3: Register Brand (Triggers OTP)

const step3 = await flows.isvSoleProp.step3_registerBrand(client, {
  customerProfileSid: step1.state.customerProfileSid!,
  trustProductSid: step2.state.trustProductSid!,
});

What happens: OTP SMS sent to customer's mobile_phone_number. Customer must verify within 24 hours.

Critical: Mobile number can only be used 3 times total across ALL vendors.

Step 4: Create Campaign

const step4 = await flows.isvSoleProp.step4_createCampaign(client, {
  brandRegistrationSid: step3.state.brandSid!,
  messagingServiceName: 'Customer Notifications',
  campaign: {
    description: 'Customer notifications',
    messageFlow: 'Users receive order updates',
    messageSamples: [
      'Your order is ready!',
      'Thanks for your order!',
    ],
    usAppToPersonUsecase: 'SOLE_PROPRIETOR', // Required
    hasEmbeddedLinks: false,
    hasEmbeddedPhone: false,
  },
  phoneNumberSid: '+15555555555', // Required (exactly 1)
});

Gotchas

  • OTP 24-hour window — Customer must verify within 24 hours
  • 3-use mobile limit — Mobile number can only be used 3 times across ALL vendors
  • skipAutomaticSecVet always true — Hardcoded in Step 3
  • 1 campaign, 1 phone, ~3K/day — Strict limits
  • 4-step flow — More steps than Direct Sole Prop due to ISV architecture

Next Steps

On this page