Steps to fill out form 8802 for an S-Corp

At Inversoft, I’ve been working on getting our tax exemption for various European countries. This process requires a valid 8802 be submitted to the IRS. In return, the IRS will ship you out a shiny new form 6616 that you can snail mail across the Atlantic to the country of your choice. Yes, feel the sarcasm. This process is unbelievably dated, horrific, slow, lame, tree-killing, etc.

After talking to a number of accountants, some knowledgable and many not, I finally have the form filled out correctly and I’m about to drop it in the mail. Since this process is SOOOO painful, I figured I would give other S-Corp owners a heads up to hopefully save their sanity and a bunch of time.

Here’s exactly how to fill out form 8802:

  1. Put your full legal company name at the top under Applicant Name
  2. Put your S-Corp’s FEIN under Applicant’s U.S. taxpayer identification number
  3. Leave Line 1 blank
  4. Put in your company address on Line 2. I put in the exact same address on my S-Corp’s tax return since we haven’t moved this year. I don’t know if this is required, but might as well error on the safe side.
  5. Put in your company address on Line 3a
  6. Put in your name (that is you the shareholder/CEO) in Line 3b
  7. Checkmark Line 4f since you are an S-Corp
  8. Checkmark 1120s under the Yes. heading of Line 5
  9. Leave Line 6 blank
  10. Write 2018 on Line 7
  11. Put the last year and month you filed a tax return for on Line 8. This is the fiscal year end. So, in my case, the last year and month (fiscal year end) I filed was December 2017, so I put in 201712 and it MUST be in this format.
  12. Checkmark Income Tax on Line 9
  13. Write this exact text in two (2) separate lines on Line 10
    <Shareholder name> <Shareholder SSN> is a U.S. resident and will continue to be throughout the current tax year.
    <S-Corp name> <S-Corp FEIN> has filed its required return and the entity classification has not changed since the return was filed.
  14. Sign, date, add your phone number, name and title to the bottom
  15. Put your S-Corp name at to the top of the worksheet with your FEIN
  16. Put the current calendar year on the worksheet (still at the top section)
  17. Line 11 (on the worksheet) pick the country (or countries) you need and ask for 5 forms each
  18. Make sure you put in the correct total on Line 12

That’s all you need for form 8802. However, since you are filling this out for an S-Corp and according to tax law and treaties, S-Corp’s can’t claim exemptions or be identified as a corporation, you need to fill out a form 8821 also. The 8821 form is an authorization made by the shareholder in an S-Corp that is certifying that the form 8802 is correct. This is part of the perjury statement.

Filling out the form 8821 is also a nightmare and the instructions suck, so here are the steps for that form as well:

  1. Put your personal information (since you are the shareholder) on Line 1 (i.e. I put Brian Pontarelli here with my home address) including your SSN and phone number
  2. Leave Line 2 blank
  3. Don’t checkmark the checkbox on Line 3
  4. Write Income on Line 3a
  5. Write 1040 on Line 3b
  6. Write 2016, 2017, 2018, 2019, 2020 on Line 3c (or whatever years you need)
  7. Write Form 8802 on Line 3d
  8. Leave Line 4 blank
  9. Checkmark Line 5a
  10. Leave Line 6 blank
  11. Sign, date, print your name and put your title as CEO (or whatever it is)

NOTE: I’ve heard that form 8821 might not be necessary if there is only one shareholder and they are filing form 8802. I haven’t confirmed this, but if you are worried about it, just send in a 8821 regardless.

Also, I HIGHLY advise against faxing these forms in. I faxed them in and they were rejected by the IRS because the fax was illegible. Likely, their fax machine sucked or mine did. Regardless, save yourself the headache and mail them in. Or better yet, send them UPS, Fedex or USPS certified.

That should be it. I’m sending mine off next week, so if they aren’t accepted, I’ll update this post with any fixes I made.

Passport Launch Day!


Today is a huge day for Inversoft. We have successfully launched our second product, Passport. Passport is a revolutionary way to add login, registration and single sign-on to your applications. Rather than go into all the details here, check out the Inversoft blog post about the launch:

We also got some great press at eWeek and BetaNews. Check those articles out here:

Savant command-line tool and plugins are almost ready

Been working this week on Savant 2.0. My first thought when I started writing Savant 2.0 was to write a complete replacement for both Maven and Ant that used Groovy and allowed for both a plugin model as well as a simple build script approach. This was too much to bite off when you consider all of the other changes to the dependency management part of Savant we made for 2.0.

For JCatapult we created a set of Ant build scripts that could be plugged into any build file and reused. It looks like this:

<project name="foo">
  <import file="${jcatapult.home}/ant/plugins/java/1.0/compile.xml"/>

This model meant that the build.xml file had nothing but import statements in it. It made life much simpler when working with numerous projects that were virtually the same.

The part I didn’t like was that I loved this model. I liked it so much I started using them for everything including Commons, Savant and internal Inversoft projects. This meant that I had a dependency on JCatapult, which for all intents and purposes is a webapp platform. This seemed strange.

I started thinking about moving these files over to Savant. At first I just figured I would migrate the entire set of Ant plugins from JCatapult over and be done. However, once I moved them over it meant that I would need to start pulling in plugins for a variety of projects. Some would come from Savant and others might come from JCatapult or elsewhere. This was due to the fact that some of the JCatapult plugins were very specific to JCatapult projects. I could force developers to download each plugin they needed from various places, install them in a specific directory and then update their build files before they could build any projects. It all started to look very clunky.

Then I remembered (duh!) that Savant is a dependency management tool and it can find, version and download ANYTHING. Why not apply this pattern to Ant build files in the form of plugins?

So, I did just that!

It works great. The way it works is that I wrote a simple Java class that figures everything out and then generates an ant build file. The full process looks like this:

  1. New script called svnt invokes a Savant class
  2. This new class parses the project.xml file, which defines the plugins the project will be using
  3. It downloads any missing plugins to the Savant local cache
  4. Since the plugins are JAR files, it explodes the JAR file to ~/.savant/plugins under a specific directory just for that plugin
  5. This class then generates a temporary build.xml file that imports all of the plugins the project needs
  6. It outputs the location of this temporary build.xml file
  7. The svnt script executes Ant passing it the location of this build file (i.e. ant -f /tmp/tmpbuild.xml)

And that’s it. Nothing fancy, just a little sugar on top of Ant to provide downloading of plugins and build files automatically.

The last part of this exercise is to write a bunch of plugins. Since these are just Ant build scripts and we’ve all created hundreds of those so it should be a simple matter of tweaking them ever so slightly to work when imported.

My new projects don’t have a build.xml file (but if they do it is imported to add additional targets or override targets from the plugins) and just contain the Savant project.xml file. This file now defines plugins and it looks like this:

<project name="foo" group="" version="1.0">
  <plugin group="" name="clean" version="1.0"/>
  <plugin group="" name="java" version="1.0"/>
  <plugin group="" name="junit" version="1.0"/>
  <plugin group="" name="release-svn" version="1.0"/>

That’s it. If anyone is interested in trying it out, I should have a release available in the next few days along with some documentation for the 5-10 plugins I will have ready. If you want to try and build all this by hand right now, you’ll need to install JCatapult since Savant uses that until it can be self building.

An evening with Jason Fried from 37 Signals

I went to the 37 Signals event last night sponsored by CPB. The speaker was Jason Fried, who is a founder of the company, a designer and all around smart guy.

Jason spoke mainly about small business. He presented a list of things that companies can do to become more productive and better at whatever they do. His list included things such as:

  • 4 day work weeks
  • Virtual companies
  • Saying no to your customers more often than not
  • Do the easiest thing possible
  • Don’t design, just do
  • Don’t go to meetings
  • Turn off email and IM

A number of these things I do each day including turning off email and IM when I’m really cranking, be as virtual as possible, reduce lengthy design and just start working. Overall, Jason has great ideas for small companies. 37 Signals is probably in the 3-5 million dollar range or lower, with about 2-3 million dollars of overhead or more. They are a life-style company and will not grow beyond a certain threshold because of these ideals.

Having worked for a large company, worked on vastly more complex systems than Jason, created many open source frameworks and now starting my own company, I found Jason’s ideas exciting and total crap at the same time. I regularly find myself battling with creating solutions that will scale, versus creating the simplest solution. This naturally occurs to anyone who has ever worked with applications that do hundreds of millions of transactions per day (or per hour).

I pushed Jason a bit to see where he would break ranks with some of his ideals. From his responses, he absolutely would not abandon these ideals at any cost. However, I think this is a marketing tool created by 37 signals to promote their products as well as Ruby on Rails. The reason I know this to be true, is that Jason is intelligent and capable or understanding moderately complex problems with more ease than say a college student. In addition, he spoke briefly about how a single feature request such as adding time-stamps to ToDo list items can have a larger impact than any customer might think. These features requests require a large amount of thought and planning because they impact the entire system. Similarly, changes to the Rails internals require a large amount of thought and testing to ensure they don’t break existing applications.

This dichotomy is something that is a fact of life. It is something engineers, product managers and executives must deal with, no matter how small or large your company is. 37 Signals has built a reputation that they can safely ignore these problems and be wildly successful. However, it is 95% smoke and mirrors. The reality is that 37 Signals is composed completely of phenomenal employees who can work in complex domains without losing their minds. The can distill complexity into manageable pieces and then combine those pieces in the end to produce a complex yet functional system.

Talkinator and profanity

Just read an interesting new I, Cringely about a piece of software named Talkinator. The technology seems just like a new IRC for the web with some APIs and Web 2.0 style, but that wasn’t what caught my eye. What caught my attention was that Cringely states that Taklinator doesn’t allow profanity. Being that Inversoft’s main product is a profanity filter, I had to try it out. It failed pretty badly.

Of course it catches your straight forward profanity like ass and fuck, but it does very little for anything more complex.

Here are some examples of stuff it doesn’t handle:

fuk you
sh it

That’s just a few, but the list goes on. I definitely think that people don’t understand the complexity that comes with attempting to filter profanity. It is much more difficult than it seems. I definitely think Talkinator should check out Inversoft’s Profanity Filter.

Inversoft is Official!

Today is marks the first day that Inversoft has a full time employee and is officially a company. We incorporated almost 2 years ago, but merely to formalize our intentions. We started making a very small amount of revenue last year and in late 2006 and now the company is reaching a point were it makes sense to have a dedicated person working on everything.

Over the next month, Inversoft is planning a number of very cool things. Rather than blog about them here in detail, I’m going to be setting up the official Inversoft blog at Once that is active, I’ll be outlining the plan there. This blog will continue to be my technical dumping ground so to speak.

One thing to look for this week or early next is our fully redesigned website with our new logo and brand. This re-branding has been a year in the making and thanks to Josh Wills over at We Are Super Ordinary it is finally finished and looks AWESOME!

Anyone that is in Colorado or going to be here this Friday, come join me for drinks out to celebrate this next step for Inversoft. Drop me an email or a comment on this blog and I’ll send you the details.

Go Inversoft!

The new year

It’s 2008 and I’m hoping to start blogging more regularly again. To start, I figured I’d tell my readers my plans for 2008. Here’s the quick run down:

1. Continue building Inversoft’s Profanity products and increase sales

I did a lot of work last year getting the profanity database and filter working well. These products are slowly selling and Inversoft is getting more customers each week. I’m hoping to add some more advanced logic this year to reduce false positives even further.

2. Rebrand Inversoft and finish the website redesign

We have been working with the excellent designers from We Are Super Ordinary to rebrand Inversoft with a new logo and a new website presence. This should help us leverage our website as a good marketing tool for the business

3. Launch JCatapult and promote the heck out of it

JCatapult is starting to get to a 1.0 stage. I’m hoping to finish up the last few things in the next couple of weeks, including migrating SmartURLs into the Struts source repositories and make it one of the default plugins shipped with Struts. JCatapult will be based primarily on Struts2 and the SmartURLs port (called the Struts2 Convention Plugin). Once that migration is complete, JCatapult should be ready for a solid beta release.

4. Build a web application as a JCatapult example

I’ve had a few ideas and domains registered for nearly 7 years now and I’m going to try and build out one of these ideas using JCatapult. Hopefully I can find 3-4 developers that are interested in helping build this application in their spare time. Anyone who is interested, send me an email.

That’s the run down for 2008. I’ll try and post a few times each month on my progress, in addition to the standard technical ramblings I put up, which usually get more traffic than the rest of my posts. Time to get coding! Happy New Year!

New Inversoft Product

I’ve finished launching my latest Inversoft product – The Inversoft Bad Word Database. The website is written entirely in Ruby on Rails and uses PayPal for purchases. All and all the coding was extremely straight forward and simple. Here’s the address:

The product idea essentially sprouted from my work on where I need to add some filtering logic to the site so that folks could not enter any restricted words (cuss, slang, swear, superlatives, derogatory, etc.) when constructing their ad for the search engines. Google, Yahoo and the others reject advertisements whose content is not valid or contains restricted words. As I built out the functionality for Naymz, I wanted to test it with some data. Unfortunately there was no data to be found.

I did quite a bit of searching and found that there were services out there who offered a web service you would sent the content to and they would validate it. This just didn’t make sense to me since I wanted to have as few external dependencies as possible and most of these sites could not guarentee reliability, up-time or accuracy of the content filtering. I also found a few other sites that had lists of words, but they were not in a database friendly form. These websites also suffered from the fact that some words I would not consider “restricted” at all and yet again the data would need major scrubbing. Another site I found offered hundreds of thousands of words entered completely by its users. This was probably the worst considering that I had no way of making a determination of which words I wanted to load and which I didn’t because as we all know users will add anything when there aren’t any checks and balances.

What I really wanted was a list of words, with definitions, ratings and categories. So, in my spare time I started building this out. I surfed the web and found all the words I could. I started adding definitions to them as well as a ranking system that would allow applications to adjust the level of leniency they wanted to allow. I also found that many times a list of alternate spellings was need because folks are smart and can beat filters by typing something like sh7t.

After quite a bit of data scrubbing, tweaking and coding, I finished the website and did an initial data load. The initial load contained approximately 500 words and another 500+ misspellings (or something close). The website is live and I’ll be adding words to the database each day and also be building out an multi-language version that contains bad words from as many languages as possible. Check it out and feedback is much appreciated.

The hunt has slowed drastically

The person who left the last comment has not yet revealed themself but they did state that they did not sign up for the GMail account. This is a bummer, but doesn’t mean that the hunt is off. Perhaps the secret GMail person will find my blog and post a few clues. In the meantime, I think it better to switch my efforts to the commenter. I do have their IP address: This should help me narrow it down. Another clue is that their IP address hasn’t changed since the previous comment. I should be able to do a little network snooping and narrow down a location. The problem after that is determining who out there knows my blog and/or knows me. Probably some guess work will ensue. I can just hope that the commenter keeps checking back so my guesses don’t go un-answered.