Integrating with QuickBooks Online Using Node.js

With the new year here and the holiday rush behind us I have a month (before tax season arrives) to dedicate to the one project that we see as the holy grail for a small business like ours: Quickbooks Integration.

I, being the nerd that I am, always wanted to integrate accounting with our order management system. Emi, who knows that some things are better outsourced always said: “no way.” The process of moving transaction to the desktop version of QuickBooks was “automated” by exporting customer and order data to “.IIF” files and then importing them into QuickBooks. This worked fine for invoices, but sales receipts would not allow us to put our order number in the number field in QuickBooks. This meant that after the import I would have to move the order number from another field where we sent it temporarily to the number field. A real time saver! Oh, and another thing. Our special sales tax codes for our city and county? Yes, they would come through but not actually select the correct code. So we had to go through every single invoice and sales receipt and select the correct tax codes for orders in Campbell, or in Santa Clara County.

I am in charge of importing orders. When I get busy and I can’t do that for a while I have months worth of orders to import. Invariably, checking for the correctness of the imported data would put me to sleep, or close to it. Let’s face it: I really hated it, and really wished that I could develop my own accounting application… “the data is already there!”

In my previous post I talked about how I had been watching the development of QuickBooks Online and always had to pass on it because it didn’t support inventory management. But that is no longer the case and even multi-currency support is in the works.

I am a full stack JavaScript developer. I don’t code in PHP, Java, or .NET, which are the server languages that are well documented on the QuickBooks Developer page. I have to use Node.js to accomplish this. I struggled to figure out how to make calls to the API that were not documented in the example that I had. Luckily QuickBooks support sent me a link that changed that and it was smooth sailing since.

Now I’m testing my cloud application to send (at a click of a button) customers, sales receipts, and invoices to QuickBooks Online. I hope to be able to go live this week in time for processing sales tax reporting. If I don’t I will be very, VERY sorry!

I hope that this story can help some other business owner out there who is considering a solution to problems like ours. I will let you know how it goes next week!

Switching to Quickbooks Online and Node.js

Quickbooks Online
Quickbooks Online
We are busy switching to Quickbooks Online.

As a business owner who has a long past and present as a web developer, I watch the tools that we use and the latest technological trends closely. I don’t like to use cutting edge technology, but I do like to make the jump as soon as there is a business case for it and a clear path that will enable a successful transition.

We have been looking at Quickbooks online for a very long time because I have been dreaming about an accounting system tied to our back-end system forever. Emi, on the other hand, has been longing for the ability to view up-to-date inventory information from anywhere. The problem always was that QuickBooks Online did not support inventory, and the few accounting SaaS companies that did provide it charged a lot for it. It felt that inventory was not on the radar of many of these companies who, obviously, chose the software or service industries as their target markets.

When we finally found out that QuickBooks Online offered inventory we were still stopped by the other hurdle: the ability to support multiple currencies. Last summer this was not supported but it was on the radar. Finally, this fall it arrived, and we were ready to jump on board, except for one tiny detail: if your QuickBooks company file includes multi-currency you won’t be able to export it to import it in QuickBooks online. This really royally stunk and gave us pause, but we decided to go ahead and not to ever look back.

As to integrating our back-end with QuickBooks Online’s it is going to be fairly easy. The API seems well developed although, by reading a few forums, there are some scenarios that return strange errors. I will be happy to sweat through those as nothing seems to be as confusing as the poorly documented FedEx and USPS APIs. Using Node will be a pleasure and abandoning our old technology stack will feel like getting rid of a ball and chain.

So if you are looking to abandon QuickBooks desktop in favor of QuickBooks Online, maybe check to see if you are going to be able to export your file (you might have to upgrade your version). Otherwise, I don’t know what else might cause you to go against that decision. In our case, we were able to save money because online payroll + QuickBooks online was cheaper than the previous payroll solution we were using. Less money, more convenience: a no-brainer.

Testing the new RSS feed

Three-screw wall hook

We’ve been wanting to display a few of our most recent blog posts on the home page of our website. Today, I finally sat down to take a look at what’s involved. At first, it seemed quite daunting. I am not a WordPress expert by any means, and my knowledge of PHP is pretty much limited to the fact that PHP files have a file extention of “.php”.

Surprisingly, it was quite easy! I just googled “how to add an RSS feed to website”, and found a nifty website that would take the RSS feed URL, accept a few parameters like the color of the blog titles, and voila! It automatically generated the code for me to cut and paste into the website. Then, I realized that the code basically pointed to a third-party website which took my RSS feed and converted it to javascript … which means if that third party website goes down, then no RSS feed. Blah. So I kept on researching how to accomplish what I was set out to do … and eventually came across an online tool that generates an iframe for whatever content you wish. Great! That way I can point the iframe to our feed URL and style the iframe the way I want! Fantastic!

… But no, that would be too easy, wouldn’t it?

Going this route, no matter what I did, there was a huge “Subscribe to this feed …” box appearing at the top of the frame. Truly annoying. I tried to figure out how to remove that box … read up about how I’d have to customize the functions.php file for the WordPress theme I was using, etc., but in the end … I just couldn’t figure it out. So I gave up. Good news is, I found a clean-looking version that did most of what I was looking to do at http://feed.mikle.com/en/ I don’t mind giving them credit for the code, I just hope they don’t start spamming our feeds with ads. Until then, I’m fairly happy with our new home page … what do you think??

Three-screw wall hook
A three-screw wall hook by Antartidee. It has noting to do with this blog post, but I just needed a photo to test the feed.

Trying to claim a blog on Technorati

Today I was reading up on some tips and tricks for increasing inbound links to our site. I came across a good article (I have to go back and find the site, I will repost the link when I do), and one of the many tips talked about getting listed on Technorati.

I knew of Technorati but could not say that I was intimately familiar with how it works. After digging around a bit, I found that in order to get listed in their blog directory, you have to first “claim” the blog … fair enough. Wouldn’t want another entity posing as us now, would we??

To claim a blog, you have to first create a technorati account. Turns out Daniele already had one, but I went ahead and created a new one – a quick and painless process. Then you enter some info about your blog, submit it, and wait for something to happen magically … or so I thought. Actually, you have to go back to your profile page and click on the “Check Claim” button to continue the submission process.

When you click on the button, you are given a short code that is to be posted to the blog for verification. This part was not clearly explained in the previous step (either that or I just completely missed it), so good thing I decided to poke around a bit instead of just sitting back and waiting.

So now, that’s where I’m at. Here is the short code they gave me: 5YW6D43RSYDE

Let’s see what happens next!

Mobile Hotspot

On this trip to Japan we arrived prepared and had a mobile hotspot ready for us. The wimax 4G device will allow five devices to be connected at the same time. This has allowed us to find more craftspeople to contact and setup our appointments. Too bad that the rented device came with a battery that no longer holds a charge.

Now that the frustration of having no Internet access when traveling has been addressed, we need to do something about the netbook we’re all sharing. Granted, when our daughter Chiara needs to use it, we can work on our iPhones, but I am starting to think that a tablet might be a welcome addition.

The Web Site Shuffle

When it comes to web site changes, I fight them off like the plague. My colleagues must think that my mission in life is to keep things the same. This is due to the fact that I learned a long time ago that no small change is a simple change. But this time it was different.

We created some of our product lines when we only had one artisan offering the type of product. For example, the first wallets we introduced were by Dionigi, but we called the product line “Men’s Wallets”, which made things difficult when we started adding wallets from other vendors.

So last week, we created new product lines, eliminated redundant ones, and merged a few, to come up with a more logical set. The benefit is that we now have more product lines like these: Gianni Miniature Leather Accessories, which gives you a single place where to find Gianni products with miniature accents.

Permalinks and File Not Found

Last week we made considerable progress with our Permalinks project. A permalink is a user friendly URL (web address) that actually means something to a human. For example, instead of pointing to the SANTARELLI briefcase (my favorite) using a link that means absolutely nothing, the new link is http://www.marcopoloni.com/SANTARELLI-rugged-leather-briefcase.htm, which is a lot more readable.

We also created a friendly 404 error page. That is the “File Not Found” page that is displayed when a user tries to load a page that does not exist either due to an old bookmark, a bad link, or typing the wrong address. The page has alerted us that some search engines are still sending traffic to pages that we thought we had retired in 2004 or 2005! The good thing for our customers is that if they run into it, they will now know what is happening and will be able to continue browsing our web site.

How to Format Pictures Using Cascading Style Sheets

Today I am going to skip working on taxes all day long and try to learn how to nicely style the History of Murano Glass page that I created the other day. I am going to do so by learning a couple of the Cascading Style Sheets tricks that Emi is so good at using.

Emi has more experience styling content and I am definitely jealous. My knowledge of cascading style sheets is average at best and I tend to use them improperly out of old habit. Plus, I tend to forget some of the things that I learn. For example, how do you get a photo to nest with the paragraph and not push the text below it? I know that I’ve done it before, but… When I try to wrap text around a picture I always get only one line of text to the side of the picture and the rest goes below… something that looks awful! If I were a little more enterprising, I would go look at a page I like and find out the styles that were used and reverse engineer the process. Perhaps that is what I should do, but it still sounds a little daunting. Wouldn’t it be easier to just have the pro tell you how to do it?

Yes! It would DEFINITELY be easier. Emi has agreed to help after lunch. I will make sure to create some sample files and save them on our intranet for future reference. I am also going to save a “before” version of the page so that I can look back and see how bad I was.

OK, now I’m done. The first thing I had to decide was the layout. Instead of our usual two column format, we thought that a three column format would make the article easier to read. To create 3 columns I took our existing layout which has a div (id=containerBody) that contains the entire page, then 2 divs (id=sideLinks to the left and id=contentSideLinks) inside the containerBody div for the navigation bar and the actual body of the page. To add the third column I created two divs (id=contentSideLinksBody and id=contentSideLinksMore) inside the contentSideLinks divand made the first one float left and the second one float right.

That was pretty easy. I had to make sure that the width of the divs did not exceed the width of the div that contained them. Then to create some spacing between the two, I added padding-left: 30px; to the right div (contentSideLinksMore). The padding gets added to the width so, I had to reduce the width by 30px to make sure that the second div would fit to the right of the left one.

Then I formatted my text by creating some sections with headings, I cut the long article into two pages, and got to my holy grail: embedding photos with text and make sure that the text wraps around the photo. What I figured was that this would happen automatically if you properly placed an img tag inside a p tag. The reality is that you have to define a class for float: left; and a class for float: right; and use the former for pictures aligned to the left and the latter for pictures aligned to the right.

When I was done, my History of Murano Glass article looked a lot better and I had the basis for formatting a lot of other articles.

Coming Soon: Video with Gianni Describing his New Leather Roses

I thought that it was going to be a lot easier. Last summer we took a few videos of our interview with Gianni and now is the time to post them.

Clearly, I am no longer the tech wizard I thought I was in my twenties. And it took this small project to make me realize that. The project is simple: import the video in the free version of Windows Movie Maker, cut it up in scenes, create a caption for each scene, create the video and post it. How could that take longer than an hour?

Well, for starters, you can not post a Windows video and expect it to play without a plug in, even in Internet Explorer. The most logical thing to do, then, is to import the video in Flash. After one more file conversion, you are ready to go, just publish and post, right? Right, except I did not notice that the video playback control was bigger than the size of the document. This resulted in videos that appeared to be missing the play, volume, and other controls. In reality they were just cropped away when publishing the video.

I ran into a few other snags that caused me to write this blog entry instead of one talking about my new video. Let’s hope that that will come tomorrow!

Dreamweaver is Currently Interacting with a Server

I am trying to code our integration with Fedex web services and I have to deal with “Dreamweaver is currently interacting with a server” all the time. I mean: “ALL THE TIME”. When that is going on I cannot upload files and, in some cases, the entire application hangs… while it waits for the interaction with the server to be complete.

There are days when everything is fine, but now the problem is getting serious. I searched to see if anyone had a valid suggestion, or perhaps Adobe provided one. A lot of people are having the problem but so far I have found no valid suggestions and Adobe is not saying anything about it.

I am following a path in which I am always trying to tell Dreamweaver not to do anything at all, except work as a text editor and FTP files to the server. Unfortunately, I am unable to get that done, so I wonder what my options are. I tried their support site and Dreamweaver CS4 is the only version that does not have an update. I called support and it is not available without a paid plan.  I am too scared to install the software again. I feel that I will end up exceeding the number of licenses I have and will be locked out forever.

The lost productivity is becoming costly. Any suggestions for a cheap and simple HTML editor will be welcome.