More paying users.
For your app.
They leave your paywall without paying.
Hazel texts to help them take the next step.
Works with RevenueCat and Stripe. iOS, web, or both.
Illustrative example: Maya leaves Lumen Habits’ $12 monthly paywall. This example uses the default five-minute wait, then Hyzl checks payment. Every wait, message, and step count is customizable in Flow, with up to four steps. Hazel sends a text; Maya replies, pausing the sequence. Maya calls the same number and Hazel answers in the incoming call experience that is rolling out. Maya subscribes, payment is verified, and the remaining recovery texts stop.
One number.
Both directions.
Hazel texts first. When they text back, she answers. When they call, she picks up. One number, both directions.
It’s all right here.
The recovered revenue.
The conversation. Your next move.



A question.
A way forward.
Ask about Lumen Habits, our example app. See how a quick answer can bring someone back to their paywall.
This is a scripted preview. On your number, Hazel uses your app’s own knowledge.Lumen Habits
Your flow,
your timing.
Default sequence example: first text 5 minutes after exit, with follow-ups at 1 and 3 days.
Customize every wait, message, and step count in Flow, with up to 4 steps.
One event.
We’ll take it from there.
Your paywall tells us they left.
We check whether they paid.
Two lines. When the SDK lands.
The Swift SDK is on the way. Connect your app today by sending the paywall event from your server.
import HyzlHyzl.configure(publicKey: "YOUR_PUBLIC_KEY") Hyzl.paywallClosed(userId: user.id, phoneNumber: user.phone)
Future SDK syntax with a placeholder public key. The ingest token stays on your server.
Tell us when they leave.
Send a signed-in person’s paywall exit from your backend. These are copyable examples; nothing is sent from this page.
https://yvklwfalxxeslusmnpwi.supabase.co/functions/v1/paywall-event# Illustrative payload: replace the sample with your own test account.
# Keep this token in your server environment.
curl --request POST 'https://yvklwfalxxeslusmnpwi.supabase.co/functions/v1/paywall-event' \
--max-time 10 \
--header "Authorization: Bearer $HYZL_INGEST_TOKEN" \
--header 'Content-Type: application/json' \
--data '{
"userId": "user_123",
"phoneNumber": "+13105551212",
"email": "person@example.com",
"firstName": "Sam",
"stage": "saw_price",
"consent": {
"attested": true
},
"eventId": "paywall_abc123"
}'// SERVER ONLY. Run in the background after your paywall response.
async function sendHyzlPaywallEvent(user, paywallView) {
const token = process.env.HYZL_INGEST_TOKEN;
if (!token) return { ok: false, retryable: false };
try {
const response = await fetch("https://yvklwfalxxeslusmnpwi.supabase.co/functions/v1/paywall-event", {
method: "POST",
signal: AbortSignal.timeout(10_000),
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
userId: user.id,
phoneNumber: user.phoneE164,
email: user.email,
firstName: user.firstName,
consent: {
attested: user.contactConsent === true,
text: user.contactConsentText,
at: user.contactConsentAt,
},
eventId: paywallView.id,
occurredAt: paywallView.occurredAt,
stage: "saw_price",
}),
});
const ok = response.status === 200 || response.status === 202;
if (!ok) {
const body = await response.json().catch(() => ({}));
console.warn("Hyzl", { status: response.status, error: body.error });
}
return { ok, retryable: response.status >= 500 };
} catch {
// Retry network failures in your background job; never throw into the UI.
return { ok: false, retryable: true };
}
}Set HYZL_INGEST_TOKEN in your server environment. Use your billing provider’s stable user ID and the person’s real consent. Keep the same eventId when retrying.
Your first 50 people
are free.
One person, counted once for 30 days.
No commission on recovered revenue.
Includes 100 people per month.
Then $1 for each additional person.
A person counts once per 30 days.
Your first 50 are a one-time allowance per app. Person 51 starts the monthly plan.
A card is required before going live. No commission on recovered revenue.
Slide to explore, or enter your monthly volume above.
$100 includes 100 people + 400 additional people × $1.
The $100 base is billed in advance. Additional people are billed afterward. This estimate does not create a charge.
More moments
to bring them back.
The next chapters.
All coming soon.
- Coming soon01
Trial ended
Reach out when a trial ends without a subscription.
Day 1Day 7Trial ends Payment check - Coming soon02
Cancelled
Give former subscribers a thoughtful way back.
SubscriptionCancelledA way back, when they’re ready. - Coming soon03
Hosted short links
Short links on your subdomain, with click tracking.
Your short linkgo.yourapp.com/abc - Coming soon04
Swift SDK
Bring event tracking directly into your iOS app.
Native packageimport Hyzl Hyzl.paywallClosed(…) - Coming soon05
Calls when it matters
Hazel calls only when a text shows real intent.
“Can we talk?”Hazel calls
Scroll to explore what’s next.
Your next subscriber is already in your app.
Start with 50 free