Michael Gibbs » Page 13

Author: Michael Gibbs

I'm a technologist at heart, assisting companies best utilize the Internet to market themselves and sell their products and services online. This includes organizations as large as Google and as small as one or two individuals.
At Over The Top and Exhibit A Communications, I've programmed solutions for Google as well as at least one other company that was later acquired by Google.

I've been CTO of an Internet SaaS company and spent my time pretty evenly between guiding the future technical strategy of the company, architecting software solutions for my dev teams, designing and running a data center to service our clients world-wide as well as being a technical evangalist/sales engineer to our media clients large and small.

I've also been Chief Photographer of the Daily Sun/Post newspaper back when it was a 5-day a week daily newspaper.

I also spent a great many years as a beach lifeguard for the City of San Clemente as well as Jr. Lifeguard instructor and then as it's program coordinator.
Bragging rights
Private Pilot with Instrument rating and proud husband of soon to be 25 years (and counting).

Running Ecommerce Store from Google Spreadsheet

Google has recently released announced a Google Store Gadget that relies on Google Spreadsheets as the database in an attempt to make it easier for people to set up electronic shop on the world wide web with little effort and no cost (assuming you have SOME sort of presence on the ‘Net).  While this is definitely cheaper and somewhat easier to implement than most ecommerce solutions, it is not as easy as some anticipated it would (or could) be.

However, it is a great example of something they’ve been telling programmers for some time: use Google Spreadsheets as datasources. This example uses an engine (spreadsheets) that most computer users are familiar with to replace complicated databases for a rather simple solution.

After playing with it a bit I figured why not create a 3 step guide (more or less) to set this up.

 

  1. Create Google Checkout account for client (http://checkout.google.com/sell/)
    1. Save the Merchant ID for later use:
      image
  2. Create a spreadsheet in Google Docs (preferably in customer’s account). You can copy the sample template Google provides.
    1. Using "Share" pulldown on the top right corner of the spreadsheet header, you need to "Publish To The Web"
      image
    2. In the pop-up box check "Automatically republish when changes are made" and then click "Start Publishing"
      image
  3. Create and embed the required code into your website
    1. Into any website that accepts raw HTML
      1. Select the store configuration tool below for the desired size:
        1. Store Configuration Tool – LARGE
        2. Store Configuration Tool – SMALL
        3. Store Configuration Tool – TINY
      2. In the store configuration tool, enter the entire URL of your inventory spreadsheet (including the "?key=" portion) intot he "Data Source URL" field
      3. Enter the customer’s Merchant ID (from Step 1)
      4. In the store configuration tool, click "Preview Changes" to see a preview.
      5. Make any desired customizations
      6. When you like what you see, click "Get the Code" button
      7. Copy the code snippet
      8. Paste the code snippet for your gadget into your page
    2. Into Google Sites
      1. Sign in to Google Sites
      2. Choose the page you’d like to add your gadget to
      3. Click the "Edit Page" button
      4. To add your gadget:
        1. Chose "More gadgets…" from the "Insert" drop-down menu
        2. At the "Add a gadget to your page" prompt, select "Add gadget by URL" in the bottom left-hand side of the screen
        3. Enter the URL for the desired gadget:
          1. Large Store – http://checkout.google.com/seller/gsg/beta2/large-store.xml
          2. Small Gadget – http://checkout.google.com/seller/gsg/beta2/small-store.xml
          3. Tiny Gadget – http://checkout.google.com/seller/gsg/beta2/tiny-store.xml
        4. In the store configuration tool, enter the entire URL of your inventory spreadsheet (including the "?key=" portion) into the "Data Source URL" field
        5. Enter the customer’s Merchant ID (from Step 1)
        6. Click "Save" and you are done.
    3. Blogger, in a blog post
      1. Select the store configuration tool below for the desired size:
        1. Store Configuration Tool – LARGE
        2. Store Configuration Tool – SMALL
        3. Store Configuration Tool – TINY
      2. In the store configuration tool, enter the entire URL of your inventory spreadsheet (including the "?key=" portion) intot he "Data Source URL" field
      3. Enter the customer’s Merchant ID (from Step 1)
      4. In the store configuration tool, click "Preview Changes" to see a preview.
      5. Make any desired customizations
      6. When you like what you see, click "Get the Code" button
      7. Copy the code snippet
      8. From Blogger, create a new blog entry or edit an existing entry
      9. Click on "Edit HTML" and paste the code snippet for your gadget.
    4. Blogger, in a side bar
      1. Visit Blogger
      2. Select the "Edit Layout" section for your blog
      3. Click on "Add a Gadget"
      4. In the prompt, choose "Add your own" (at the bottom)
      5. Enter the URL for your desired gadget and click "Add by URL"
        1. Large Store – http://checkout.google.com/seller/gsg/beta2/large-store.xml
        2. Small Gadget – http://checkout.google.com/seller/gsg/beta2/small-store.xml
        3. Tiny Gadget – http://checkout.google.com/seller/gsg/beta2/tiny-store.xml
      6. In the store configuration tool, enter the entire URL of your inventory spreadsheet (including the "?key=" portion) into the "Data Source URL" field
      7. Enter the customer’s Merchant ID (from Step 1)
      8. Click "Save" and you are done.
      9. TIP: After adding the gadget, you can move your gadget around to different parts of your blog using the "Layout" section in your Blogger Account.
    5. iGoogle
      1. Go to iGoogle and click on "Add Stuff…" and in left column, click on "Add feed or gadget"
      2. Enter one of the following URLs and click "Add"
        1. Large Store – http://checkout.google.com/seller/gsg/beta2/large-store.xml
        2. Small Gadget – http://checkout.google.com/seller/gsg/beta2/small-store.xml
        3. Tiny Gadget – http://checkout.google.com/seller/gsg/beta2/tiny-store.xml
      3. Go back to your iGoogle page
      4. On your gadget, click the settings drop down and choose "Edit Settings"
      5. In the store configuration tool, enter the entire URL of your inventory spreadsheet (including the "?key=" portion) into the "Data Source URL" field
      6. Enter the customer’s Merchant ID (from Step 1)
      7. Click "Save" and you are done.

    That’s all there is to it! It took me 5 minutes to set up the following store: http://exhibita.com/shopping-cart.aspx. It took me a lot longer to write this up than to actually do it! If your needs are simple but you’d like to categorize your solutions better, you can create multiple pages that link to multiple spreadsheets (or potentially pages within a single spreadsheet) and just place the appropriate code on each page. The nice thing is that products placed into a cart on one page will follow you around to all the other pages just like in a real shopping cart.

    Of course this isn’t a proper replacement for a full-fledged ecommerce solution like AspDotNetStorefront but it certiainly will help a lot of people to integrate fairly single shopping carts into their blogs and websites.

    Running into problems? Try the Google Checkout store gadget forum

    We’d love to hear from you if you’ve implemented a Google Checkout Gadget; use the comments below to contribute to the ongoing conversation.

    Best. Comment. Ever. ? You Bet

    TechCrunch spun a comment to a posting about AT&T… I mean Apple pulling Google Voice applications off the iPhone store. Whoever ‘JÂ’ is an extremely whitty guy. Come to think of it, this speech could be spun in any number of different ways’…

    image This is, without a doubt, the best comment ever on TechCrunch. Left by ‘JÂ’ on MG’s latest iPhone rant about the Google Voice debacle. Beautiful.

    AT&T: You want answers?

    TechCrunch: We think we’re entitled to them.

    AT&T: You want answers?!

    TechCrunch: We want Google Voice on our iPhones.

    AT&T: You can’t handle the iPhone with Google Voice!

    Son, we operate on network that has walls. And those walls have to be guarded by carriers with restrictions. Who’s gonna do it? You? You, Verizon Wireless? We have a greater responsibility than you can possibly fathom. You weep for Google Voice and you curse AT&T. You have that luxury. You have the luxury of not knowing what we know: That pulling Google Voice, while tragic, probably saved the network. And our existence, while grotesque and incomprehensible to you, saves the network.

    You don’t want the Google Voice on your iPhone. Because deep down, in places you don’t talk about at TechCrunch50, you want us protecting the network. You need us protecting that network. We use words like rate limiting, application approval and restrictionsÂ…we use these words as the backbone to a life spent defending something. You use them as a punchline.

    We have neither the time nor the inclination to explain ourselves to a blog who writes and profits under the blanket of the very network that we provide, then questions the manner in which we provide it. We’d prefer you just said thank you and went on your way. Otherwise, we suggest you pick up a router and build your own network. Either way, We don’t give a damn what you think you’re entitled to.

    TechCrunch: Did you order Google Voice taken down?

    AT&T: We did the job you sent us to do.

    TechCrunch: Did you order Google Voice taken down?

    AT&T: You’re goddamn right we did.

    SEO SPAM and Blogs

    image Ok, forgive me but it is time for a little rant here…

    SEO SPAM (aka comment spam) is getting out of hand these days. Previously, it was only the SEO contest people that I had to worry about but now I’m seeing a dozen or more requests per day (it is growing rapidly) to moderate trash comments like “I hope you will continue your work. I want a blogengie blog as well. Try to implement it” or “half-blood prince is awesome” or “Deals on xxxxx at http://domain.com” or “A good information that could answer all my needs. Thanks for sharing.”

    Not only is this very annoying to have to deal with but it is also kind of insulting to my intelligence. I mean do these people think that I’m stupid enough to not spot the trend of what they are doing? At least some are honest about it (see the Great Deals above) while others use names like Sue Dental to link back to their Dental Review sites or Harry Potter Movie that links to their Harry Potter Movie Reviews website.

    And then there are those who chose to make generic “I’m doing something like this, You information has proven most helpful” on a “Welcome to our Blog” posting. Sheesh…

    Now don’t get me wrong. I truly feel that marketing through social network sites, forums and blogs is a good idea but ONLY if you are truly able to add something to the ongoing conversation and/or community. Don’t just hire a bunch of people in some third-world nation to type inane comments into as many blogs as possible in the hopes that a few of them will go through. This is truly the same thing as what SPAM has effectively done to email. It has all but ruined it’s use as a productivity tool.

    Someone recently said that as soon as something good comes along, lazy marketers and sleezy SEO slags (as opposed to those offering a legitimate SEO services) will ruin it by flooding it with inappropriate advertising.

    Ok, I feel better now. But SEO SPAMmers beware, I’m onto you and will do what I can across the dozens of blogs that I manage to keep you at bay! Your first clue should be that I’m moderating my comments. And if your posts don’t end up getting approved, you can be assured it has been dumped into the bit bucket.

     

    Any one have any LEGITIMATE comments to contribute to the conversation? Please do so below…

    Updated Breadcrumb Post Tip

    In the blog posting entitled SEO And ASPDotNetStorefront, I presented a way to modify the breadcrumbs automatically created in ASPDotNetStorefront. Well, it appears that I left out one potential way that the breadcrumbs could be presented.

    When a top level entity entity (Section, Category, Genre, etc) are displayed the top level is wrapped in a span tag with a class of SectionTitleText. Unfortunately, given my earlier code, this will end up presenting the Section_Title in the same size text rather than the size defined in your H1 tag since H1 tags would end up around the previously mentioned span.

    Instead of :

    if (SectionTitle.LastIndexOf(sep) == -1) // if there is no arrows in bread crumb
        s = s.Replace("(!SECTION_TITLE!)", String.Format("<h1>{0}</h1>",
            SectionTitle));
    else
    

    I now use:
    if (SectionTitle.LastIndexOf(sep) == -1) // if there is no arrows in bread crumb
        if (SectionTitle.Contains("<span class=\"SectionTitleText\">")) // This is the root of an entity so strip off this span tag
        {
            tmpS = SectionTitle.Replace("<span class=\"SectionTitleText\">", "");
            tmpS = tmpS.Replace("</span>", "");
            s = s.Replace("(!SECTION_TITLE!)", String.Format("<h1>{0}</h1>",
                tmpS));
        }
        else // this is some other thipe of page
            s = s.Replace("(!SECTION_TITLE!)", String.Format("<h1>{0}</h1>",
                SectionTitle));
    else…
    

    This will trap instances of the SectionTitleText span and removes them from the SectionTitle (if found) before doing the token replacement.

    Which Version of AspDotNetStorefront Should I Choose?

    Many of my customers are having to ask themselves this same question. They know they want to have the best e-commerce platform out there (who doesn’t?) but the struggle in deciding which of the 4 platforms to choose from. perhaps I can help guide you through the decision process.

    Are you planning on running your store inside of DotNetNuke? If the answer to this is yes, then you will for sure want the ML/DotNetNuke version of the software. If not, let’s move on.

    Will your site be hosted on a 64-bit version of Windows Server in order to accommodate the volume of traffic your site is expected? If yes, keep in mind that the ML/64-bit version of ASPDNSF will not support certain payment gateways (Bank of America via Cybersource, CyberSource, IATS TicketMaster and PlugNPay). Also note that if are running your site on a 64-bit server, you can still run any of the other versions, you just won’t gain the speed that comes along with the full 64-bit system.

    This narrows your search down to either ML/Express and ML version of AspDotNetStorefront. To make things easier, I’ll list a series of functions that if you can’t live without any ONE of them, then you should step up to the full ML version. We’ll start with what I think are the most important first.

    • Will you always be shipping physical (as opposed to digital) products? Express version will not support digital download products like the full version will.
    • Will your site never grow beyond 500 items? This is the cap on the number of products you can have in your store. Of course, with ASPDNSF’s variants, size and color options, this can represent a large number of items.
    • Can you live without offering Google Checkout to your customers? This is a significant question if you intend to do AdWords advertising. If your site offers GC, then your AdWord ads can have the Google Checkout logo next to them making them stand out from other options.
    • Speaking of Google, will you be able to live without conversion tools in Google Analytics? You should be able to embed the raw Analytics code into your templates but you won’t be able to do more in-depth e-commerce conversion tracking.
    • Can you live with no more than 100 topics in your site? For most sites, this is probably true but for many, in particular those who are looking to do many landing pages on their site, this might be a deal killer.
    • Can your site survive without any modifications to the source code (including code-behinds)? The XMLPackages that ASPDNSF uses to control the display of data on web pages gives you a great deal of flexibility but it appears that the Express version comes pre-compiled which removes access to “mid-range” changes to the code-behinds as well as significant changes that require access to the full source code.
    • If you need to work with drop shippers, plan on working a little harder. The full version has a series of very handy tools to work with drop shippers that you’ll have to do manually in the Express version of ASPDNSF.
    • Other features you’ll have to live without are Product Ratings & Reviews, Customer Levels (including wholesale), Affiliate programs, Recently Viewed Products and Customers who Bought X also bought Y type features.
    • If you feel that your site can live without kits or packs, then you should be good to go. If not, then it is time to step up.
    • Only need simple shipping options? Great. If you need more complex shipping rules such as calculating by Order weight & Zone or Order Total & Zone, then you will need ML. You will also give up shipping calculations from DHL International, Australia Post and Canada Post. You also will not be able to set up customer levels that allow for free shipping or use multiple ship-to addresses per order.
    • Given that you have less than 500 products, you should be ok with not having XML imports, Web Services Automation Imports or Event Notifications or callbacks to external web services.
    • You will similarly have to give up the Gift Registry and Wish Lists. If your business model requires these features, then Express is not for you.
    • Se habla e-commerce? If you are looking to build a store that supports multiple languages, then look to the full ML version.
    • Will you be using PayPal for your CC transactions? If so, you should be good as the Express version only supports 7 other credit card gateways while the full ML supports over 40 different gateways.

    To see the complete list you can see it at http://www.aspdotnetstorefront.com/t-features.aspx but we’ve found most of our customers can make a decision pretty quickly by working their way through the list shown above.

    SEO And ASPDotNetStorefront

    In almost all respects, this is a FANTASTIC product in terms of providing the webmaster/merchant/developer with a great set of tools for SEO purposes. You define, on a page by page, product by product basis not only the page name but also the title, product image alt tag, meta keywords and description but the process is also painless to boot!

    There is one aspect of the site that has left me “wanting more” and that is the operation of the breadcrumbs. This is a must-have feature for any e-commerce website and ASPDNSF does a good job of this. However, they don’t necessarily make it easy to modify the display string format without having to have a source code license as the generation of this string is compiled into one of the site DLLs.

    A recent post in the great support forums for ASPDNSF inspired me to revisit this issue.

    What I’ve always wanted to do, from a display and from an SEO standpoint, was to set up my client’s sites so that the primary keywords on any given page are used in the URL and that first occurrence of the keywords on a page are formatted as the only occurrence of Heading 1 (<h1>) as well as sprinkling them in the content. ASDNSF, by carefully naming products (and topics and sections and categories) appropriately, will automatically take care of most of this EXCEPT the Heading 1 tag. I can modify a product page so that they Name of the product is set up as Heading 1 but the challenge is that the first occurrence of this phrase is in the page is in the breadcrumb and has no emphasis, thereby discounting it in the eyes of the almighty search engine bots. (See below)

    breadcrumb example, out of the box

    However, by going in and doing a little string manipulation in the SkinBase.cs file (which is thankfully NOT compiled into the DLLs) I’ve gone in and broken apart the breadcrumb and made the name of the item (product, category, section, etc) into a Heading 1 giving it primary importance on the page.

    image

    The code to do this isn’t particularly elegant, nor is it difficult. I’ll outline the logic and then show the complete code at the end.

    The idea is to find out if the SectionTitle (the value used by ASPDNSF as the breadcrumb and created in one of the DLLs)  contains the string used as a breadcrumb separator. If not, this is a either a stand-alone page (topic, system page, etc) or it is the root level of one of the entities (product, category, section, etc). If so, we just slap <h1> tags around it and be done with it.

    string sep = AppLogic.AppConfig("BreadcrumbSeparator");
    if (SectionTitle.LastIndexOf(sep) == -1)
    s = s.Replace("(!SECTION_TITLE!)",String.Format("<h1>{0}</h1>",SectionTitle));
    else

    Otherwise, we know it is a traditional breadcrumb and we’ll need to determine where to insert the tags at specific points in the string. We again look for the last instance of the breadcrumb separator and add 1 to it’s own length (‘cause it has a trailing space). The end tag location is determined by subtracting 7 (the length of a space and the closing span tag).

    int insertOpening = SectionTitle.LastIndexOf(sep) + sep.Length + 1;int insertClosing = SectionTitle.Length – 7;

    Once we have these, we can insert the appropriate Heading 1 tags into a string.

    string newSectionTitle = String.Format("{0}<h1>{1}</h1>{2}",
    SectionTitle.Substring(0, insertOpening), SectionTitle.Substring(insertOpening, insertClosing – insertOpening),
    SectionTitle.Substring(insertClosing));

    So, instead of using

    s = s.Replace("(!SECTION_TITLE!)", SectionTitle);

    which is the default code for this function, we’ll use the following instead:

    string sep = AppLogic.AppConfig("BreadcrumbSeparator");
    if (SectionTitle.LastIndexOf(sep) == -1) s = s.Replace("(!SECTION_TITLE!)", String.Format("<h1>{0}</h1>",SectionTitle));
    else{
    int
    insertOpening = SectionTitle.LastIndexOf(sep) + sep.Length + 1;
    int insertClosing = SectionTitle.Length – 7;
    string
    newSectionTitle = String.Format("{0}<h1>{1}</h1>{2}",
    SectionTitle.Substring(0, insertOpening),
    SectionTitle.Substring(insertOpening, insertClosing – insertOpening),
    SectionTitle.Substring(insertClosing));

    s = s.Replace("(!SECTION_TITLE!)", newSectionTitle);
    }

    I've found this code to be helpful to resolve the problem described at the top of this blog post. Hopefully you will as well. Please leave us comments below if you agree or disagree with me.

    Wave of the Future

    I haven’t brought this up in the blog yet but have dropped some info about my trip last week to Google I/O 2009. While the Android phone was cool, the stellar announcement of the week was Google Wave. I'm not sure if I can sell you on the value of this jump in Internet technology so hopefully if you are interested in the least, you’ll be as excited about this as I was. So pour yourself a cup of coffee and be prepared to be amazed!

     

     

    Once I get my login to the sandbox system and have some seat-time with the product, I’ll post my impressions here.

    Thoughts? Let me know what you think about Wave!

    Adding Bar Codes to Receipts in AspDotNetStorefront

    Sample Administrative Notification ReceiptA recent posting in the AspDotNetStorefront forums got my brain spinning on how best to accomplish this. The technology to do this, once written, should be able to be leveraged in other areas that clients of mine have been looking to do. So, out comes Visual Studio and Google to come up for some starting points on how to accomplish this.

    Research pointed me at an article by Zach Smith on TechRepublic that provided the basis for this project.  With this, I created a class file to place in the site’s /App_Code directory containing the following code:

    using System;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Drawing.Text;
    
    namespace BarCode{public class BarCode
    {
    public static Bitmap CreateBarcode(string data)
    {
    // Create the Bitmap we'll be using.
    Bitmap barCode = new Bitmap(1, 1);
    // Get a reference to the Free 3 of 9 font. We'll use this to generate the barcode.
    // Found at http://www.squaregear.net/fonts/free3of9.shtml
    Font threeOfNine = new Font("Free 3 of 9", 60, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
    // Get a graphics object to work with
    Graphics graphics = Graphics.FromImage(barCode);
    // Now we need to get the width and height that our data will cover 
    // after is is rendered with the Free 3 of 9 font
    SizeF dataSize = graphics.MeasureString(data, threeOfNine);
    // Now we base the Bitmap's size off of this data
    barCode = new Bitmap(barCode, dataSize.ToSize());
    // Refresh our Graphics object with the new bitmap
    graphics = Graphics.FromImage(barCode);
    // Make the Graphic object's drawing surface white
    graphics.Clear(Color.White);
    // Set the rendering hint to SingleBitPerPixel
    graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
    // Draw the string onto the Graphics ojbect
    graphics.DrawString(data, threeOfNine, new SolidBrush(Color.Black), 0, 0);
    // Force the graphics object to execute any pending operations
    graphics.Flush();
    // Dispose of our objects
    threeOfNine.Dispose();
    graphics.Dispose();
    // Return the finished barcode
    return barCode;
    }
    }
    }

    One of the key features of this code is the font that is used to create the barcode. Matthew Welch has released a number of freely available TrueType fonts at his site I Shot the Serif. The font in question is his “Free 3 of 9” which will produce a 3 of 9, or Code 39, barcode that is scannable by my hand-held scanners. You will need to download the fonts and install them into the %windir%\font directory on the server running the storefront. One thing that is very important is that the font won’t be available until either the server is rebooted or you’ve run IISRESET on the server. Normally the font is available immediately as soon as it is added to the server’s font directory to most applications but working with IIS6 on a Win2k3 server and IIS7 on a Vista box required an IISRESET to enable the font.

    Next, we need to create a file in the website that will will actually generate the barcode image on the fly. This is done in the code-behind of the CreateBarCode.aspx file:

    // ------------------------------------------------------------------------------------------
    // Copyright Exhibit A Communications, 2009.
    // Portions copyright Zach Smith, http://blogs.techrepublic.com.com/howdoi/?p=173
    // 
    // THE ABOVE NOTICE MUST REMAIN INTACT. 
    // ------------------------------------------------------------------------------------------
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using AspDotNetStorefrontCommon;
    using BarCode;
    namespace AspDotNetStorefront {
    /// <summary>
    /// Summary description for createbarcode.
    /// </summary>
    public partial class createbarcode : System.Web.UI.;color: #2b91af">Page
    {
    protected void Page_Load(object sender, System.EventArgs e)
    {
    string data = Request.QueryString["data"];
    Response.ContentType = "image/gif";
    Response.Clear();
    Bitmap barCode = BarCode.BarCode.CreateBarcode("*" + data + "*");
    barCode.Save(Response.OutputStream, ImageFormat.Gif);
    Response.End();
    barCode.Dispose();
    }
    }
    }

    You’ll notice that in the call to BarCode.BarCode.CreateBarcode() includes an asterisk before and after the actual code to be encoded into the barcode. This is because Code39 barcodes are supposed to be enclosed in asterisks in order for scanners to identify the barcode type. This simple file just takes the querystring value named “data” and passes it (after enclosing it in *) to the CreateBarcode() function in the BarCode class in the BarCode namespace.

    Lastly we will need modify the XMLPackage to generate the call to this image. In my client’s case, they want this to show up in the administrative notification email which is printed for the order pickers. As such, I added the following code to the appropriate location in the notification.adminneworder.xml.config file that generates this email.

    <tr>
    <td colspan="2" align="center">
    <img src="{/root/System/StoreUrl}createbarcode.aspx?data={$OrderInfo/OrderNumber}" alt="Order Number {/root/QueryString/ordernumber}" />
    </td>
    </tr>

    In this case, the table row is inserted into the tblOrderHeader table generated by the order ID. Please note that I’ve used two different
    methods to pull in the order number into the <img> tag for illustrative purposes; either one will work

    Hopefully someone else will find this handy. If so, please leave a note in the comments field below. Of course, if the work to implement this is beyond your abilities or the time available to you, please feel free to contact us and we’ll contract to do the work for you.

    Free Webcast: Email Security and Archiving in the Cloud

    Interested in outsourcing your email services but are afraid of what affect this might have on  your corporate mandate (can you say “Sar-Box”) to retain copies of email and to do so securely? Well, Google has announced a webinar with a live Q&A session to be held on Tuesday June 9, 2009 at 9am PDT (12 noon EDT/17:00 GMT).

    You can learn:

    • How to take advantage of cloud solutions today to better your business and save money!
    • How cloud computing can provide you with an affordable and secure solution for archiving business emails
    • Why email security in the cloud is more effective than the running email in house (in most cases)

    And best yet, if you register for this free webcast, even if you can’t make it, you’ll be sent a copy of the recording for later viewing. Or better yet, when you get the link, you can share with those around you; perhaps event that stake holder that has been preventing you from moving forward with moving your business’ email into the cloud!

    Register for free email security and archiving webinar.