Handling Events

Handling actions & events in a billing page

Handling actions

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.

Parameters

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

Events

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.

Tier name & Plan

pre_resubscribe

Triggered when a customer clicks on the resubscribe button, but before the API call is made to resubscribe.

email

service

subscription_id

Subscription

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.

email

service

subscription_id

Subscription

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.

Customer

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.

Sample Redirect on Subscribe

Redirect to a URL after subscription

<div id="billflow-embed"></div>
<script>
  window.billflowSettings = {
    billing_page_id: "B4bD7TzIKxnsZfcgJoFk",
    email: "example@somemail.com",
    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>

Sample Redirect based on Tier Subscribed

Sample Pricing Page redirect for specific tier

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>

Sample Existing User check

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';
					}
				};
			}
		}
	}
}

Sample Track conversions with Google Analytics

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);
    }
  }
};

Sample Coupon restriction logic

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 updated