Handling Events
Handling actions & events in a billing page
The handleResponse function can be used to update user information in your database regarding the customers subscription information, to do redirects on signup, or present notifications.
handleResponse will pass a variable which contains the following properties
Variable Name | Description |
event | The name of the event that occurred |
response | The response object returned from Stripe |
Event Name | Description | Response Object |
pre_load | First thing run after the embed javascript loads, before any API calls have been made. Use to inject React components or tell when the embed has loaded. | Embed Configuration |
post_load | billingData: null — means the subscription portal is not loaded yet billingData: {no_user: true} — means the current email is not a customer productData: null — means pricing (products) are not loaded yet productData: [ … ] — means the pricing (products) are loaded | billingData currentConfig productData |
pre_subscribe | This event allows you to do some actions before creating a subscription. For example, you can use it for checking if a user exists in your system. Throwing an error here will prevent Billflow from creating a subscription. | email service tier |
create_subscription | Triggered when a subscription is created from a billing page. Use this event to update your user system with the Stripe subscription ID and tier. Learn more on the install guide. | |
pre_change_plan | Triggered before when a user clicks on the confirm button, but before the API call is made to change plan. | email service tier |
change_plan | Triggered when a user upgrades or downgrades using the Plan Picker. You can use this to update their tier information or create notifications. | |
select_plan | Triggered when a user selects a plan from the pricing page or plan picker. Use this to redirect to other pages or forms to create custom on-boarding flows. | |
pre_resubscribe | Triggered when a customer clicks on the resubscribe button, but before the API call is made to resubscribe. | |
resubscribe | Triggered when a customer resubscribes from the portal. This occurs when a customer was cancelled, they come back to the portal and choose to resubscribe to a plan. Use this event to update your user system with the Stripe subscription ID and tier. | |
pre_cancel | Triggered when a customer clicks on the cancellation button. Use this to create a custom cancellation flow. | |
cancel_subscription | Triggered when a customer requests a cancellation. Use this event to update subscription status for a user. | |
pre_change_card | Triggered when a customer clicks on change card button, but before the API call is made to change card. | |
update_card | Triggered when a customer updates their Credit Card information or enters it for the first time. Use for presenting notifications to the user. | |
request_error | Triggered when any of our API requests failed. User for custom handling of any request failures. | The Request Error |
pre_update_quantity | Triggered before quantity is updated on a subscription from the customer portal | Price quantity subscription_id |
update_quantity | Triggered after a quantity has been updated from the customer portal | |
add_coupon | Triggered after a coupon has been added. Can be used to create custom coupon restriction logic. |
Redirect to a URL after subscription
<div id="billflow-embed"></div>
<script>
window.billflowSettings = {
billing_page_id: "B4bD7TzIKxnsZfcgJoFk",
email: "[email protected]",
handleResponse: async function(payload) {
console.log("Event ", payload.event);
console.log("Response Object ", payload.response);
//Redirect on Signup example
if (payload.event == "create_subscription") {
window.location.href = "https://google.com";
}
}
};
(function() {
var s = document.createElement('script');
s.src = 'https://js.billflow.io/billflow-embed.js';
s.async = true;
s.type = 'text/javascript';
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
})();
</script>
Redirect to a URL after subscription
<div id="billflow-embed"></div>
<script>
window.billflowSettings = {
"billing_page_id": "B4bD7TzIKxnsZfcgJoFk",
"loader": "2",
handleResponse: async function(payload) {
let event = payload.event;
let response = payload.response;
//Redirect for free plan (update tiername check to yours)
if (event == "select_plan") {
let tierName = response.tier.tierName;
if (tierName == "Starter") {
window.location.href = "https://google.com"; //CHANGE ME
}
}
}
};
(function() {
var s = document.createElement('script');
s.src = 'https://js.billflow.io/billflow-embed.js';
s.async = true;
s.type = 'text/javascript';
var x = document.getElementsByTagName('script')[0];
x.parentNode.insertBefore(s, x);
})();
</script>
Skip subscription creation if a user already exists
window.billflowSettings = {
handleResponse: async function(payload) {
// Implement pre subscribe hook example
let { event, response } = payload;
if (event === 'pre_subscribe') {
// implement your logic for checking user exist in your system
let { email, service, tier } = response;
let exists = true;
// throw an error for billflow to stop the subscribe action.
if (exists) {
throw {
// displays an error message in servicebot
message: 'User already exist, please login.',
callback: () => {
// call back to redirect or other actions you want to take.
window.location = '/login';
}
};
}
}
}
}
Use GA to track signups
window.billflowSettings = {
handleResponse: async function (payload) {
let { event, response } = payload;
console.log("Event ", event);
console.log("Response Object ", response); //Send record to google
if (payload.event == "create_subscription") {
let { email, seravice, tier } = response;
var eventData = {
event: "subscriptionPurchased",
email: email
};
window.dataLayer.push(eventData);
}
}
};
Use to prevent a specific coupon based on logic
window.billflowSettings = {
"billing_page_id": "MsPV2xxqNmPUjJVOEnu8",
"handleResponse": function handleResponse(response) {
// your code here
console.log("response", response)
if (response.event === "add_coupon") {
const coupon_id = response.response.coupon.id
const bad_coupon = 'BAD'
if (coupon_id == bad_coupon) {
throw ({
response: {
data: {
custom_error: "Custom Coupon Error~"
}
}
})
}
}
}
};
Last modified 2yr ago