Oct 8, 2012

CP Client AeriNOx Inc. – U.S. Based Selective Catalytic Reduction

Aerinox - NOx Reduction | Emissions Control | Industrial Processes

AeriNOx Inc.

When Boulder-based AeriNOx Inc. approached Customer Paradigm for help with SEO and internet advertising, it seemed like a perfect fit. AeriNOx is one of the first U.S.-based companies to install Selective Catalytic Reduction Systems for stationary diesel or natural gas engines used for industrial processes. Selective catalytic reduction reduces NOx emissions from industrial engines, helping protect the environment from dangerous greenhouse gases. This certainly fits in with our Boulder environmental sensibilities.

For years, the kind of cutting-edge industrial emission control technology which AeriNOx specializes in was only produced and installed by companies based in Europe, especially Germany. Europe has had more stringent industrial emissions requirements than the U.S. for many years. However, greater awareness of the impact of industrial emissions in the U.S. has led to more stringent emissions requirements for U.S. industries, and necessitated the kind of equipment and know-how that AeriNOx possesses. For more information visit AeriNOx-Inc.com.

For more information about how SEO and web-based advertising can grow your business, please visit us at CustomerParadigm.com/SEO.

May 21, 2012

New FedEx Shopping Extension for Magento

Magento FedEx Extension FixOn May 31st, 2012 FedEx will be switching to a Web Service to supply shipping rates in Magento. This means users of Magento CE1.5x or less or EE1.10.x or less will no longer be able to retrieve FedEx shipping rates in Magento.

Fortunately, users can install the Magento FedEx fix extension to allow users of older versions of Magento to continue to retrieve FedEx shipping rates without upgrading to Magento 1.7.

Here are a few items that our developers have learned from our installations of the new FedEx shipping fix:

  1. You have to have the WebShopApps “Logger” extension installed for the FedEx extension to work (but after you’ve set up the FedEx extension you need to disable it per this article – http://wiki.webshopapps.com/webshopapps-logger)
  2. If you are using the “Home Delivery” option you need to set “Residential Delivery” to Yes or it will show as an error. You will need the following credentials to set up the account:
    ID: (Account number)
    – Production Password: (Provided in email once you sign up)
    – Production Meter Number: (provided in sign up success screen)
    – Key: (provided in sign up success screen)

Customer Paradigm is a full-service ecommerce solution featuring Magento website development. From 1 hour to 1000, we can help! For more information about setting up the FedEx shipping fix extension for your Magento store or upgrading to Magento 1.7, please call Customer Paradigm toll free at 888.772.0777 or contact us to speak to a real person now.

May 16, 2012

Google’s Knowledge Graph: Search Engine Channel Surfing

By Scott Belford, Internet Marketing Director

Today (Wednesday, May 16th, Google has rolled out the first version it’s Knowledge Graph. The Knowledge Graph enables Google users to search for things, people or places that Google “knows” about and instantly get relevant information in a “knowledge panel” in the upper right corner of their search result page. The contents of the knowledge panel varies for a given search query (and right now it only shows up for select search queries), but the purpose is to allow users to further refine their search results based on the intent of their query. A search for the word “buffalo” for instance, a yields a result that looks like this:

Google Knowledge Graph Buffalo Search

There’s a big “knowledge panel” on the right with a Google map of the city of Buffalo, NY, and some information and statistics about the city that Google has pulled from Wikipedia, and some links to points of interest. Note that the points of interest urls do not link to any web page, but another set up search results (with a corresponding “knowledge panel” that are relevant to the particular point of interest that you’ve selected. Below are some are other links to searches representing potential search intents that Google has anticipated it’s users may have when they type “buffalo” into their search bar, including “American Bison,” the “University of Buffalo,” and the “Buffalo Sabres” professional hockey team. Clicking on each option yields a new page of search results relevant to the particular category. Here is what I see if I click on “Buffalo Sabres,” for instance:

Google Knowledge Graph Buffalo Sabres

My search results have all changed to results that I would get from a search for “Buffalo Sabres,” and the knowledge panel on the right now has some information about the team, and links to search results for the city, coach, and a drop down menu showing search results for each player on the roster!

How is Google able to do this? Google boasts that it has compiled over 3.5 billion facts about the relationship with over 500 million objects. According to Amit Singhal, head of Google’s search department, Google is able to match each object in its database with the most searched-after associated facts. So for a search for “buffalo,” Google is able to anticipate a set of associations (American Bison, the City of Buffalo, the Sabres hockey team) that are based statistics and information that it’s compiled from millions of individual searches.

There will be much more on this topic. According to Singhal, Google has just scratched the surface of the complete implementation of Knowledge Graph. Right now, for instance, the Knowledge Graph based results are heavy on informational content but lacks actionable content (many users who search Buffalo Sabres, for instance, may be most interested in getting tickets to the next Buffalo Sabres game, and this information doesn’t seem to be included in the “knowledge panel” results), and it is not clear how and why Google selects the pages from which is culls images and content snippets for the “knowledge panels.” We will continue to follow this latest update from Google.

Customer Paradigm is a full service interactive agency specializing in search engine optimization, internet advertising, and website development for ecommerce. For more information, visit customerparadigm.com or contact us to speak to a real person now.

Jan 4, 2012

Building SEO-optimized E-Commerce Websites

In 2012, search engine optimization for ecommerce websites should start before the websites are even built. Updates to the search rankings algorithm associated with Google Panda and the rise of the social graph have made landing page hierarchy, usability, conversion rate, social engagement, and unique content more important than ever. Here are a few ways that you can get a head start on SEO for your ecommerce site.

 

Organize the site into categories that make sense for users and search engines.

 

Well-optimized product category pages are the most important SEO tool at the disposal of ecommerce websites. In 2012, Google and other search engines have placed a premium on unique, query-relevant content as a rankings factor. For sites that sell a variety of different products and services, creating targeted landing pages (pages created for the purpose of attracting a specific type of visitor) oriented around a keyword or group of keywords is critical to expanding search volume.

 

An ecommerce website selling snowboards, snowboarding gear, and accessories, for instance, may want to start organizing the site for SEO by dividing their products into broad categories that make sense from a user perspective. Dividing snowboards, snowboarding apparel, and snowboarding equipment are easy decisions from a user perspective, and allow for the creation of custom landing pages that attempt to engage the broadest search terms. Pages optimized for broad search terms, however, can’t hope to engage all of the more specific branded, product-type, or longer-tail search terms that your potential customers may be using to try and find the products that you sell. If you don’t optimize for more specific searches by creating more custom landing pages, you risk letting their business go to a competitor.

 

To gain insight into how I might organize my broader snowboard category, I consulted the Google Adwords keyword research tool. Here is my initial search:

SEO for ECommerce Sites

 

This search tells me how to organize my snowboard category. I can see that the highest volume searches are for snowboards by brand. K2, Burton, Salomon and others get by far the most searches. I know that I want to create custom landing pages for each of the major brands of snowboards that I sell, to draw in users searching for a specific brand. The second most searched metric seems to be “sale snowboards,” “discount snowboards,” or even “$150 snowboards.” This tells me that I want to create a category page with unique content and products that are on sale, to engage these search terms. Third, it tells me that the potential customers of my theoretical snowboard store are searching based on gender and age. “Kids snowboards” and “women’s snowboards” are popular search categories. So, I will want to create custom landing pages for kids, mens, and womens snowboards, to engage this search volume.

 

I’ll repeat this process for my Apparel and Accessories categories. So, after about an hour considering my business and some help from Google Adwords, I have a basic structure for organizing my ecommerce site. Here’s what I have:

 

Internet Marketing for ecommerce websites

 

Obviously, there is more research to be done and more variables to be considered than overall search volume, including competition, conversion rates, and profitability of different products, but you get the idea: Organize your site into categories and sub-category pages that makes sense from a common sense, usability perspective as well an SEO perspective.

 

*A note of caution: There are made-for-seo sites and made-for-seo sites. Creating a large number of landing pages to engage too many variations of similar keywords can hurt your site from a SEO perspective because you run the risk of duplicate content penalties, and hurt your usability (which also affects your search rankings) because it can create a bewilderingly large number of pages selling similar or identical products. Finding the right balance between SEO and usability is important, but error on the side of usability.

Here is a real-world example from our experience at Customer Paradigm:

 

Customer Paradigm does internet marketing and SEO for Discount Decorating, a large online retailer of wallpaper and wallpaper borders. In order to increase their organic search traffic, we built out their category and subcategory pages by creating static urls for pages that had previously been internal search result pages, and added unique content and meta data to most of the new category pages we had created. The new category pages allowed Discount Decorating to rank well for a wide variety of more specific and long-tail keywords. The impact was immediate and dramatic. Within two weeks, Discount Decorating’s organic search traffic had doubled, and sales jumped at a corresponding rate. Here is their traffic graph:

 

Search Engine Optimization for Ecommerce websites

Add SEO value to your landing and product pages with unique content

 

In 2012, the key to ranking well for Google and other search engines is uniqueness. This means each of your category and product pages should have unique text, images, schema.org or RDFA tagging, header tags, title tags, alt text, etc. Pages with duplicate content, meta descriptions, or title tags can negate the SEO value of your pages, and category page text or product descriptions copied from a manufacturers website can be very harmful. Search engines aren’t impressed with content that they can find elsewhere, and they may penalize you for it. You have to add something new and unique to climb up the rankings.

One great way to add uniqueness to your website as a whole is through a regularly updated blog. Include special offers, news, how-to guides, and other information relevant to your business and industry. Regularly updated content tells Google and other search engines that your site is an organic, growing site that is regularly adding unique content for its users. The search engines will reward you accordingly.

 

Usability is becoming increasingly important to ranking well and selling products

 

Not only is the usability of your site critical to your conversion rate (the % of people who visit your site who make a purchase), Google and other search engines are using increasing sophisticated ways to determine whether or not ecommerce sites are usable and using this analysis in their rankings calculations. Things like bounce rate, time spent on the site, number of pages viewed, and engagement metrics such as whether or not a person filled out a contact form, signed up for a newsletter, or made a purchase account for a significant portion of the search engine rankings algorithm in 2012.

The undisputed most important element to usability for ecommerce websites, particularly larger ecommerce websites, is the search feature. Almost every ecommerce site that sells more than a few products has a search tool that allows visitors to quickly find a product based on a series of custom filters. How quickly and with what precision a user can find the product they’re looking for often determines whether or not a visitor becomes a customer, and can go along way in determining the success of failure of an ecommerce site. Careful thought and attention must be paid to your search/filtering features.

*A note of caution: Many site owners and developers rely too much on search tools and other custom filters and ignore or under-develop their category pages. While search tools are great from user perspective, they don’t gain the SEO value that comes with category pages that have unique content and static urls that can be submitted in a sitemap. It’s important to keep both your users, and Google in mind when building an ecommerce site.

 

Prepare to engage with Social Media

Social media is a great way to interact with your existing customers and keep them coming back with updates, special offers, and other promotions. In 2012, social media signals can account for as much as 14-18% of the Google rankings algorithm: things like Google “+1s,” Facebook “likes,” and Twitter “mentions.” Adding social media buttons to your home page, category pages, and all product pages before the site is launced will give you a running start into social media.

 

SEO for ecommerce websites can be very competitive, but forethought, smart organizing, and awareness of SEO principles during the development of the site can allow your site to move up the search rankings faster, allowing you to make more money from you site sooner.

Customer Paradigm is a complete internet marketing agency for ecommerce websites, including search engine optimization, search advertising, and custom ecommerce website development. For more information, visit customerparadigm.com or call 303-473-4400 or contact us to speak to a real person now.

Dec 27, 2011

15th Street Studio

If you’re looking for a Boulder art gallery with a great selection of original contemporary artwork, check out 15th Street Studio, located on 15th and Arapahoe Streets in Boulder. They also do museum-quality custom framing, including preservation framing and conservation framing. The staff is extremely helpful, and they have been selling art and art framing in Boulder for over 25 years.
Dec 12, 2011

Magento Case Study: Integrating a 3rd Party API, Adding Affiliate Tracking, and Importing Products

By Senior Magento Developer Alan Barber

This week my team celebrated the completion of our most recent project: TeachMeToday.com. This is a heavily customized version of Magento which allows users the opportunity to pay for a membership which gives them access to over 400 eLearning courses.

    We developed the following custom functionality

 

  • Category and Product Import : TeachMeToday’s catalog was imported entirely from a 3rd party provider. We developed an extension to import a category hiearchy and assign products to these categories based on the external catalog. We also created a script to perform daily synching between the two catalog versions
  • Private Sales Functionality : We modified Magento so that a user must pay for a membership before they can view any of the eLearning courses
  • Recurring Memberships (Subscriptions) : We developed a custom extension which allows TeachMeToday to charge their active members on a monthly basis using Authorize.net’s CIM
  • Affiliate Landing Pages with Custom Checkout : My team integrated an external checkout path with TeachMeToday’s Magento installation. Essentially, affiliate traffic signs up on a highly optimized version of the Magento checkout (which is normally very clunky)
  • Affiliate Tracking / Reporting : We added some functionality to the Magento success page and admin area that tracks conversions and rejections

Each of these areas could have a full article written about them, but I will try and provide a few paragraphs about how we accomplished each

 

3rd Party Category and Product Import

This was probably the largest piece of the project. TeachMeToday had ~400 products and ~80 categories in an external catalog. Each of the products was essential an online “course” which launched a java application on the user’s computer. While we couldn’t import the java apps themselves, we could import the category hierarchy and metadata for individual courses. The process we developed for this is as follows:

 

  1. Create your module : We created a custom module in app/code/local.
  2. Add a sql update script to track custom data : Inside our module’s SQL directory we added an install script to add a custom attribute to both products and categories, which would serve to hold a serialized object representing metadata from our 3rd party catalog
  3. Add a helper to connect with the API : our 3rd party catalog provided a soap API to retrieve data. We created an API helper in our module which extended the php SoapClass. We used PHP’s magic functionsto allow the rest of our module to access API methods in the form of
    Mage::helper("apihelper")->{api_method_name}
    — cool huh? The the other objects in the module, the API calls were just regular method calls…our soap class had built in functions to handle soap faults as errors and to parse the soap response.
  4. Get a parsable version of the external catalog : In our case, this was a giant XML tree of the entire catalog: Magento XML Tree
  5. Recursively walk through the tree and update the catalog: This is a big step. A few things were invloved:
    1. I wrote models to represent the different types of nodes in the xml tree : In the external catalog, categories were tagged as “groups” and products tagged as “assets”. I wrote some models which extracted relevent data from each of these node types
    2. I wrote a model to represent the tree as a whole : We needed a model to poll the 3rd party service, retrieve the tree as xml, parse it into php SimpleXML and then recursively walk down each branch of the tree. Depending on the current node’s type, a different operations was performed
    3. I wrote helper models to map the xml nodes into Magento models : Helper were created which took in a <group> and mapped it into a category (in the appropriate place in the category tree) and took an <asset> tag and mapped it into a product (and assigned it to the correct category). The helpers were also smart enough to make a distinction between: creating a new model and updating an existing model
    4. Handle errors : Seems simple, but you ABSOLUTELY NEED functions built in to methodically log and report errors. We could not have done this process without such logic. Magentohas a wonderful function:
      Mage::log({message}, null, {filename})
      which allows you to put a custom log at var/log/{filename}
  6. Setup a cron job to recursively walk through the tree every night : In case the 3rd party catalog changed, we wanted our catalog to represent those changes. So we setup a cron in our config.xml to update the tree every night. Magento Crontab

Private Sales Functionality

TeachMeToday is based on a membership which gives users access to all products in the system. Be default, the community edition of Magento doesn’t enable this functionality. However it is surprisingly simple to implement this:

 

  1. Rewrite the customer account controller in your module’s config.xml
  2. Override the creatAction() in AccountController.php : In our case, we overwrote the create action to redirect the user to one of our landing pages so they could sign up. In this way, a user cannot navigate to /customer/account/create and get a new account…no matter how many times they try, they will alows get redirected to our custom landing pages Magento Controller Overload
  3. Remove the “launch course” option for user’s that aren’t active in the system: All of TeachMeToday’s products are virtual courses, and as part of the private sales piece, we needed to make sure a user that didn’t have a membership (or had an expired membership) could not launch the courses. We created a helper that checks a special customer attribute which is a Boolean flag specifying whether or not the user was active. So we use
    Mage::getSingleton("customer/session")->getCustomer()
    to grab the current customer instance and check their is_active flag.
  4. Update the customer flag when a user signs up for a membership: We created a custom event for this. On our landing pages (which have custom checkout functionality) we call
    Mage::dispatchEvent("our_custom_event", array("customer" => $customer))
    which passes the newly-signed-up customer to our custom module (which then updates the appropriate customer attributes). We created a similar event for when the customer is deleted or fails billing.

Recurring Memberships (Subscriptions)

We needed a way to continually charge customers (since the product they were purchasing was a monthly membership/subscription). However, it requires a lot of legwork and special infrastructure to store credit cards with and be PCI Compliant — and the community edition of Magento is not PCI compliant. Therefore, we decided to use Authorize.net’s CIM. CIM allows you as merchant to store credit card information on authorize.net’s servers, and then provides you a handle for each customer with which you can rebill them without storing their info — cool huh?
Our process was as follows:

 

  1. Create the CIM customer and payment profiles when the user signs up, and store the CIM token (handle) : We used the IDP Magento Extension to handle the requests to authorize.net (no point in reinventing the wheel, and this module does a great job creating a Magento Paygate-mapping to authorize.net).
  2. Create a cron task to bill customers: My team created a script (which runs nightly) that does a few things:
    1. Check which customers are due for a rebill : Using varien data collections we find a list of all customers which are due for a re-bill
    2. Attempt to rebill appropriate customers through their CIM token : try and bill the customer through their CIM handle (which bills them based on the credit card info they have stored in authorize.net)
    3. If payment failed, change their “is_active” flag, if not, create a new order

Magento Affiliate Landing Pages with Custom Checkout

>We needed a number of different landing pages for TeachMeToday to AB test affiliate traffic to. These landing pages needed to be highly optimized for conversions. The process for creating landing pages that could create orders in Magento was as follows:

 

Magento Custom CheckoutCreate CMS Pages with each landing page URL

    : If you wanted your landing page to be: TeachMeToday.com/signup-now, you would make a cms page with URL identifier of “signup-now”
  1. Set the CMS page layout to empty
  2. Add custom stylesheets via layout xml in cms_page–>design : If you need custom styles, you can add them on a per landing page basis there
  3. Create a phtml block in the CMS page to place your landing page code in : We had vastly different looking landing pages…which were all their own layout. The way I did this was to place a block as the sole content in each CMS page as: {{block type=”page/html” name=”signup.now.page” as = “signupNowPage” template=”landing/signup_now/body.phtml”}} Now the page would load its content from my custom phtml file:
  4. Create your custom checkout controller that your landing page submits to : This step is a pain in the @!@ … essentially you need to replicate everything Magentodoes when it creates an order, which is as follows:
    1. Validate customer billing info
    2. Create a new customer with an auto-generated password
    3. Create a quote model and load it with customer and product data : You will need to assign the quote to a customer and add a product to the quote. I’m not going to go into detail on how to do it as its a complicated process. Googling for “create a Magento order programatically” returns some relevent results
    4. Use a service quote to attempt to transform the quote into an order (and therefore charge the customer’s credit card)
    5. If the service quote threw an error, notify the user their payment info was invalid. Otherwise, get the new order from the service quote and move the user to /checkout/onepage/success

Magento Affiliate Tracking / Reporting

Since TeachMeToday receives a large amount of affiliate traffic, they needed to do a few things:

 

  • Store email addresses of leads: Even if a user didn’t not checkout, we needed to store all the email addresses that came through. We did this by associating everyone who comes through the site as a newsletter subscriber (
    Mage::getModel("newsletter/subscriber")
    )
  • Track conversions: Magento by default has a .phtml file in template/checkout/onepage/success.phtml that gets loaded on the checkout confirmation page. This is a great place to drop in tracking pixels or javascript for affiliate tracking (most affiliates will require their tracking pixel on the confirmation page). We passed in the current affiliate’s id in the url string to the confirmation page (as /checkout/onepage/success?aid={affiliate_id}). We then logged every order that had an affiliate id set in a custom table in our database (calling
    Mage::getSingleton("checkout/session")->getLastRealOrderId() will give you the order id).
  • Create reports in the back end of Magento : I’m not going to go into how to add reports to the adminhtml. However, we used the aforementioned table that we stored aid=>order_id associations in to populate several custom reports for each affiliate

Conclusion

I’ve outlined a lot of complicated processes above. It was a considerable amount of work—but it goes to show how Magento’s modular structure allows you to do just about anything with it (and how awesome our Customer Paradigm Team is!).
Alan Barber is a Senior Magento Programmer at Customer Paradigm who specializes in systems architecture and application troubleshooting. For more information, or to get Magento help now, visit customerparadigm.com.

Dec 2, 2011

Magento Wishlist Module . . . Stop Playing Around With Me

by Customer Paradigm Magento programmer Brandon Lemire Configuring MagentoMagento Wishlist Module, why are you only showing your name? Don’t you realize that you are not of use if you don’t let us in, give use some information about yourself? When My Wishlist is clicked, the expectation is that one will see a list of items tucked away to review at a later date. What does one see? The home page . . . what is up with that? After a “Why are you doing this to me?” the search began for a solution to this issue. Many questions similar to mine were returned by our favorite answer man, Google, and yet only vague solutions were provided. One discussion seemed to intimate that this was a bug in the Magneto code base . . . but there was no reference to a bug report nor a patch provided to resolve the issue. None of the suggested solutions provided the key to unlock the list of items secretly held by My Wishlist. Are you kidding? Does anyone have a solution? This treasure trove of information is held by a key member of the Magento core and to not have access has become unbelievably frustrating. Can you relate? Are you ready to pull out your hair? Well, take a deep breathe and read on … as the issue was due a breakdown in communication between My Wishlist and the rest of the core Links group they belong to. Here is how we helped My Wishlist to communicate nicely with the core Links group. You need to navigate to app/code/core/Mage/Wishlist/Block/Links.php add the function public function getUrl() { Return $this->_url; } Now My Wishlist will allow us now to see the information once hidden. For more information about configuring modules in Magento , or for Magento Programming help now, visit customerparadigm.com/ or contact us to speak to a real person about Magento web development.
Nov 18, 2011

Adapting Google Content to Magento 1.5.0.1

by James Slahor, Customer Paradigm Magento Programmer

Configuring Magento to incorporate Google Content post-Magento Base

Hi everybody. Today I want to talk about a process that I used to adapt Magento to incorporate Google Content for a site called Love ‘n Lace (http://www.lovenlace.com/). I hope that you will find this information useful.

Installing the right Magento extension key

I started by uninstalling the previous Google shopping extension via Magento Connect. Next, I used the the http://connect20.magentocommerce.com/community/Mage_GoogleShopping-0.2.12 extension key to install the extension. This key is compatible with Magento 1.5.0.1.

Creating a new Magento product attribute

Magento Ecommerce Programming Help

After I had installed the extension, I added a new product attribute: ‘availibility.’ (Catalog -> Attributes -> Manage Attributes). drop-down (as opposed to text field) required values = yes scope = global apply to all product types Manage Label / Options Manage Titles Admin = Availability Manage Options 1. ‘in stock,’ position 0, default value 2. ‘available for order,’ position 1 3. ‘out of stock,’ position 2 4. ‘preorder,’ position 3 I then added ‘availability’ under the Default attribute set (Catalog -> Attributes -> Manage Attribute Sets) under the ‘general’ category.

Managing My Magento Products

After I added my new attribute, I went to Catalog -> Manage Products (Love n’ Lace currently has Enhanced Manage Products), and applied the default ‘availability’ values to all products. Since ‘in stock’ is the default value, this forced all products to have ‘availability’ = ‘in stock.’ Next, I went to Catalog -> Google Content -> Manage Attributes, and set default attribute mapping. a. Attribute = Availability, Google Content Attribute = Availability b. Attribute = Price, Google Content Attribute = Price c. Attribute = Product Type, Google Content Attribute = Product Type (Category) d. Attribute = Color, Google Content Attribute = Color

Submitting Google Content

Finally, I went to Catalog -> Google Content -> Manage Items. a. View Available Products b. Select all available products c. Actions -> add to Google content d. Submit! This process may take a while depending on how many products you applied the ‘availability’ attribute to and how many products you are uploading. For Love n’ Lace, about 3000 products took about 20-25 minutes to run successfully. For more information, or for Magento Programming help now, call us at 888.772.0777 or contact us to speak with a real person.