My startup story: from big idea to thriving business in 8 short years

In the summer of 2003 while still working for my first startup I’ve got a “big idea”: social news reader. Imagine something like Google Reader with Priority Inbox and social recommendations.  I was thinking about it day and night. I couldn’t sleep and was working through it in my head while lying awake in bed. I’ve got The Madness. “It’s going to be huge!” – I thought. This was the kind of idea you’re supposed to seek venture funding for. But I was in Windsor, Canada, far away from Silicon Valley and didn’t know anything about VCs or funding. So I was going to build everything myself.

In 2003 there was no Google Reader, no Facebook and hardly any RSS feeds. No RSS feeds? Ok, I will have to build an intelligent scraper that can crawl websites and gather news/updates. No Facebook to pull social data from? That’s a problem. I can’t build anything social without the people. I will need users to make it work, and a lot of them. My “big idea” was going to take a long time to build, so I decided to make something simple and give it away for free to attract users. I had some experience with computer telephony, so small desktop app to show caller id was easy enough to develop. 2 months later PhoneTray Free was born.

2003 was a tough year. My first startup was going from moderate success to disappointing failure very fast. I couldn’t do any consulting work because of my visa status. Needless to say I wasn’t making tons of money 😉 I was very close to giving up on startups and accepting a full time job offer. But my wife had a job and we had some savings, so we decided to tough it up so I could continue with my own business.

I was working on my “big idea” and on what was left of my first startup, and people were downloading PhoneTray Free. I started getting emails from PhoneTray users, and they liked my little app. “Hey, I get annoying calls from my ex.” – one email said – “Can your program block calls from him?”. I thought “why not?” and implemented blocking of calls from specific numbers. And it was the feature that everyone wanted. PhoneTray Free was becoming popular. By the end of 2004 I was getting couple hundred downloads per day and tons of emails.

“I like your program and all” – one email said – “but what about us, dial-up internet users? We miss important calls when online!”. “Um, really?” – I thought – “Is dial-up still alive?”. Quick Google search told me that over 65% of US internet users were still using dial-up at that time. But isn’t it a solved problem with modem-on-hold and V.92 standard? Apparently not, as I quickly found out. V.92 standard describes how to implement call detection and modem-on-hold in hardware, but nothing about software or API. Windows doesn’t have built-in modem-on-hold support. There is a couple of modem-on-hold apps provided by modem manufacturers but they only work with specific modems, and most modems don’t come with any modem-on-hold software. Can I add something to PhoneTray to make it work for the dial-up users?

Well, turns out it’s not so easy. There is no standard way to implement modem-on-hold. Existing apps were talking directly to the modem driver using internal API. Undocumented of course. And each modem chipset vendor came up with its own API. Plus some vendors decided not to bother and didn’t implement any API. That looked like a challenge to me, and who doesn’t like challenge? So I got my old x86 assembler books and trusty IDA and started to look into how the modem drivers work. I disassembled several modem drivers, read up on driver development and figured out what I had to do. I had to make my own kernel driver that sits on top of the modem driver and monitors what the modem driver is doing. Then PhoneTray can communicate with my driver and control the modem.

Did I say that I like challenge? If you ever tried to develop kernel mode drivers you know what I’m talking about. Remote kernel debugger, BSOD/reboot cycle, kernel memory dumps… I was having so much fun that my big idea was forgotten :), at least temporary. It took 5 months to make my driver work with all different modems, but in May 2004 the first version of PhoneTray Dialup was ready. It was a product solving real problem for people, and I was going to charge money for it. Sales were slow in the beginning and PhoneTray Dialup had bugs but by version 2.10 it became a solid product and sales were ramping up quickly.

By the end of 2004 PhoneTray Dialup was making couple thousand per month and growing. I became permanent resident of Canada and could do consulting work and make some money. Things were looking up! I went back to working on my big idea, doing some consulting work and updating PhoneTray Free and PhoneTray Dialup from time to time. Then one day I’ve got an email from the owner of small ISP who wanted to offer PhoneTray Dialup to his users. “Of course! Why didn’t I think of it myself?” – I thought – “That’s the whole new market!”. I quickly made a fully customizable version that ISPs could offer as their own software, got another person on board and started selling it. During the next 2 years we licensed it to a couple dozen ISPs. The biggest one was in Saudi Arabia and had 300,000 users.

Our business was doing well and I had tons of things to do. My wife left her job and joined Traysoft to help out. My big idea was forgotten, again. But dial-up was slowly dying and we had to do come up with something else to make money. Over the years I was getting emails from different businesses asking us to develop a custom version of PhoneTray Free for them. I wasn’t going to do that but I wanted to help developers with building what they want. I took the core telephony features of PhoneTray, ported to C#, added some extras and built telephony library for .NET. It became a successful product that accounts for over 50% of our company revenue. And PhoneTray is still going strong, plus we have advanced call management software PhoneTray Pro coming soon.

So here I am, 8 years later, with a thriving small business that supports me and my family. Business that started with a little free app. And my “big idea”? I will make it happen. Some day 😉

AddTapi.NET 3.0 has been released

Last week we released new version 3.0 of our telephony library AddTapi.NET. You can download demo version of AddTapi.NET from To upgrade purchased version of AddTapi.NET, please send your serial number to Here is a list of new features in AddTapi.NET 3.0:

2-step/consultation call transfer

In addition to one-step/blind transfer, AddTapi.NET 3.0 supports 2-step or consultation call transfer. To start a 2-step transfer, call TapiCall.SetupTransfer() to create a new consultation call. Wait until call state changes to Dialtone, then use TapiCall.Dial() to dial the destination number for the transfer. When consultation call is connected, use TapiCall.CompleteTransfer() to complete the transfer.

Call park/unpark support

New TapiCall.Park() and TapiLine.Unpark() methods were added to park/unpark calls. Version 3.0 supports both directed and nondirected call parking.

3-way conference support

New version adds support for 3-way conference (if supported by the telephony system). To create a 3-way conference, call TapiCall.SetupTransfer() on the existing call to create a second call. Wait until call state changes to Dialtone, then use TapiCall.Dial() to dial the number you want to add to the conference. When the second call is connected, use TapiCall.CompleteTransfer() with the second parameter set to true to join the calls and create 3-way conference.

New call recording engine

AddTapi.NET 3.0 has new audio engine for recording calls. New engine has better performance when recording on many lines simultaneously and is more robust overall. TapiCall.StopPlayback() is now a synchronous operation that stops playback immediately. This change allows call recording to start faster after playing a message, and prevents from loosing first second of the recording on telephony hardware that does not support simultaneous playback and recording. Because new version initializes audio engine as soon as the call is connected, your application can call TapiCall.StartRecording() from the CallConnected event handler.

Call privilege handling

AddTapi.NET 3.0 automatically obtains owner privilege for calls when required, eliminating “application doesn’t have owner privilege” errors. New TapiCall.Privilege property provides information about the current call privilege.

Dialing on existing call

New TapiCall.Dial() method allows applications to dial on existing call. This is useful in many scenarios. For example, when user picks up a phone, new call in Dialtone state is created. Your application can use TapiCall.Dial() method to dial the number on this call.

WaitForDigit and GatherDigits improvements

In AddTapi.NET 3.0 TapiCall.WaitForDigit() and TapiCall.GatherDigits() methods accept negative timeout value. Negative value means that the timeout should start after playback initiated by the Play(String) or Speak(String) is completed.

Additional information about line and address capabilities

New version adds CallFeatures, MaxNumActiveCalls, SupportsPredictiveDialing, IsRoutePoint, IsQueue, MaxNumActiveCalls and MaxNoAnswerTimeout properties that provide additional information about features and capabilities of the telephony hardware.

TapiLine.Calls collection

Added TapiLine.Calls collection that contains all active calls on the line to simplify call management in some scenarios.

DigitDetected event

Version 3.0 adds DigitDetected event that fires when a DTMF digit is detected on the line. This event provides alternative asynchronous mechanism for handling digits received during the call. TapiCall.WaitForDigit() and TapiCall.GatherDigits() are easier to use synchronous methods for handling DTMF digits.

Other small fixes and improvements

– Added TapiCall.Trunk property to make call tracking across multiple trunks easier.

– Added TapiLine.DisconnectOnBusy property.

– Fixed a bug that caused device-specific functions to fail on some hardware.

– Fixed a bug with TapiCall.WaitUntilDone() always returning false when zero timeout is specified.

– Added checks to prevent multiple initialization of AddTapi.NET library.

AddEmail 3.0 has been released

We have released new version 3.0 of AddEmail ActiveX. You can download demo version of AddEmail from To upgrade your purchased AddEmail, please send your serial number to

AddEmail ActiveX 3.0 adds several new features and improvements while maintaining complete compatibility with previous versions. Source code written for AddEmail ActiveX 1.x and 2.x should compile and work with AddEmail ActiveX 3.0 without any modifications. Major new features added to version 3.0 are listed below. For more detailed information please refer to the AddEmail Manual.

Windows 7 and Windows Server 2008 R2 compatibility

AddEmail ActiveX 3.0 is fully compatible with all editions of Windows 7 and Windows Server 2008 R2, 64-bit and 32-bit versions. On 64-bit OS please use 32-bit version of regsvr32 to register AddEmail.dll on the computer. Run command prompt as an Administrator and type in:

c:\windows\syswow64\regsvr32 c:\addemail\addemail.dll

(assuming you copied AddEmail.dll to C:\AddEmail\ folder). You should see a message saying that the dll was registered successfully.

Automatic import of HTML with embedded images

With new version your program can automatically create HTML emails with embedded images by importing HTML files from disk. AddEmail imports specified HTML file, adds all images referenced in the HTML as inline attachments and modifies HTML as needed. Please refer to the ImportHTML and SimpleSendHtml topics in AddEmail Manual for more information.

SimpleSendXXX methods allow to specify sender’s and recipients’ names

New version adds support for “First LastName <>” format to SimpleSend, SimpleSendHtml and SimpleSendAttachment methods. Now you can specify names in addition to e-mail addresses for sender and recipients in SimpleSendXXX methods.

Support for Unicode (non-ASCII) attachment names

New version supports Unicode characters in MailAttachment.File and MailAttachment.Name properties. AddEmail will automatically encode attachment name if it has any non-ASCII characters.

ReplyTimeout property

New property has been added to specify how long AddEmail waits for a response from SMTP server before reporting timeout error. Please refer to ReplyTimeout topic for more information.

PhoneTray Dialup 2.38

PhoneTray Dialup 2.38 has been released. Please download the latest version from To update your version just download version 2.38 and install it over the previous version. As always, this update is free for all registered users of PhoneTray Dialup. New in version 2.38:

  • Added Modem-on-Hold support for USB and PCI modems with LSI/Agere chipset on Windows 7. Make sure to install the latest drivers from our website. Click here to download the drivers.
  • Added Modem-on-Hold support for USB modems with Conexant ACF chipset (for example Zoom 3095) on all versions of Windows.
  • Improved offline caller id support on Windows 7, Windows Vista and Windows XP.

Please let us know if you encounter any problems with the new version.