Billing & invoicing


Automatically generate and send invoices on a defined interval, or manually save them out for further processing through snail mail.

Tax rates

Set your global tax rate or individually apply custom tax rates to different customers to support those based in different countries or jurisdictions.

Recurring charges

Create recurring or "subscription" charges which can be applied to customers on a daily, weekly, monthly, quarterly or yearly basis.

Take payments

Using Direct Debit or SEPA, you can electronically set up mandates with your customer's bank at the touch of a button. Direct Debits with your customers means that you reduce the chances of non-payment, get funds in on time, and with tight integration into Billingbooth, all information is controlled directly from your account.

There are no setup fees, and no due diligence on your customer's financial status, everything is taken care of leaving you to get on with your business - you can be up and running in 5 minutes.

Payments cost just 1% per transaction, capped at £2 maximum. Scale pricing is also available.

Channel ready

Create a hierarchical customer structure, allowing you to set parent customers which take care of the billing of all the customers under their remit. With this flexible model, you can support channel models such as distributors, resellers, dealers and OEMs.

Different pricing tariffs allow your customers to be charged different costs for the same predefined products and services.

Customer access portal

Give your customers the flexibility to be able to check in with their current charges, outstanding issues and other industry-specific data by using our Customer Access portal - a gateway of information for all your customers.

  • A full white label portal solution, allowing customisation of branding, colours and address URL
  • Individual, custom email address for each one of your customers
  • View outstanding and historical invoices, download associated documents
  • Industry-specific functionality such as call detail records, usage statistics and more

Statistics & reporting

Analyse your monthly revenue by retrieving in detail all generated invoices and charges.

Break down your income by product and services and find out which customers are bringing in the the highest percent of turnover, as well as identifying any key dependencies.

All facts and figures are available through our API, and these can be exported out to be used for your own fact findin exercises, as well as integrating into any existing analytical software packages.

Built for integration

Robust, clean APIs that let your developers focus on building smart, headache-free integration into your existing ordering and production systems. A separate sandbox environment allows integration development to occur without interfering with your day-to-day billing operations, and we support any programming language that is HTTP/JSON capable.

curl -H "Content-Type: application/json" 
     -H "Authorization: Basic am9lQGJsb2dncy5jb206cGFzc3dvcmQ=" 
     -X POST 
     -d '{ "name":"premium" }'
using Billingbooth.Api.Client;
var api = new BillingboothApi();
api.Tariffs.Create("premium", false);
JSONObject json = new JSONObject();
json.put("name", "premium");    
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
try {
    HttpPost request = new HttpPost("");
    StringEntity params = new StringEntity(json.toString());
    request.addHeader("content-type", "application/json");
    request.addHeader("authorization", "Basic am9lQGJsb2dncy5jb206cGFzc3dvcmQ=");
} catch (Exception ex) {
    // handle exception
} finally {
$data = array("name" => "premium");
$data_string = json_encode($data);                                                                                   
$ch = curl_init('');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Authorization: Basic am9lQGJsb2dncy5jb206cGFzc3dvcmQ=',
    'Content-Length: ' . strlen($data_string))
$result = curl_exec($ch)
require 'net/http'
uri = URI('')
req =, initheader = {'Content-Type' =>'application/json', 
                            'Authorization' => 'Basic am9lQGJsb2dncy5jb206cGFzc3dvcmQ='})
req.body = {name: 'premium'}.to_json
res = Net::HTTP.start(uri.hostname, uri.port) do |http|
import json
data = { 'name': 'premium' }
req = urllib2.Request('')
req.add_header('Content-Type', 'application/json')
req.add_header('Authorization', 'Basic am9lQGJsb2dncy5jb206cGFzc3dvcmQ=')
response = urllib2.urlopen(req, json.dumps(data))
var http = require('http')
var body = JSON.stringify({
    name: "premium"
var request = new http.ClientRequest({
    hostname: "",
    port: 443,
    path: "/v1/tariffs",
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        "Authorization": "Basic am9lQGJsb2dncy5jb206cGFzc3dvcmQ=",
        "Content-Length": Buffer.byteLength(body)

Instant account signup

Get started with Billingbooth by signing up to a starter account!