• Online Demo
  • 30-day Free Trial

If you’ve been following us for long, you know we talk a lot about invoices. Most recently we did a video about Invoice Customization, and our amazing Invoice Auto-Save feature.

From the beginning Blesta has supported paper invoices. Some clients, typically business clients, want to receive their invoices in the mail. For those clients, Blesta can queue up invoices for print. A staff member logs in, prints them out, stuffs them in envelopes, applies postage and drops them in the mail.

v3 has this ability too, but can optionally do so much more. What if your billing staff didn’t have to print out anything? What if Blesta printed, stuffed, and mailed the invoice by itself? In v3, it essentially can, through Postal Methods. Automating the tangible.

Of course invoices by email have long been widely accepted. However, some companies still prefer to receive invoices in the mail — and, if it means you get paid on time, it’s worth just mailing them the invoice. It’s about meeting them where they are. Whether email, postal mail, or fax, Blesta can send out invoices automatically or with just a couple of clicks.

Yet another reason Blesta is the professional choice.

Isn’t that invoice beautiful? It looks great, and it was sent automatically. Did I mention you can include a return envelope too?

Even though more than 95% of our own invoices are sent out via email, this is a feature I’m personally looking forward to in v3.

On another note, we’re getting close to an alpha release. It’s a private release intended for developers only. If you want to build an extension for v3 for your own use to prepare for the upcoming release, or to sell, you might qualify. Extensions include modules, gateways, plugins, and widgets. If you think you should be included in the alpha, email sales at blesta.com and let’s chat.

Tags: | | |

We’ve talked about payments before, but this week I wanted to go a little more in depth. The way payments are handled and applied by a billing system is important, things need to be accounted for.

Some popular billing systems do really strange things, like..

  1. Create a new invoice when someone attempts to pay multiple open invoices for the sum of those invoices, and when that invoice is paid mark the others as paid.
  2. Allow staff to mark an invoice as paid without recording a transaction.

Simply put, this leads to an accounting nightmare. If an invoice is marked paid, surely there should be a history of how and when that invoice was paid, right? Absolutely! Blesta handles this well in v3, but that’s not a new feature!.. We’ve been accounting for everything since the beginning.

Good billing software will let you pay a single invoice with multiple payments, and pay multiple invoices with a single payment. It should keep track of how much of which payments were applied to which invoices.

In this screenshot you can see that 2 payments were made to a single invoice, and the invoice still isn’t paid in full yet. (Click image to see full size)

 

It all comes down to this: We want to do things right, and we spend the extra time to do it right when others don’t. It’s this way with everything we do. We engage every feature with purpose and forethought. It’s about creating great software whether we sell a thousand copies or a million copies.

Tags: | |

As lead developer, my primary focus has been on designing an efficient system. Since our primary data store (where we make the most reads/writes) is the database, naturally this is where the smallest change can have the biggest impact. I’ve already discussed a number of changes we’ve made to the database system including switching to InnoDB and the use of PDO. The last is the use of unbuffered queries.

Buffered Queries

Buffered queries fetch (e.g. buffer) all records into memory from the database server and automatically close the cursor, allowing other queries to be executed. You might take this for granted. For example, you may have something like:

// What looks like 'nested' queries...
$statment = mysql_query($sql);
while ($data = mysql_fetch_assoc($statment)) {
    $statment2 = mysql_query($sql2);
    while ($data2 = mysql_fetch_assoc($statment2)) {
        ...
    }
}

This might be all fine and dandy, but assume that the first query finds 1,000,000 rows. If each row contained just 1 KB of data, that’s 976 MB of memory consumed! Keep in mind that the memory is consumed at mysql_query(), so it doesn’t matter how many rows you actually fetch (using mysql_fetch_*). Moreover, the memory isn’t freed until the program terminates or you explicitly invoke mysql_free_result().

Unbuffered Queries

Unbuffered queries, on the other hand, are not buffered into memory. Each row remains on the database server until fetched. This can drastically reduce memory consumption on the web server.

The only downside is that you can’t create what look like “nested” queries (as in my example above). But that really isn’t a downside at all, because it forces you to look at better methods for fetching or querying data. Like limiting your result set and fetching all results.

The Record component in Blesta, in conjunction with PDO, make unbuffered query support almost seamless. You really only need to be concerned about closing the cursor if you’re explicitly working with PDOStatement objects.

// Manually work with the statement...
$users = array();
$user_stmt = $this->Record->select()->from("users")->getStatement();
foreach ($user_stmt as $user) {
    $users[] = $user;
}
$user_stmt->closeCursor();
 
// Or just let the Record component to handle it all...
$users = $this->Record->select()->from("users")->fetchAll();

While the benefit of unbuffered queries may not be entirely evident on small data sets, there’s no doubting it improves efficiency. And that’s what creating an enterprise-level application is all about.

Tags: | | | |

In January we announced the availability of a language crowdsourcing project, the Blesta Translator. The goal of the project is to facilitate the translation of Blesta into many languages, and to ship these languages with Blesta, starting with version 3.

This week we made a few additional changes live, and they are –

  1. Added Nederlands, NL (nl_nl) to the list of available languages
  2. Added a machine translation (Google) for reference
  3. Added “In Order” and “For Confirmation” translation methods
  4. Added some context to language strings including terms, filename, and type

#2 Machine Translation

The machine translation is available for all translation methods, “Random”, “In Order”, and “For Confirmation”. By default it is not displayed, but will be shown when a link is clicked. The idea is that it may be useful to see the Google translation, but that it shouldn’t be relied on, or copied without forethought.

#3 Additional Translation Methods

The goal of the translator isn’t simply to get translations, but to get good translations.

When different people translate a term identically, it has a higher weight than terms that are only translated by one person. Such terms become “confirmed”, and are trusted to be more accurate. So, the “For Confirmation” translation method displays the best possible translations by other people. One of these translations can be accepted by clicking on it. Alternatively a different translation may be entered like normal.

The “In Order” translation method is pretty self-explanatory, terms are given in alphabetical order with the goal of completing a translation. This means that some terms may be skipped initially until the translation is completed as a whole. Once the translation is completed, terms that were intentionally skipped will be presented.

The end goal is to make several translations available. A version translated wholly by a specific person, a confirmed only translation that may be missing some terms (missing terms are shown in the default language), or a complete translation consisting of confirmed only or both confirmed and unconfirmed terms. The latter are the ones we will include with Blesta by default, but all will be available for direct download in the future.

Thanks for reading! If you know another language, please sign-up and contribute

Video next week? Probably.

Tags: | | |

Part of my job in the development of v3 is to take a step back and consider how each and every feature in Blesta can be improved over previous versions. Lots of thought, and many discussions surround even the simplest details of both the external and internal workings of Blesta, the visible and invisible.

Today I want to compare and contrast, and reveal how we handle automation in v3.

v2

Version 2 has a Cron Status & Setup page, under Settings > API/Cron Settings. The intent of this page is to show you when the cron last ran, how to set up your cron, and provide a method by which to run the cron manually. We were the first to secure the cron with a key, preventing it from being run by unauthorized users. Overall very basic, and it works pretty well.

v3

Version 3 does everything mentioned above, but in a simpler, more intuitive way — with the addition of being able to update the cron key right here. This key is now separate from the API key, which it shared in v2.

This is a good replacement for v2, and we could have stopped there.. but like I said in the opening, a lot of thought, many discussions.. and I’ll add, a lot of planning and development time goes into each and every feature.

One thing that bothers me a lot with v2 is that I can’t set exactly when I want a particular task to execute. Some tasks run once daily, some run every x minutes. The daily tasks run every day at midnight, and for the most part, the more frequent ones are at the mercy of how often the cron is scheduled to run.

This creates some issues, first of all is that midnight emails probably don’t have the highest read rate. Secondly, midnight account suspensions for non-payment result in emergency tickets at a time when most of your staff is sleeping or in the shower.

So, the actual cron job should run every 5 minutes, and you should be able to schedule when each task runs. Right? We think so. It’s almost common sense, but nobody has done it until now.


Above is what Invoice Creation and Auto Debit tasks look like. In this case, we have them both set up to run at 2pm daily. These are 2 tasks out of more than a dozen.

What about more frequent tasks?

This option illustrates how paid pending services, such as exist when a new order is placed, are provisioned.. every 5 minutes.

In addition to being able to schedule each task, they can also be explicitly disabled.

Developer Candy: Plugins can register automation tasks.

Another important thing to note is that all the times are in your local timezone — or whatever you set your timezone to be, regardless of the server time. Additionally, all dates and times in Blesta everywhere are stored in the database as and converted from UTC, which means you can change your timezone without affecting the stored value.

The default options will be perfect for most people, and there will be no real necessity to dig in and tweak these around.. Really, it’s not that important, but I wanted to show you for two reasons. 1. It’s a neat, practical feature and more importantly.. 2. It gives you a glimpse into how we work, how detail oriented we are, and how serious we are when it comes to usability.

Hope you have a nice weekend. Speaking of weekends…

Nerd Alert: If you play a game called Minecraft, we’ve got a Minecraft server up and running at 74.80.216.146. Come join us, some of our friends, and some of their friends as we build random stuff. HostMaster = Me, Awesomisitist = Tyson, Codelphious = Cody.

Tags: | | |

Cody posted an article last week on Software Licensing, which I found amazing. Be sure to check it out if you haven’t already.

This week I’ve got another video, and it’s all about options available for invoices. There are many improvements in v3 when it comes to invoices, so I thought you might like to see what we’ve got cookin.

  1. Two all newly designed invoice templates available.
  2. Invoice formats are now available. Add a prefix, suffix, and/or the year to invoice numbers.
  3. Set or change the next invoice number anytime.
  4. Have invoice numbers increment 1 at a time or in multiples, ie Invoice # 5, 7, 9.
  5. Pad invoices to a specific length, ie Invoice # 00001, or xxxx1.
  6. Add your logo, a background image, and company name and address to invoices.
  7. US Letter, and A4 paper sizes now supported.
  8. A PAID watermark can now be displayed on paid invoices.

Invoices are flexible yet simple, fully internationalized, clean, and they print beautifully. I’m really happy with the changes we’ve made to invoices since 2.x and I hope you are too!

The video is below, as usual you can make the video full screen, and be sure to turn on your sound.

 

Tags: | | | |

I got hit with something last week, not quite back to 100%, but almost. I hope you are faring better than me, it’s never fun being sick.

This week I wanted to show you the coupon system. Early on I assumed we would implement the coupon system as part of the order plugin. Instead we implemented the coupon system as a core feature. The reason for this was simple: The introduction of recurring coupons.

The coupon system now supports the following:

  1. Recurring & one time coupons.
  2. Inclusive & exclusive package rules.
  3. Value & percent discounts, in multiple currencies.
  4. Start date, end date, and quantity limitations.

Recurring coupons were highly requested. Often times multiple packages would have to be created to bill clients custom prices. This has been resolved in two ways with v3 — recurring invoices, and recurring coupons. Massive numbers of packages are a thing of the past.

It’s now possible to have a term or quantity based promotion for the life of the service. If the coupon is recurring, Blesta will automatically apply the coupon to the invoice when the service renews. In addition to that, coupons may apply to any packages assigned to the coupon at order, or may require that all packages assigned to the coupon are ordered at the same time. (Get 10% off when ordering Bronze Hosting and a Domain Name, for example).

The video is below, as usual you can make the video full screen, and be sure to turn on your sound. I think I sound normal again. :D

 

Tags: | | | |

It’s been a while since I posted a video, I missed you. So, today — a new video, about the Staff Calendar. Staff Calendars feature the following:

  1. Mini dashboard calendar with badges that indicate the number of events for each day.
  2. Full size monthly, weekly, and daily calendar.
  3. Shared events, staff members can share events with everyone on their team, or keep them private.
  4. Multi-day, whole day, and time based events are supported.
  5. Intuitive drag-n-drop interface to create and edit events.

We hope you like the calendar, I know our team will be using it! Developer tidbit: Yes, you’ll be able to add events to the calendar from your custom plugin. I know people are going to ask so I’ll tell you.. recurring events are planned for a future release.

The video is below, as usual you can make the video full screen, and be sure to turn on your sound.

 

Tags: | | |

A lot of effort has gone into designing and interfacing with the database in version 3, so I thought I’d share a little insight into some of the improvements we’ve made over version 2.

We’ve beefed up the database by making use of transactions, which allow us to add, edit, or remove items from the database with the ability to undo those changes should something go wrong. Because of this we’ve made the switch from a MyISAM storage engine to InnoDB (the default for MySQL as of version 5.5), making Blesta ACID-ic.

Another major improvement is the use of UTF8 collation, which will now allow users to more easily search the database in their native tongue as well as input and output data without conversion. This is a huge improvement for developers, and we are all about developers with version 3.

Speaking of developers, another great improvement is the introduction of the Record component. The record component is a database access object that creates queries using a series of method calls. Never again will you have to worry about which comes first, GROUP BY or ORDER BY.

In addition, the Record component uses the PDO library, making queries safe and secure. But that’s not the only benefit of PDO. Can we say “multi-database support”, as in MSSQL, PostgreSQL, and others? Well, no, not at the moment, but that’s definitely a possibility.

From the Developer Documentation:

Tags: | | | |

One thing we haven’t really talked about much is the client area. We have a good excuse: The vast majority of functionality is built into the staff/admin interface. But, the client experience is important too, arguably much more-so.

In v2.x the client interface is identical in overall design to the admin interface with a slight color change. In v3 we went a different direction. While there are similarities between the client interface and the admin interface they are completely different designs and you log into them independently.

Important notes to make about the client area in v3..

  1. The client interface has a new, clean & unique design.
  2. The client interface can be easily themed & integrated into an existing site.
  3. The client interface now consists of a Portal, Account Management, and Order System.
  4. The client interface is more intuitive and user friendly, and takes advantage of a lot of new features introduced in v3.
  5. Developers will be happy, Plugins can affect the client areas too.
  6. Mystery feature — yes I just did that, more details in a future post.

Portal, Account Management, and Order System. All tied together, all themed the same, all easily integrated into an existing site design.

I can’t not leak some eye candy in a post, so above is a cropped segment of the default order template. I hope you agree, it’s a nice and clean design, yet fairly neutral in terms of color. Though the header is not shown here, it does have color and the color is easily changed.

There’s a lot more I could show you, but we’ll cover more in a future post. And to all a good weekend!

Tags: | | | | |

We’ve shown you a fair amount of the staff interface, but I want to show you the staff login page today. Overall this video touches on three things..

  1. Staff Login Page: This is a first, no one outside our team has seen this login page before now.
  2. Two-Factor Authentication: This was originally developed for v3, then back-ported to 2.5.
  3. Resource Preservation: Session expire? Blesta remembers where you were headed.

The staff login page has previously never been shown, although I designed it before much of the interface. Two-Factor Authentication was originally developed early on for v3, and then back-ported to 2.5. As far as we know, no one else supports two-factor authentication, making Blesta uniquely secure. We don’t blame them though, it took plenty of R&D and most solutions are proprietary. Resource preservation is just a fancy term we coined to say that Blesta remembers where you were going, and takes you back there if your session expires and you get logged out and login again.

The video is below, as usual you can make the video full screen, and be sure to turn on your sound.

Note: Cody tells me, and I realized after that OATH is pronounced “oath”, not “oh-auth”, which is something completely different.

 

Tags: | | | | | | |

So, let’s keep it real. I didn’t have the time to make a video this week. I’ve been doing a lot of graphic design work on Blesta, some awesome stuff you’ll get to see soon. But that doesn’t mean I can’t share something, right?

Plugins. Are. Amazing. Plugins can do a lot, we’ve talked about them before in passing while describing other features. Plugins can register widgets on the Dashboard, on the Billing Overview, on the Client Profile. Plugins can create entirely new pages, with new functionality, with their own nav links. Plugins can register themselves into the ACL. Plugins can create their own email templates. Plugins are mini-applications. Plugins are POWERFUL.

I know people are going to shock us with what they develop for Blesta using the plugin system. I can’t wait to be blown away.

This post is the tip of the tip of the iceburg, we will have a lot more to say about plugins as we get closer to release.

Oh yeah, plugins can be installed, and uninstalled, upgraded and managed. Here’s what the installed plugins window looks like. These are all plugins that will come pre-installed with Blesta (there will be more too, don’t worry). These ones create widgets on the Dashboard.. and since we wrote them, they got slapped with the Blesta logo. Slap your logo on your own plugin!

 

Maybe a video next week? We’ll see!

Tags: | | |

I hope you’ve had a chance to check out the Blesta Translator that I posted about and that we released last week. The previous week Cody posted a developer commentary video on our RESTful API that you may want to check out as well.

This week’s video is about themes. We mentioned themes briefly a while back, but here it is in action. You can do the following with themes:

  1. Select from different color themes that are included with Blesta.
  2. Create and save your own color themes, and fine tune colors to match your brand.
  3. Use your own logo, rather than the Blesta logo.

In the future we may add additional options that affect the direction and style of gradients, add additional options, and provide a way to share themes.

The video is below, as usual you can make the video full screen, and be sure to turn on your sound.

 

Tags: | |

 

Blesta is in use in well more than 50 countries, and our friends abroad speak many different and wonderful languages. Blesta has always supported multi-language and some of our users have made their translations available to the community, but it has only ever shipped with English support and translations have been spotty at best. That’s all about to change.

Today we announce the availability of Blesta Translator, a collaborative, community driven effort to provide full, accurate, and up to date translations in as many languages as possible.

The success of this project depends on you. If you are fluent in another language and would like to contribute to the translation of Blesta into your language all you need to do is sign up and start. Contribute as little or as much as you like as often as you like. New and updated language will be added to the translator in advance of software releases and it’s our hope that the new language will be translated in advance of and ship with official releases.

While this is still a beta version, we will be adding a few new features in the coming weeks. Ultimately a daily snapshot of translations will be available for download. We realize this is a continual effort and nobody should have to wait for the next Blesta release to take advantage of the latest translations. Partial translations will fallback to English. Additional stats, graphs, and context for translations will come as well.

So, what are you waiting for? Head on over to translate.blesta.com and get started! You’ll be translating version 3.0.0_dev. While it’s not complete, now’s a good time to get a head start! Contributors are given credit for their efforts.

And, of course, if you have a suggestion to make this tool better please let us know.

Here are the languages currently available for translation:

  1. العربية, SA (ar_sa)
  2. Deutsch, DE (de_de)
  3. Ελληνικά, GR (el_gr)
  4. English, UK (en_uk)
  5. Español, ES (es_es)
  6. français, FR (fr_fr)
  7. עברית, IL (he_il)
  8. italiano, IT (it_it)
  9. 日本語, JP (ja_jp)
  10. polski, PL (pl_pl)
  11. português, PT (pt_pt)
  12. Română, RO (ro_ro)
  13. svenska, SE (sv_se)
  14. 中文, CN (zh_cn)

Tags: | | | |

In this developer commentary, I give a behind the scenes look at the API in version 3.

What we’ve done is create a controller to make available all of the various models in a RESTful manner, using the four primary HTTP verbs (GET, POST, PUT, DELETE). All this controller needs to do is handle parameter passing and output formatting, which we’ve done here in just 342 lines. Available output formats are JSON, XML, and PHP serialization, but more may be added in the future.

The API supports an unlimited number of users, so you can delegate users for specific tasks. In addition, the API may be extended by plugins. The format for those requests is /api/pluginName.modelName/method.format.

Currently the API supports HTTP Basic authentication, but we’re looking to add Digest authentication in the future as well. In addition, we’ve added command line interface (CLI) support which is bound to make API development easier for you programmers out there.

Click the icon in the bottom right of the video player to go full screen.

 

Tags: | | | | | |