Developer FAQ

Cross-cutting questions that don't belong on any single page. For integration-specific troubleshooting, see the "Troubleshooting" section on each integration page.

Is there a faster way to integrate than reading every page?#

Yes, if you use Claude Code. The Zellify MCP gives Claude live context about your funnels and a packaged skill that runs the full cold-start workflow on your codebase: detect the stack, pick the recipe, write the handler, fire a test webhook. Two install commands and a /integrationcheck. The recipes the MCP picks from are the same ones in Integration guides.

What does app_user_id actually identify?#

A single funnel session. Zellify generates one per funnel visit. It persists through registration, payment, and the success page. It becomes the stable identifier you should store alongside user accounts in your system. Email is not reliable for matching; app_user_id is. See app_user_id.

Why does the Registration webhook payload use camelCase while Stripe metadata uses snake_case?#

Historical reason. context.appUserId in the webhook maps to app_user_id in Stripe and Paddle metadata. They are the same value. See app_user_id — camel vs snake case.

Do I need to listen for both checkout.session.completed and invoice.paid in Stripe?#

If you sell one-time products only, checkout.session.completed alone is enough. If you sell subscriptions, subscription schedules, or upsells, listen to both and deduplicate on app_user_id. See Payment events.

Does Zellify have a REST API I can call?#

Not today. Zellify exposes the Registration webhook plus payment-provider events that flow through your own Stripe, Paddle, or Solidgate endpoints. You can also call your own backend from the success page via the Custom Registration Component. If you need a specific API capability, tell us what you are trying to do. See Developers.

How do I build a success page that behaves differently when the page is refreshed?#

tracker.sessionId can be undefined on first render for up to ~200ms. Use the polling hook pattern shown in Custom Registration Component. See Custom registration component — Page refresh support.

Can I get the Stripe Checkout Session ID on the success page?#

Yes. Use useVariable("_stripeCheckoutSessionId") inside a custom component. Paddle equivalents: _paddleCustomerId, _paddleTransactionId. See Custom registration component.