Use the web-interface or API to register for a subscription, then manage your library of databooks and accounts.
Store all your application activity in databook. Perfect for finance, workflow or tracking apps.
Retrieve account balances and open items and provide fully featured accounting ledgers in your application
A subscription consists of a set of databases, each containing multiple libraries, each of which contains several books. Each book has multiple accounts which are configured as single or double entry and either credit or debit as default. Accounts can be aggregated together for reporting using Groups which are scoped at book level. A Library also has associated users each with a set of permissions to access various books, accounts or groups. Activity is recorded within a book, with each activity having one to many lines each associated with a particualr account. While libraries, users, permissions, books and accounts are system defined resources with well-known schemas, activity and lines contain arbitrary, user defined content.
Damien Foggon
CTO of Decoded by Design
Erlich Bachman
CEO of Aviato
Our free subscription is 100% free and does not require credit card information to start. If you would like to upgrade, great. If not, you can cancel your account altogether, or let us mark it as inactive for you to come back to later.
Absolutely. You can switch between our paid plans, or cancel your account altogether, whenever you like. We will adjust any payments accordingly.
No. You get the full featured version of our service completely free with some fair use restrictions. Once you're ready to upgrade, you may choose a plan which suits your needs.
We provide a Direct Debit facility or accept payments from MasterCard, Visa, Visa Debit and American Express. Remember, you do not need to supply card details to get started.
Create Library and Books but define accounts and analysis on demand. Use this approach if you dont know all the system states and accounts ahead of time or if you are aggregating data from a source you dont control.
If your system requires a little bit more control change the book default to strict mode. This requires all accounts to be defined prior to posting an Activity line that references it. You still have schema-free analysis at activity and line detail.
Account balances are usually calculated in an asynchronous background task, this trade-off means posting the original activity is lightning fast but a balance query is slightly slower. If your system requires faster balance queries then switch the book default to real-time. This means balances are calculated synchronously as part of the activity posting action.
There are various SDKs and APIs available to programmatically work with databook. The samples below are shown in C# code and use the databook .NET SDK. The equivalent JSON is also shown if you are using the API direct or via Javascript.
Create the client using code like the following example.
private static string endpointUrl = "[endpoint url]"; private static string authorizationUserId = "[your user id]"; private static string authorizationKey = "[your key]"; //Create a new instance of the DatabookClient var client = new DatabookClient(new Uri(endpointUrl), authorizationUserId, authorizationKey);
A simple double entry example. This example assumes the Library, Book and Accounts have been predefined already.
A Library represents a logical section in your application i.e. tenant or a sub-system
private const string LibraryId = "F895D43A-AC1C-44CA-95FF-74E55FB309F4"; private const string BookId = "SalesLedger"; private const string ReceivablesAccountId = "4000"; private const string SalesAccountId = "5000"; public PostInvoice(string invoiceId, decimal amount) { var posting = new Activity() { name = "Invoice", date = DateTime.Now, ref = invoiceId }; posting.AddLine(SalesAccountId, credit: amount ); posting.AddLine(ReceivablesAccountId, debit: amount);
client.Submit(LibraryId, BookId, posting); }
{ "name": "Invoice", "date": "2014/8/31 12:34:52", "ref": "IN0001212" "lines": [ { "accountId": "4000", "mode": "1", "base": "67.40" }, { "accountId": "5000", "mode": "-1", "base": "67.40" } ] }
The first function starts a particular task. The second function looks for the activity line in the InProgress account so the Finish step can clear this line to indicate the task has transitioned between states.
If clearance was not used the Task would exist in both accounts.
private const string LibraryId = "A3F9FD95-8FC1-4525-A5C4-8C4DE3ADF729"; private const string BookId = "Workflow"; private const string InProgressAccountId = "InProgress"; private const string FinishedAccountId = "Finish";
// public StartTask(string taskId, DateTime startTime) { var stateChange = new Activity() { name = "Start Task", date = startTime, ref = taskId }; stateChange.AddLine(InProgressAccountId, 1)
client.Submit(LibraryId, BookId, stateChange); }
// public FinishTask(string taskId, DateTime finishTime) { // Find the open line matching this task in the InProgress account var openLineId = client.FindOpenItem(taskId, InProgressAccountId)
var stateChange = new Activity() { name = "Finish Task", date = finishTime }; var line = stateChange.AddLine(LibraryId, BookId, FinishedAccountId) line.AddClearance(openLineId);
client.Submit(LibraryId, BookId, stateChange); }
/* Start */ { "name": "Start Task", "date": "2014/8/31 12:34:52", "ref": "TASK0001" "lines": [ { "accountId": "InProgress", "mode": "1", "base": "1" } ] }
/* Open Line Query */ { "lineId": "TASK0001-1", "activityId": "TASK0001", "base": 1 }
/* Finish */ { "name": "Finish Task", "date": "2014/9/14 11:01:36", "ref": "TASK0001" "lines": [ { "accountId": "Finish", "mode": "1", "base": "1" "clearance":[ { "clearanceId": "TASK0001-1" } ] } ] }