Tim

Footprints in the snow of a warped mind

Thursday, June 17, 2010

Where to find me

Flickr Icon  Twitter Icon  Linked In Icon  FaceBook Icon  Windows Live Alerts Butterfly  RSS 2.0 

The Site Doctor is Hiring!

Enjoy what you read here?
Think you can do better?
Join our team and get paid
up-to £35,000.
Apply now.

Tag Cloud

AJAX (4) Analysis (3) ASP (6) ASP.Net (59) Error Reporting (4) Web Service (2) WSDL (1) Atlas (2) Azure (1) Born In The Barn (1) Business (95) Business Start-up Advice (37) Client (17) Expanding Your Business (24) Recruitment (1) C# (25) Canoeing (4) Canoe Racing (5) Cheshire Ring Race (5) Racing (2) Training (4) Christmas (1) CIMA (1) Cisco (1) 7970G (1) CMS (1) Code Management (1) Cohorts (4) Commerce4Umbraco (1) Content (1) Content Management (1) Content Management System (1) CSS (4) dasBlog (5) DDD (2) DDDSW (1) Design (12) Icons (1) Development (28) Domain Names (1) eCommerce (13) Email (1) Employment (2) Festive Sparkle (1) General (39) Christmas (6) Fun and Games (11) Internet (22) Random (46) RX-8 (8) Git (2) Google (1) Google AdWords (1) Google Analytics (1) Hacking (1) Helpful Script (3) Home Cinema (2) Hosting (2) HTML (3) IIS (11) iPhone (1) JavaScript (5) jQuery (2) LINQPad (1) Marketing (6) Email (1) Multipack (1) MVC (3) Networking (3) Nintendo (1) Nuget (1) OS Commerce (1) Payment (1) Photography (1) PHP (1) Plugin (1) PowerShell (3) Presentation (1) Press Release (1) Productivity (3) Random Thought (1) Script (2) Security (2) SEO (6) Server Maintenance (7) Server Management (12) Social Media (2) Social Networking (3) Experiment (1) Software (11) Office (5) Visual Studio (14) Windows (6) Vista (1) Source Control (2) SQL (13) SQL Server (19) Starting Something New (2) Statistics (2) Stored Procedure (1) Sublime Text 2 (1) SVN (1) TeaCommerce (1) Testing (2) The Cloud (1) The Site Doctor (140) Turnover Challenge (1) Twitter (3) uCommerce (20) Umbraco (37) 2009 (1) 2011 (1) Useful Script (6) Virtual Machine (1) Web Development (72) WebDD (33) Wii (1) Windows Azure (1) XSLT (1)

Blog Archive

Search

<June 2010>
SunMonTueWedThuFriSat
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

Recent Comments

Total Comments: 987
View all 987 comments

Blog Archive

Various Links

Google+

Blogs I Read

[Feed] Google Blog
Official Google Webmaster Central Blog
[Feed] Matt Cutts
Gadgets, Google, and SEO
[Feed] Ol' Deano's Blog
My mate Dean's blog on my space, equally as random as mine but not off on as much of a tangent!
[Feed] Sam's Blog
Sam is one of my younger brothers studying Product Design and Manufacture at Loughborough, this is his blog :) Enjoy!

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

newtelligence dasBlog 2.2.8279.16125

Send mail to the author(s) Email Me (Tim Gaunt)

© 2014 Tim Gaunt.

Sign In

    # Thursday, June 17, 2010

    Set Umbraco Folder Permissions with Powershell

    Thursday, June 17, 2010 2:47:22 PM (GMT Daylight Time, UTC+01:00)

    powershell2xa4[1] If you're not configuring Umbraco through a web installer, you've had your installs in place for years and never checked the permissions or whoever set the permissions up was lazy and gave IIS write access to the entire folder, there will come a time when you want to restrict modify access to just those user(s) who should have access.

    You can find a (pretty) complete list of the files/folders that the Umbraco install should have access to here but assigning them across 101 different installs is a PITA . Thanks to a helpful PowerShell script to set folder permissions from PowerShell.nu you can easily automate the process.

    For those of you not familiar with PowerShell (like me) complete instructions are below. For the rest, here's the command:

    Get-ChildItem -path ##PATH TO YOUR INSTALL## 
    | Where { $_.name -eq "Bin" -or $_.name -eq "Config" -or $_.name -eq "Css" -or $_.name -eq "Data" -or $_.name -eq "Masterpages" -or $_.name -eq "Media" -or $_.name -eq "Scripts" -or $_.name -eq "Umbraco" -or $_.name -eq "Umbraco_client" -or $_.name -eq "UserControls" -or $_.name -eq "Xslt" } 
    | ForEach {./SetFolderPermission.ps1 -path $_.Fullname -Access "NETWORK SERVICE" -Permission Modify}
    

     

    Instructions:

    1. Save the SetFolderPermission.ps1 script to your server
    2. Open your PowerShell console (I think it's installed by default if not, you can download PowerShell here)
    3. Copy the above PowerShell command into notepad
    4. Update "##PATH TO YOUR INSTALL##" to your Umbraco install
    5. If your IIS install doesn't use NETWORK SERVICE as the default user, update it to your user
    6. Make sure it's all on a single line
    7. Copy/Paste/Run in PowerShell

    Bonus

    If you're uber lazy and just have a web folder of Umbraco installs you can set the path to the folder of Umbraco installs and use:

    Get-ChildItem -path ##PATH TO YOUR FOLDER## -recurse
    | Where { $_.name -eq "Bin" -or $_.name -eq "Config" -or $_.name -eq "Css" -or $_.name -eq "Data" -or $_.name -eq "Masterpages" -or $_.name -eq "Media" -or $_.name -eq "Scripts" -or $_.name -eq "Umbraco" -or $_.name -eq "Umbraco_client" -or $_.name -eq "UserControls" -or $_.name -eq "Xslt" } 
    | ForEach {./SetFolderPermission.ps1 -path $_.Fullname -Access "NETWORK SERVICE" -Permission Modify}
    

     

    I've not tried this mind you and can't recommend it but hey, it's there if you want it ;)

     

    Don't forget to follow me on Twitter.

    # Wednesday, April 21, 2010

    Stop jQuery.hide() showing the elements on page load

    Wednesday, April 21, 2010 10:30:25 PM (GMT Daylight Time, UTC+01:00)

    This is a great little tip that Andy Higgs shared with me a couple of months ago while we were developing Crisis Cover. If you write jQuery that hides the div when the user has JavaScript enabled, you can avoid the divs all being shown while the page loads by simply adding a class to the body of the page using jQuery and hide it using CSS like so:

    <html>
    <head></head>
    <!-- Reference to jQuery here -->
    <body>
    <!-- This should be the first bit of code and don't wait until the page has loaded -->
    <script type="text/javascript">$('body').addClass('js');</script>
    <!-- The rest of your code here -->
    <div class="jsHide">
    	<p>This paragraph is hidden if the user has JavaScript enabled.</p>
    </div>
    </body>
    </html>

     

    Then you just need to add the css:

    .js .jsHide

    Your divs will now be hidden until you show them with JavaScript. Nice, simple solution to an ever annoying problem.

    Note: For my demo to work you'll need to include jQuery

    Update: As pointed out by Petr below and Andy Higgs/Trevor Morris, it would be better to target using JavaScript without jQuery and target the body for maximum flexibility (note the space at the front in case there is already a class):

    <script type="text/javascript">document.getElementsByTagName('html')[0].className+=' js'</script>
     

    Don't forget to follow me on Twitter.

    # Sunday, April 18, 2010

    Error 11: An error occurred when merging assemblies: ILMerge.Merge: ERROR!!: Duplicate type 'xyz' found in assembly 'App_Web_rh2sxhkc'. aspnet_merge

    Sunday, April 18, 2010 12:47:20 PM (GMT Daylight Time, UTC+01:00)

    You may have come across this error once or twice while deploying your project if you develop using Web Deployment Projects. It's usually caused when you copy and paste a page and forget to update both the page declaration and code behind file.

    But the website builds!?!

    You don't usually get the ILMerge error until you build the web deployment project because when you build a website directly, it doesn't compile all the code into a single assembly so the class names are seen as different. Part of the web deployment process is to compile all the websites code into a single assembly hence the duplicate references.

    What's the solution?

    It's surprisingly simple, all you need to do is open up the offending aspx and aspx.cs files and update two lines:

    1. In the code behind file, rename the partial class. By default Visual Studio will name the class FolderName_Pagename which should result in a unique name

    2. The page declaration (first line of the page) in the aspx file. You have to make sure that both the Inherits attribute and CodeBehind reference are correct.

    Tip: To avoid confusing yourself, open the files independently using the solution browser because if you open the aspx and press F7 to switch to the code behind file before updating the page declaration, you'll end up editing the page you copied rather than the copy.

     

    Don't forget to follow me on Twitter.

    # Wednesday, April 14, 2010

    The Umbraco 1 question questionnaire results

    Wednesday, April 14, 2010 7:18:47 PM (GMT Daylight Time, UTC+01:00)

    A while ago I posted a quick one question questionnaire to gauge how much people were charging for the "average" Umbraco install. This was partially to settle an internal debate but also for an post I've not had time to post yet so in the meantime I'll post the results.

    Having a quick look at the results you'll see that 64% of the people that answered (around 100) charge £2,500 or less for a "standard" install with a whopping 96% of people charging less than £10,000. I'll explain how this can be used for pricing your Umbraco packages soon!

     

    Don't forget to follow me on Twitter.

    # Wednesday, March 24, 2010

    New Twitter SEO spam scam -protect your twitter name even if you don’t want to use it

    Wednesday, March 24, 2010 8:43:54 AM (GMT Standard Time, UTC+00:00)

    twitter-scam[1] I came across a really interesting method of spamming Twitter on Friday, presumably for SEO benefits but it was intriguing so I thought I'd share. I came across it on a Twitter account that was setup under one of our client's name: @RomanOriginals.

    We're currently in the process of claiming it from the spammer so here's a screenshot of how it looked when we found it:

     RomanOriginalsTwitterScam[1]

    So what's the scam and why's it interesting?

    From what we can see, winslim.com has signed up to one of our client's regular email shots and is harvesting links from it. When an email goes out, they then tweet the subject line (this is usually less than 140 chars), "shorten" your url and throw it onto a twitter stream registered under the company's feed.

    Although it appears to be a standard URL shortening service, if you look at the request/responses using Fiddler you will see that each one of the winslim.com links e.g. www .winslim.com/3CShT4H (I've popped a space in there to stop it linking to them) kicks the user over to a winslim.com product promotion page (winslim.com/winslim/SweetDeals/SweetDeals.jsp?d=d) which then redirects the user to the original url!

    Although unscrupelous, I still think this is a very clever method and suspect we'll see more spammers doing it shortly so if you've not already registered your company's official Twitter username, it's worth doing it now!

     

    Don't forget to follow me on Twitter.

    # Saturday, February 27, 2010

    Collapse all Solution Explorer items in Visual Studio 2010

    Saturday, February 27, 2010 12:22:48 PM (GMT Standard Time, UTC+00:00)

    Ever wanted to be able to collapse all items within Visual Studio's solution window? This is a nifty little Visual Studio macro that I came across a few years ago and have been using successfully in Visual Studio 2005, Visual Studio 2008 and now in the Visual Studio 2010 RC.

    I'll overview how to install it below in case you're unsure how to do it but I have this bound to the key combination Ctrl+Shift+` as ReSharper now uses my previous key combination of Ctrl+` for it's new bookmark explorer.

    Anyway, here's the Visual Studio Solution Explorer item Collapse All macro:

    Imports System
    Imports EnvDTE
    Imports EnvDTE80
    Imports EnvDTE90
    Imports System.Diagnostics
    '-----------------------------------------------------------
    ' CollapseAll Module
    '-----------------------------------------------------------
    ' Simple macro that fully collapses all items in the 
    ' Solution Explorer rather than just the top level node
    '
    ' To make live easier, bind it to a keyboard setting such
    ' as Ctrl+Shift+` which by default has no bindings (Ctrl+` is
    ' now used by Resharper
    '
    ' Tested and works with:
    ' Visual Studio 2005
    ' Visual Studio 2008
    ' Visual Studio 2010
    '
    ' Originally from: http://bit.ly/bmRu3W
    '-----------------------------------------------------------
    Public Module CollapseAll
    
        Sub CollapseTree()
            ' Get the the Solution Explorer tree
            Dim solutionExplorer As UIHierarchy
            solutionExplorer = DTE.Windows.Item(Constants.vsext_wk_SProjectWindow).Object()
    
            ' Check if there is any open solution
            If (solutionExplorer.UIHierarchyItems.Count = 0) Then
                Return
            End If
    
            ' Get the top node (the name of the solution)
            Dim rootNode As UIHierarchyItem = solutionExplorer.UIHierarchyItems.Item(1)
            rootNode.DTE.SuppressUI = True
    
            ' Collapse each project node
            Collapse(rootNode, solutionExplorer)
    
            ' Select the solution node, or else when you click 
            ' on the solution window
            ' scrollbar, it will synchronize the open document 
            ' with the tree and pop
            ' out the corresponding node which is probably not what you want.
            rootNode.Select(vsUISelectionType.vsUISelectionTypeSelect)
            rootNode.DTE.SuppressUI = False
        End Sub
    
        Private Sub Collapse(ByVal item As UIHierarchyItem, ByRef solutionExplorer As UIHierarchy)
            For Each innerItem As UIHierarchyItem In item.UIHierarchyItems
                If innerItem.UIHierarchyItems.Count > 0 Then
                    ' Re-cursive call
                    Collapse(innerItem, solutionExplorer)
                    ' Collapse
                    If innerItem.UIHierarchyItems.Expanded Then
                        innerItem.UIHierarchyItems.Expanded = False
                        If innerItem.UIHierarchyItems.Expanded = True Then
                            ' Bug in VS 2005
                            innerItem.Select(vsUISelectionType.vsUISelectionTypeSelect)
                            solutionExplorer.DoDefaultAction()
                        End If
                    End If
    
                End If
            Next
        End Sub
    End Module

     

    In case you've never installed a Visual Studio macro before, here's a couple of instructions:

    1. In Visual Studio, press Alt+F11 to load up the Visual Studio Macro editor (or View > Other Windows > Macro Explorer > Double Click on "Module1" in "My Macros")
    2. Either create a new module of it it's not in use, you can edit Module1 and past in the code above
    3. Save and close the Visual Studio Macro editor
    4. You should be back in Visual Studio so click "Tools > Options > Environment > Keyboard"
    5. In the "Show commands containing" text box, enter "CollapseTree" and the macro you just created should be shown.
    6. Make sure "Global" is selected in the "Use new shortcut in:" drop down list
    7. Press Ctrl+Shift+` in the "Press shortcut keys:" text box
    8. Click Assign
    9. Click OK

    You're done :)

    Update via Graeme: Make sure your module name (in the above it's Module1) is the same as your file name otherwise Step 5 minght not work.

     

    Don't forget to follow me on Twitter.

    # Friday, February 19, 2010

    Search every table and field in a SQL Server Database Updated

    Friday, February 19, 2010 12:07:28 PM (GMT Standard Time, UTC+00:00)

    As some of my blog posts are a little out of date, I thought I would spend some time updating the most popular ones. As I use this script on a regular basis and there was an error with the original posting, I thought I'd update it with a "corrected" version to get things started.

    If you want to see the original script, you can refer to How to search every table and field in a SQL Server Database. This one's just fixed :)

    As a stand alone script

    DECLARE @SearchStr nvarchar(100)
    SET @SearchStr = '## YOUR STRING HERE ##'
    
    
        -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
        -- Purpose: To search all columns of all tables for a given search string
        -- Written by: Narayana Vyas Kondreddi
        -- Site: http://vyaskn.tripod.com
        -- Updated and tested by Tim Gaunt
        -- http://www.thesitedoctor.co.uk
        -- http://blogs.thesitedoctor.co.uk/tim/2010/02/19/Search+Every+Table+And+Field+In+A+SQL+Server+Database+Updated.aspx
        -- Tested on: SQL Server 7.0, SQL Server 2000, SQL Server 2005 and SQL Server 2010
        -- Date modified: 03rd March 2011 19:00 GMT
        CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
    
        SET NOCOUNT ON
    
        DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
        SET  @TableName = ''
        SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
    
        WHILE @TableName IS NOT NULL
        
        BEGIN
            SET @ColumnName = ''
            SET @TableName = 
            (
                SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
                FROM     INFORMATION_SCHEMA.TABLES
                WHERE         TABLE_TYPE = 'BASE TABLE'
                    AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
                    AND    OBJECTPROPERTY(
                            OBJECT_ID(
                                QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                                 ), 'IsMSShipped'
                                   ) = 0
            )
    
            WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
                
            BEGIN
                SET @ColumnName =
                (
                    SELECT MIN(QUOTENAME(COLUMN_NAME))
                    FROM     INFORMATION_SCHEMA.COLUMNS
                    WHERE         TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                        AND    TABLE_NAME    = PARSENAME(@TableName, 1)
                        AND    DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')
                        AND    QUOTENAME(COLUMN_NAME) > @ColumnName
                )
        
                IF @ColumnName IS NOT NULL
                
                BEGIN
                    INSERT INTO #Results
                    EXEC
                    (
                        'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' +
                        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                    )
                END
            END    
        END
    
        SELECT ColumnName, ColumnValue FROM #Results
    
    DROP TABLE #Results

    As a re-usable stored procedure

    CREATE PROC SearchAllTables
    (
        @SearchStr nvarchar(100)
    )
    AS
    
    BEGIN
    
        -- Copyright © 2002 Narayana Vyas Kondreddi. All rights reserved.
        -- Purpose: To search all columns of all tables for a given search string
        -- Written by: Narayana Vyas Kondreddi
        -- Site: http://vyaskn.tripod.com
        -- Updated and tested by Tim Gaunt
        -- http://www.thesitedoctor.co.uk
        -- http://blogs.thesitedoctor.co.uk/tim/2010/02/19/Search+Every+Table+And+Field+In+A+SQL+Server+Database+Updated.aspx
        -- Tested on: SQL Server 7.0, SQL Server 2000, SQL Server 2005 and SQL Server 2010
        -- Date modified: 03rd March 2011 19:00 GMT
        CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630))
    
        SET NOCOUNT ON
    
        DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110)
        SET  @TableName = ''
        SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
    
        WHILE @TableName IS NOT NULL
        
        BEGIN
            SET @ColumnName = ''
            SET @TableName = 
            (
                SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
                FROM     INFORMATION_SCHEMA.TABLES
                WHERE         TABLE_TYPE = 'BASE TABLE'
                    AND    QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
                    AND    OBJECTPROPERTY(
                            OBJECT_ID(
                                QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)
                                 ), 'IsMSShipped'
                                   ) = 0
            )
    
            WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
                
            BEGIN
                SET @ColumnName =
                (
                    SELECT MIN(QUOTENAME(COLUMN_NAME))
                    FROM     INFORMATION_SCHEMA.COLUMNS
                    WHERE         TABLE_SCHEMA    = PARSENAME(@TableName, 2)
                        AND    TABLE_NAME    = PARSENAME(@TableName, 1)
                        AND    DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar', 'int', 'decimal')
                        AND    QUOTENAME(COLUMN_NAME) > @ColumnName
                )
        
                IF @ColumnName IS NOT NULL
                
                BEGIN
                    INSERT INTO #Results
                    EXEC
                    (
                        'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) FROM ' + @TableName + ' (NOLOCK) ' +
                        ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
                    )
                END
            END    
        END
    
        SELECT ColumnName, ColumnValue FROM #Results
        DROP TABLE #Results
    END
     

    Don't forget to follow me on Twitter.

    # Monday, July 27, 2009

    CodeGarden 09 Open Space Minutes - Space 1: How to sell Umbraco

    Monday, July 27, 2009 10:53:28 PM (GMT Daylight Time, UTC+01:00)

    It's taken some time to get here and there's still more to add as I think this is a pretty big topic but I thought I'd get started. I wanted to keep the session more focused on the selling points of Umbraco and how people pitch Umbraco to the clients than selling techniques which on the whole we managed to do.

    The first thing I stressed was that I wasn't going to teach you how to sell or selling techniques as I've never found that hard selling works -though I'm not saying it doesn't, I just prefer to educate the client into the most suitable solution (even if that isn't us).

    There were a number of questions that were raised and I'll answer what I can here, if you were at the session and I've missed something, please let me know and I'll get it added:

    1. What are the key selling points of Umbraco
    2. How do you pitch Umbraco
    3. Do you tell clients it's open source (or use that as a sales point)?
    4. How do you price Umbraco
    5. Once you've won, what do you ask your client
    6. How do you support Umbraco
    7. How do you get around the question of "What happens if you get hit by a bus?"

    What are the key selling points of Umbraco

    A couple of the attendees came up with better 30second sales pitches so I'm sure they'll post those up shortly but here's a few I remember:

    • It's easy to use -you don't need any previous computer experience
    • You can edit any page's content yourself at any time
    • It's highly flexible and lightweight
    • It's search engine friendly
    • It's open source (this really can be a selling point at the right time)

    Do you tell clients it's open source (or use that as a sales point)?

    We do and we don't. Again it really comes down to who you're pitching Umbraco to. Where the client has had issues with developers not releasing source etc then it's clearly a selling point.

    Generally we do tend to explain to clients that we will base their website on an open source project that we then build on and customise further to suit their needs and that by using best practice methodologies, any developer can in theory pick up the system and continue to develop it (even if they have no experience of Umbraco).

    How do you price Umbraco

    This question was asked in a couple of different ways throughout the session and it's a topic in itself (see the article I wrote a while ago about pricing your work).

    If you look at Umbraco in the right way you'll see that it's actually rather easy to price as there are a few components that you can sell either individually or together:

    • Installation and configuration
    • Customisation
    • Hosting
    • Support

    All you need to do is work out a minimum cost for each component and then that will give you a core system cost.

    Once you have your core Umbraco costs (don't forget to factor in your license costs) you can then alter the costs accordingly for your client -and this has to be on a case-by-case basis. 

    How do you pitch Umbraco

    This is easy, there are so many selling points to Umbraco that regardless of what the client is looking for, as long as it's CMS based, Umbraco will have some benefit you can overview to the client.

    When pitching Umbraco, we have found educating the user as to the benefits and what the client should be looking for in other systems. If you do this, then the majority of the time, the rest of the competition falls by the wayside.

    If the client is a large corporate it's always worth mentioning that it offers much of the functionality that SharePoint does but with little of the cost (or setup pain!).

    Once you've won the contract, what do you ask your client

    The first thing to do is to get all the information you need to complete your contract (or at least tell your client what you'll need and when). You should know what you'll need already but we tend to ask for:

    • Design inspiration (websites the client does and doesn't like -and why)
    • Logos and other source imagery
    • Text for the website (you'd be best to load the initial content during training but get the client to think about it while you're developing or you'll never get there!)

    Next, you'll need to make sure your paperwork is in order. Once you have agreed the general premise of your contract, it's important that you confirm all deliverables (what you'll be doing for the client) in a work order with the client. This avoids an ambiguity on what you'll be delivering and when. This doesn't need to be pages of text (though sometimes it needs to be) but avoids disagreements later.

    You should always request signed work order and deposit (we request a minimum of 20% regardless of project spend) at a minimum before starting any work.

    Once you have the signed work order (you sign one for the client to keep and keep one yourself), you can start thinking about the project. If it'll take longer than a week to deliver, I recommend you provide the client with rough timescales, this will have the added benefit of helping you focus your mind.

    How do you support Umbraco

    This is something that Paul Sterling addressed through another session and if he doesn't write up his notes I'll make a few notes in another post.

    How do you get around the question of "What happens if you get hit by a bus?"

    Although this was asked a couple of times throughout the session, I avoided answering it a little due to a conflict of interest. For the past few months we've been working hard on a new system called Crisis Cover which has been designed to help you with this exact question.

    apple-touch-icon[1] Crisis Cover monitors you to ensure that you're still around and if you don't respond to a number of alerts, it will contact your clients informing there's something wrong.

    I'll post more information about Crisis Cover, but if you're interested in getting involved with the beta, leave me your email and I'll get one sent out.

    In Closing

    There is a lot of information about selling and business in general in my previous post "Business start-up advice" which if you're starting out, I really recommend you reading as it should give you a really good start (and includes example Service Level Agreements, Contracts and other useful documents).

     

    Don't forget to follow me on Twitter.