How Local Product Availability on Google Place Pages Is Looking Like

Yesterday, Google announced that merchants could now include local products directly on their Places Page. This is part of a long term trend to provide significantly more granular and time based information about local businesses on-line. This has long been part of Google’s local vision that has finally materialized in a way that local merchants can now take advantage of.

When and where is this information highlighted? What are the implications for local search marketing? Is there a local marketing opportunity now? Can a small merchant take advantage of the opportunity?

The local product information seems to currently surface at this point only on general product searches not on geo specific searches. IE the search for “Digital Cameras” will return a local product result but a search for “Digital Cameras Buffalo NY” will not. The results show above the fold as the 3rd or 4th search result. In that sense it provides potential for increased visibility to local retailers on high volume head terms.

If one clicks on the Nearby Stores link under a given product, it takes the user to a screen that displays the product pricing and location prominently on a large map:

The good news is that this, at least at present, provides very high visibility to those stores that have taken advantage of Google’s Local Product Search capability. The bad news is Google’s prominent (and somewhat deceptive) display of the link to the lowest online price of $900. As in most online lowest prices, this one comes with the caveat of being available at eBay but not including a box and was in actuality not new but a display model.

It seems unlikely that the user would proceed from Google’s inventory map into Places as phone, address and directions are offered at this level. If a user were to go deeper the user would see a Places page with 5 products from the merchant prominently displayed:

Will small merchants be able to take advantage of this feature? The current Google Local Shopping inclusion rules seem to preclude stores with less than 10 locations (although that is not totally clear). For most small merchants Google’s requirement that a product list be updated weekly and prices and quantities be updated daily would require both sophisticated inventory control and the ability to generate the upload formats for Google. Even if Google allows single stores to participate, it is unlikely that many would have the inventory system in place to do so.

If Google does allow single store participation (I have the question into Google), it is conceivable that a small merchant could participate without a fully automated system with a small excel based inventory and 5 minutes a day.

I will be interested to hear of cases of smaller merchants participating in the program. Have any of your smaller, local clients been uploading their data to Google’s product search? What benefits, if any, have they seen?

Related posts:

  1. GoogleBase and Local Business Center experiment to encourage more LBC participation?
  2. The Rubicon has Been Crossed -Local Pages as Transaction Interface
  3. TomTom rolls out new mapping product, announces 5 millionth user edit

Google Search: Meow Me Now

Search using your location is extremely helpful while on the go. Today, we’re excited to announce Meow Me Now, a new feature that lets you find the kittens that are near you. You can find kittens either by searching for [kittens] on google.com on your Android or iOS device, or by using the Near Me Now drop-down feature on the Google homepage.

Voice search to locate nearby kittens will also work on Android devices, and iOS devices with the Google Search App, so try meowing into your phone to find the kittens near you.

Android: Identifying App Installations

In the Android group, from time to time we hear complaints from developers about problems they’re having coming up with reliable, stable, unique device identifiers. This worries us, because we think that tracking such identifiers isn’t a good idea, and that there are better ways to achieve developers’ goals.

Tracking Installations

It is very common, and perfectly reasonable, for a developer to want to track individual installations of their apps. It sounds plausible just to call TelephonyManager.getDeviceId() and use that value to identify the installation. There are problems with this: First, it doesn’t work reliably (see below). Second, when it does work, that value survives device wipes (“Factory resets”) and thus you could end up making a nasty mistake when one of your customers wipes their device and passes it on to another person.

To track installations, you could for example use a UUID as an identifier, and simply create a new one the first time an app runs after installation. Here is a sketch of a class named “Installation” with one static method Installation.id(Context context). You could imagine writing more installation-specific data into the INSTALLATION file.

[php] public class Installation {
private static String sID = null;
private static final String INSTALLATION = "INSTALLATION";

public synchronized static String id(Context context) {
if (sID == null) {
File installation = new File(context.getFilesDir(), INSTALLATION);
try {
if (!installation.exists())
writeInstallationFile(installation);
sID = readInstallationFile(installation);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return sID;
}

private static String readInstallationFile(File installation) throws IOException {
RandomAccessFile f = new RandomAccessFile(installation, "r");
byte[] bytes = new byte[(int) f.length()];
f.readFully(bytes);
f.close();
return new String(bytes);
}

private static void writeInstallationFile(File installation) throws IOException {
FileOutputStream out = new FileOutputStream(installation);
String id = UUID.randomUUID().toString();
out.write(id.getBytes());
out.close();
}
}[/php]

Identifying Devices

Suppose you feel that for the needs of your application, you need an actual hardware device identifier. This turns out to be a tricky problem.

In the past, when every Android device was a phone, things were simpler: TelephonyManager.getDeviceId() is required to return (depending on the network technology) the IMEI, MEID, or ESN of the phone, which is unique to that piece of hardware.

However, there are problems with this approach:

Non-phones: Wifi-only devices or music players that don’t have telephony hardware just don’t have this kind of unique identifier.
Persistence: On devices which do have this, it persists across device data wipes and factory resets. It’s not clear at all if, in this situation, your app should regard this as the same device.
Privilege:It requires READ_PHONE_STATE permission, which is irritating if you don’t otherwise use or need telephony.
Bugs: We have seen a few instances of production phones for which the implementation is buggy and returns garbage, for example zeros or asterisks.
Mac Address

It may be possible to retrieve a Mac address from a device’s WiFi or Bluetooth hardware. We do not recommend using this as a unique identifier. To start with, not all devices have WiFi. Also, if the WiFi is not turned on, the hardware may not report the Mac address.

Serial Number

Since Android 2.3 (“Gingerbread”) this is available via android.os.Build.SERIAL. Devices without telephony are required to report a unique device ID here; some phones may do so also.

ANDROID_ID

More specifically, Settings.Secure.ANDROID_ID. This is a 64-bit quantity that is generated and stored when the device first boots. It is reset when the device is wiped.

ANDROID_ID seems a good choice for a unique device identifier. There are downsides: First, it is not 100% reliable on releases of Android prior to 2.2 (“Froyo”). Also, there has been at least one widely-observed bug in a popular handset from a major manufacturer, where every instance has the same ANDROID_ID.

Conclusion

For the vast majority of applications, the requirement is to identify a particular installation, not a physical device. Fortunately, doing so is straightforward.

There are many good reasons for avoiding the attempt to identify a particular device. For those who want to try, the best approach is probably the use of ANDROID_ID on anything reasonably modern, with some fallback heuristics for legacy devices.