Hello, Developers!


Trigger changes to any external system as billing events occur.

How they work

Webhooks allow you to trigger changes on external systems as events on your SnapBill account. Every action can be delivered to your system as a webhook and can help maintain a tight integration between two systems.

Webhook delivery uses an “atleast once” model, and will keep retrying until your server responds with an HTTP OKAY (2XX) response code. If your destination url fails for longer than a week, we will send a warning email and subsequently disable the webhook if the problem is not resolved.

The webhook payload is generated on delivery. This means that any changes between when the event happens and when the webhook is delivered to you will be reflected in the data we send. It is entirely possible that an event describing an invoice state change to paid will include an invoice object whose state is cancelled (if the invoice is cancelled before we deliver the webhook.)

Setting up webhooks

Webhooks can be enabled in SnapBill inside our Apps section. Once enabled it is trivial to add new webhooks and view recent actions from our Setup section.

The easiest way to test out webhooks is with http://requestb.in and http://jsbeautifier.org/. Simply create a new bin on the requestb.in site, and enter the URL they give you in SnapBill. Once a webhook has been sent through, you should see it if you refresh the requestb.in page. The data comes through in an ugly format, but if you paste the entire 'body' into jsbeautifier, it will clean it up for you.

// Pull the JSON body out of the post
$input = json_decode(file_get_contents('php://input'), True);

// Take out the unique id of this webhook delivery
// This (or $input['body']['id']) can be used to ensure you only act on each event once
$uuid = $input['uuid'];

// Only take invoice state updates
if ($input['body']['path'] == '/invoice/update/state') {
  // Check that the invoice was marked as paid
  if ($input['body']['details'] == 'paid') {
    // Pull out the invoice number and total cents
    $number = $input['body']['invoice']['number'];
    $total_cents = $input['body']['invoice']['total_cents'];

    /*** Do something here. ***/

import flask
app = flask.Flask(__name__)
@app.route('/webhook', methods=['POST'])
def webhook():
  body = flask.request.json['body']
  # Check that we have gotten a new client
  if body['path'] == '/client/add':
    client_id = body['client']['id']
    name = body['client']['name']
    # Just print out to stdin (you can be more creative)
    print 'Client #%d added: %s' % (client_id, name)

Try out these snippets!
Need help? Just ask.

Visit our documentation to learn more and   TRY OUR LIVE DEMO NOW