Onboarding Part 3 – Payment Activation & Stripe Connect

Complete technical and UX documentation of the Happ payment activation phase, including Stripe Connect Express onboarding, capability validation, webhook handling and system state transitions.
Duration: 22 minutes
Updated: 22/02/2026
Onboarding Part 3 – Payment Activation & Stripe Connect

Tools

  • Government ID for Stripe verification
  • Business address
  • Bank account details
  • Stripe Dashboard access (for platform configuration)

Ingredients

  • Completed identity onboarding
  • Assigned membership tier
  • Valid business details

Step 1: Step 1 – Payment Activation Screen (UX Layer)

Screen header displays Ready to accept payments when you are. Primary CTA: Enable payments. Secondary action: Skip for now. Informational bullets explain: user controls when to accept payments, payments link directly to agreements, Happ charges a fee only on successful transactions, no fixed fees, supports cards, bank transfers and digital wallets, fully secure payments. At this point stripe_account_id is null and payment_activation_status = disabled.

Step 2: Step 2 – Branching Logic (Enable vs Skip)

If Skip for now is selected: payment_activation_status remains disabled. User proceeds to confirmation screen. Payment buttons in workspace remain inactive. If Enable payments is selected: system initiates Stripe Connect Express flow. A Connected Account is either created or retrieved.

Step 3: Step 3 – Connected Account Creation (Stripe Connect Express)

Platform creates a Connected Account of type express. account_links API is used to generate onboarding URL. User is redirected to Stripe-hosted onboarding. Required data collected by Stripe may include: legal name, address, partial government ID, phone, date of birth, industry classification, bank account details for payouts.

Step 4: Step 4 – Capability Requirements

After onboarding, the following Stripe capabilities must be verified as active: capabilities.card_payments = active, capabilities.transfers = active, charges_enabled = true, payouts_enabled = true. If any are inactive, the account cannot receive payments or payouts. System must validate these flags via Stripe API before enabling payment UI.

Step 5: Step 5 – Destination Charges Model

Happ uses Destination Charges, not Direct Charges. Checkout Sessions are created under the platform account without Stripe-Account header. payment_intent_data includes transfer_data[destination] = connected account ID and application_fee_amount representing platform fee. Customer pays platform, Stripe deducts processing fee, application fee is retained by platform, net amount is transferred to connected account.

Step 6: Step 6 – Webhook Configuration and Verification

Platform must register webhook endpoint at /wp-json/happ/v1/stripe/webhook. Required events: checkout.session.completed, checkout.session.expired, payment_intent.succeeded. Webhook signature must be validated using STRIPE_WEBHOOK_SECRET. livemode flag must be verified to prevent test data corruption.

Step 7: Step 7 – Internal Ledger Recording

Upon successful payment, system creates three internal ledger entries: Payment received (gross), Stripe processing fee, Happ platform fee. These are stored in payment_ledger repeater including amount_cents, currency, milestone_id, stripe_id and description. Ledger reflects net balance available for payout.

Step 8: Step 8 – Capability Validation Before Payment Creation

Before generating any Checkout Session, system validates that connected account has active charges_enabled, payouts_enabled and required capabilities. If not valid, Pay Now button must be disabled and user prompted to complete Stripe onboarding.

Step 9: Step 9 – Configuration Requirements

wp-config must contain STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET and HAPP_PLATFORM_FEE_PERCENT. Stripe Dashboard must have Connect enabled and webhook registered. Failure to configure correctly results in inability to create valid payment sessions.

Step 10: Step 10 – Skip Path System State

If payments are skipped: stripe_account_id remains null, payment_activation_status = disabled. Workspace is fully operational for agreements and signatures but payment functionality remains locked until activation occurs.

Step 11: Step 11 – Error States and Troubleshooting

If Checkout throws \\\'Unable to start payment\\\', likely causes include missing stripe_account_id, invalid nonce, incorrect transfer_data destination, missing STRIPE_SECRET_KEY, webhook returning non-200 response or AJAX failure before session creation. These must be validated systematically.

Step 12: Step 12 – Final Activation State

When Stripe Connect is active and capabilities verified: stripe_account_id stored, payment_activation_status = enabled, Pay Now buttons visible on milestones, funds flow correctly using Destination Charges, ledger reflects net balance and user can request payouts.

Frequently Asked Questions

Can the user enable payments after skipping?

Yes. Stripe Connect onboarding can be triggered later from workspace settings.

Why use Destination Charges instead of Direct Charges?

Destination Charges allow the platform to collect application fees at transaction time and maintain consistent processing logic similar to Stripe’s own fee model.

What blocks payment activation?

Inactive Stripe capabilities, incomplete onboarding, missing configuration keys or failed webhook verification.

Does Happ store sensitive banking data?

No. All sensitive identity and banking information is collected and stored securely by Stripe.

This guide documents in full technical depth the Payment Activation phase of the Happ onboarding system. It covers the Enable Payments screen, user branching logic, Stripe Connect Express onboarding, capability verification, webhook validation, fee model behavior and system state transitions.

This phase begins after identity setup and membership assignment are complete. It ends when Stripe Connect is either successfully activated or explicitly skipped.