Moving my small business [cloud email, file sharing, calendars] to a new provider

It’s time for my small business to update our solution for email, file storage, calendars, etc so I’m making notes as I go that you may find helpful and I will find helpful when I look back to remember what I’ve done and why.


When I started Roots Kitchens Bedrooms Bathrooms in 1998 our email was provided by our Internet Service Provider. Then we got our own domain, eventually our own web server and in the early 2000’s I set up our own email server. A few years after that, spam filtering became unmanageable and we moved onto Google Apps as it was then, Google Workspace as it is now. As an early adopter (around 2006) we had a free 50 user account and to their credit Google still have this free account some 15 years later. It’s a ‘legacy’ account, still free, but several features added to later versions don’t apply to our account.

We need different features than offered by the free account so I’m on the hunt to replace it.

Features needed:

  • Email
    • Shared email account (currently we each have our own email address and check a shared account, but this is less than perfect when we’re busy, not being entirely sure if someone else is already acting on an email. Our current Google Workspace free account doesn’t allow for shared email and this is one of the motivations to upgrade).
  • Calendaring
    • The ability to view each others calendars and make appointments, all fairly typical I think.
  • File storage
    • Our current free service offers 15GB per user but for two of us that’s too small.
  • Low cost
    • We aim to keep overheads as low as possible.
    • We need 6 user accounts. I’ve compared costs for annual renewals and ignored any introductory discounts
  • What we don’t need:
    • MS Office desktop applications (LibreOffice works well for us)


A rough and ready spreadsheet to compare options

PlatformGoogle WorkspaceGoogle WorkspaceZohoZohoM365M365
ProductBusiness StarterBusiness StdWorkplace StdWorkplace ProBusiness BasicBusiness Standard
Cost per user*£4.60£9.20£3.20£5.603.89.4
How many users?666666
Email storage (GB)302000301005050
Extra file storage (GB)samesame1010010001000
Total GB3020004020010501050
CommentExtra storage = 50gb/£5/month, 1tb/£57/monthShared drives for team/groupno desktop office apps, but online versions includedincludes desktop apps
*price used assumes no introductory offers, monthly rates

The also rans: – Were an excellent dedicated server host when I used them years ago. I found it hard to identify their cloud email offering and it seems to be “rackspace email” as just email then an option for Microsoft Exchange mailboxes in order to have calendars, and that get’s pricey. – similar to rackspace in selling MS Exchange mailboxes. Only checked because I seem to have been seeing lots of adverts for them lately. is an opinionated email system. It seems like a great option for personal email but the business (hey for domains) setup seems not quite ready for us. Expensive but when I experimented with the personal option when it launched, I think it it could be worth it. footnote: for my personal email I actually have Google Workspace Standard as I need the file storage space.

We need 6 user accounts. Whilst per user pricing is great I also like to see the cumulative price for a year. Note one of my business goals is to minimise overhead spend.

Observations when comparing:

Google Workspace Starter:

Pros: We’re all familiar with Google Workspace as we already use it and have no complaints.

Cons: Accounts can’t be mixed, so once one of us needs more than 30GB of file/email storage we all need to upgrade. Extra storage is outrageously expensive, eg 50GB/£5/month or 1TB/£57/month

Microsoft 365

There are several Microsoft 365 options but the one I’m interested in doesn’t include the Desktop installed Office Apps.  We’ve used “Libreoffice” for many years, it’s an open source program with equivalents to Word, Excel and Powerpoint. It functions almost identically to MS Office but costs nothing. It can use MS Office file formats too, so we have no trouble interacting with files sent to us by suppliers.  The one down side is that anyone familiar with MS Office takes a day or so to get used to the different software but from that point on it’s hard to tell the difference.   We do use an MS Access database but it’s my job to set up forms and queries, everyone else just uses it a a regular desktop application. One day I’ll migrate it into a web application but it works so well it’s never quite reached the top of my todo list.

Pros: Better price than google Starter and way more storage

Cons: I use  Outlook on Android and through the web interface for a organisation I volunteer with and I find it not as comfortable and fluid to use as Gmail.


There are two relevant options, “Workplace Standard” at £3.20/user/month and “Workplace Pro” at £5.60/user/month

For 6 users, Workplace Standard is £230/year for 30GB of email and 10GB for extra files.

For 6 users, Workplace Pro is £403/year for 100GB of email and 100GB for extra files.

Zoho looks really interesting as a solution. It appears to play well with standard applications (if you like Outlook, you can keep using that, if you like your phones’ email client, it works with that). Beyond my simple search for a platform, Zoho offer CRM [1], Accounting,  ERP [2], social media management, helpdesk software, and more.  I’ll be looking at their ‘Books’ accounting software soon as I have time to replace Xero.

[1] Customer Relationship management – software that helps you track and improve interactions with your customers.

[2] Enterprise Resource Planning – software that helps manages sales, stock and inventory, deliveries and so on.

Pros: Better price than google, Potential to easily expand into their other products

Cons: No familiarity on my part with their systems and how it is to use.

So, what am I going to do?

I’m going for Google Workspace Business Starter

At £331/year it’s more than Zoho Standard (£230) or Microsoft 365 Business Basic (£274) but I decided the extra cost is worth it for continuing with a product we’re used to using.

If I was a new business starting out today and had the time to research as I once used to, I’d start with Zoho.  I think it’s other apps could be useful in the future.

If I didn’t know Google workspace and gmail so well, then at an entry level M365 business basic is better value for it’s storage and if I needed MS Office then M365 Business Standard at £9.40/m (£677/year) would beat Google Workspace.

These things are never easy decisions to make, but now I’ve made my decision I can get onto setting things up.

Magic letterhead tray – making preprinted stationary automatically on plain white paper

A couple of years ago I stopped buying letterheads for my business and instead created a special print queue that merged any document sent to print with a PDF letterhead template.

Last month, it stopped working on just my PC. I’m not quite sure if it broke from a Windows update or something else had changed but the result was I needed to start from scratch and make it all again. My original notes weren’t very good and in 3 years time I’ll look back on these notes and think much the same. If you’re looking to print letterheads on demand too, these notes may help you achieve it.

Getting here took me far to long (days!) but the end result is not having to buy preprinted stationary or an extra tray for our printer.

Summary of what I’m about to do:

  • Create a Print Server (a virtual machine) running linux (Ubuntu) and CUPS (common unix printing system)
  • Connect the Print server to the network printer
  • Create a queue for the printer and share that queue to the network.
  • Within that queue, call a script that turns the print document into a PDF, merge that with a pre created ‘letterhead’ PDF
  • Send that newly merged document to the printer.

Things that are good to know: Issues and solutions:

  • Sometimes windows doesn’t like browsing for printers, giving error .“Couldn’t connect to printer. Check the printer name and try again. If this is a network printer, make sure that the printer is turned on and that the printer address is correct”
    Solution was to open ‘services’ and restart ‘Print spooler’ service
  • I also found using “http:” for printer connections rather than https seemed to help.

Instructions from start to finish (mostly)…

Create virtual server

# We need to resize the logical volume
to use all the existing and free space of the volume group
$ lvm
lvm> lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
lvm> exit
# And then, we need to resize the file
system to use the new available space in the logical volume
$ resize2fs /dev/ubuntu-vg/ubuntu-lv
resize2fs 1.44.1 (24-Mar-2018)
Filesystem at /dev/ubuntu-vg/ubuntu-lv is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 58
The filesystem on /dev/ubuntu-vg/ubuntu-lv is now 120784896 (4k) blocks long.
# Finally, you can check that you now
have available space:
$ df -h
Filesystem                         Size  Used Avail Use% Mounted on
udev                               3.9G     0  3.9G   0% /dev
tmpfs                              786M  1.2M  785M   1% /run
/dev/mapper/ubuntu--vg-ubuntu--lv  454G  3.8G  432G   1% /

Install CUPS

  1. Openssh-server was installed by default, Login and get IP address
    >ip addr show
  2. Install cups
    #sudo apt install cups
  3. Add my local user to cups lpadmin group
    usermod -aG lpadmin <myusername>
  4. Configure cups
    1. I had problems with cups rewriting the config files I’d changed by hand when the server rebooted. The solution is NEVER EDIT THE CUPS CONFIG FILES WHEN THE SERVER IS RUNNING!
      systemctl stop cups.service
    2. Configure following in /etc/cups/cupsd.conf
      Listen *:631 
    3. Comment out the other listen directives. *:631 listens on all connections but you can also restrict to a specific network with
  5. Need allow access to the web GUI and web admin GUI by adding an ‘Allow all’ line to cupsd.conf. Note: This may not be a good idea if you can’t trust every device on your network. In that case I think you can restrict access by IP address or other auth methods.

<Location />
Order allow,deny
  Allow all

<Location /admin>
  Order allow,deny
  Allow all

systemctl start cups.service

  1. Turn off discovery of remote printers
    • There seems to be an issue with remote discovery of printers. They disappear through reboot and maybe other triggers.  So for now I’m manually adding the network printers in the hope they are retained (this has worked so far…)

systemctl stop cups-browsed.service


BrowseRemoteProtocols none
# was BrowseRemoteProtocols dnssd cups

systemctl start cups-browsed.service

Add printers via the CUPS web interface

  1. Go to web interface in browser, http://<ip>:631

Check box “share printers connected to this system”

  + check allow printing from the internet

Nb: it will redirect you to https pages then ask for your username/password as per the account you added to the lpadmin group.
I decided to call my print server “Mars” and setup up print queues using the format ‘server’+’printer model name’+’optional descriptive label’

  1. Add network printers manually to print server.
    1. Administration > Add Printer
    2. Other network printers > Internet Printing Protocol (ipp)
    3. Connection address: “ipp://<ip>:631”  where IP is the printer IP. EG: ipp://
    4. Name “mars”+model+(dash)+description”, eg “marsP6035” for the default printer “marsP6035-letterhead” for magic letterhead, or maybe “marsP6035-duplex” for a forced duplex mode
    5. Leave the description blank (it appears in the  windows print dialog boxes, better for us to have useful description detail as part of the name).
    6. Check the box ‘share this printer’
    7. Use the manufacturer provided PPD file (mine all came from the manufacturers install files, in a sub directory called ../linux/eu/)
    8. Test print to make sure it works

Install PDFtk

  1. Apt install pdftk
  2. disable aparmour, it seems to block the scripts we’re going to create. I guess there’s an easy way to allow them but I don’t know what it is.

AppArmor can be disabled, and the kernel module unloaded by entering the following:
sudo systemctl stop apparmor.service
sudo update-rc.d -f apparmor remove

To re-enable AppArmor in the future enter:
sudo systemctl start apparmor.service
sudo update-rc.d apparmor

Add the magic letterhead code

  1. The knowledge of this came from from but I have slightly modified parts to suit my needs
  2. Copy your Letterhead.pdf artwork into /etc/cups
  3. Setup watermark scripts in /usr/lib/cups/filters named: letterheadwatermark

Chmod 755



tempdir=$(mktemp -d)

echo $(date) “$0 $* (tempdir: $tempdir)” >> $logfile

# Command line arguments

if [ -z “$filename” ] ; then

if [ $# -ge 7 ]; then
        cat $6 > $tempdir/
        cat > $tempdir/

# convert Postscript to PDF
/usr/bin/ps2pdf $tempdir/ $tempdir/ 2>>$tempdir/err

# watermarking.  ‘stamp’ puts letterhead over document, ‘background’ puts it under. Some documents send all white background so letterhead will not show through white areas.
/usr/bin/pdftk $tempdir/ stamp “$watermark” output $tempdir/pdf.out 2>>$tempdir/err

# convert PDF to Postscript
/usr/bin/pdftops $tempdir/pdf.out – 2>>$tempdir/err

# clean-up. I don’t remove the tmp files as they are very useful to find out what stage of this script is failing
# rm -rf $tempdir

From <>

  1. In /etc/cups create a link to the cups filter folder, eases finding things later
    Ln -s /usr/lib/cups/filter/ cups_filter_directory
  2. Copy script into filter folder, chmod 755 & chown to root
  3. Restart again: systemctl restart cups.service
  4. I’m using the kyocera PPD from <myserver>/software/printer then inserting cupsfilter line to make it print a letterhead. I wanted to use the IPP everywhere PPD (default in cups) but that didn’t work. I suspect the IPP everywhere PPD gets the first input as PDF whereas the kyocera PPD gets the first input as postscript. I tried skipping the PStoPDF but that didn’t work either and I stopped searching once I got it working with the kyocera PPD
  5. Modify the printer PPD (/etc/cups/ppd/<your-print-queue.ppd> to call the script.
    systemctl stop cups.service
    then add this as second line:
    *cupsFilter: "application/vnd.cups-postscript 100 letterheadwatermarkpdf"
    systemctl start cups.service

Add the printer to the client

  1. Add printers to clients
    1. Printer and scanners > add printer or scanner
    2. From the printers discovered, select printer, eg: “marsP6035 @ marsprint”. Selecting the @server i’m guessing is selecting the IPP service.
    3. Send a test print, hope it works 🙂
  2. Alternative method that had issues of print being scaled down, perhaps near a5 printing instead of a4 before the stamp/watermark applied. Ps2pdf command seems to be the issue here.
    1. Add printer, The printer that I want wasn’t listed, select a shared printer by name
    2. Paste the url from the printers page on the server, it will be like:
    3. Note: not https (sometimes that seems to fail, not sure why)
    4. Driver: Microsoft > Microsoft PS Class Driver
  3. Add printer directly to computer with manufacturer driver file
    1. This is useful because the Kyocera drivers allow more print options and control, eg paper type, make poster from multiple pages, etc.
    2. Test print… Hopefully this works too !

How many 1st class stamps to use on heavy letters?

In our office, we buy Royal Mail stamps in ready to use denominations of “1st Class”, “2nd Class”, “Large 1st Class” and “Large 2nd Class”. However, these are only useful for 100g weight letters.

For heavy letters, we can use multiples of these stamps. I noticed I was routinely having to do the calculation in my head as to what is the optimum combination of stamps. For example, what to stick on a 500g 2nd class large letter. I know that’s £1.58, I know the stamps represent the 100g values, so 1st=65p 2nd=56p Large_1st=98p and Large_2nd=76p.

It’s not too hard to work out, but it takes time and gets harder with bigger letters and parcels.

For a coding challenge, I wrote “Stampulator“. It’s a single web page that tells us which combinations of stamps to use, so for the 500g 2nd Class large letter, £1.58 example, we need 1 x 1st class and 1x Large 1st class. That’s over by 5p, but it’s the nearest value to the cost.

I also made it so that if I have different value stamps or a different target value to reach (say; special offer or I’ve been slow to update the values when Royal Mail prices change) I can input those and get an instant result.

I then printed the page and stuck it buy our post box.  Stampulator is on my web server and free to use – it works well from a mobile phone too.

Post a comment here if it’s useful and that’ll encourage me to keep it up to date.