You can use the Inventories sub-API to indicate that your products are available
in physical stores. To learn about the migration from Content API for Shopping,
see Migrate inventory
management
.
Local products require some additional information, like storeCode
and availability
. For more information on the fields you can provide, see Local
inventory data specification
.
Key term: In the Inventories sub-API, products you sell in physical stores are called local products.
Here are the steps to add in-store information to your local products:
Connect your business to Merchant Center
You need a Business Profile and merchant account to list local products on Google.
Set up your accounts for local product listings, and Configure your account for local inventory .
After setting up your accounts, Link your Business Profile and Merchant Center account .
Sign up for free local listings
After linking a Business Profile to your Merchant Center account, you can enroll in free local listings . Make sure you follow the free listings policies .
By participating in free local listings , your in-store products can appear in free listings across Google properties.
Verify you have local products
Before inserting local inventories to products you should check that you have products targeting local (physical stores) destinations (also known as Marketing methods ).
Insert in-store information
After you have added local products in your Merchant Center account, you can add
in-store information like store_code
, price
and availability
. Here's a
sample you can use to add in-store information to a product with localInventories.insert
:
Java
import
com.google.api.gax.core.FixedCredentialsProvider
;
import
com.google.auth.oauth2.GoogleCredentials
;
import
com.google.shopping.merchant.inventories.v1.InsertLocalInventoryRequest
;
import
com.google.shopping.merchant.inventories.v1.LocalInventory
;
import
com.google.shopping.merchant.inventories.v1.LocalInventoryAttributes
;
import
com.google.shopping.merchant.inventories.v1.LocalInventoryAttributes.Availability
;
import
com.google.shopping.merchant.inventories.v1.LocalInventoryServiceClient
;
import
com.google.shopping.merchant.inventories.v1.LocalInventoryServiceSettings
;
import
com.google.shopping.type.Price
;
import
shopping.merchant.samples.utils.Authenticator
;
import
shopping.merchant.samples.utils.Config
;
/** This class demonstrates how to insert a Local inventory for a given product */
public
class
InsertLocalInventorySample
{
private
static
String
getParent
(
String
accountId
,
String
productId
)
{
return
String
.
format
(
"accounts/%s/products/%s"
,
accountId
,
productId
);
}
public
static
void
insertLocalInventory
(
Config
config
,
String
productId
,
String
storeCode
)
throws
Exception
{
GoogleCredentials
credential
=
new
Authenticator
().
authenticate
();
LocalInventoryServiceSettings
localInventoryServiceSettings
=
LocalInventoryServiceSettings
.
newBuilder
()
.
setCredentialsProvider
(
FixedCredentialsProvider
.
create
(
credential
))
.
build
();
String
parent
=
getParent
(
config
.
getAccountId
().
toString
(),
productId
);
try
(
LocalInventoryServiceClient
localInventoryServiceClient
=
LocalInventoryServiceClient
.
create
(
localInventoryServiceSettings
))
{
Price
price
=
Price
.
newBuilder
().
setAmountMicros
(
33_450_000
).
setCurrencyCode
(
"USD"
).
build
();
InsertLocalInventoryRequest
request
=
InsertLocalInventoryRequest
.
newBuilder
()
.
setParent
(
parent
)
.
setLocalInventory
(
LocalInventory
.
newBuilder
()
.
setStoreCode
(
storeCode
)
.
setLocalInventoryAttributes
(
LocalInventoryAttributes
.
newBuilder
()
.
setAvailability
(
Availability
.
OUT_OF_STOCK
)
.
setPrice
(
price
)
.
build
())
.
build
())
.
build
();
System
.
out
.
println
(
"Sending insert LocalInventory request"
);
LocalInventory
response
=
localInventoryServiceClient
.
insertLocalInventory
(
request
);
System
.
out
.
println
(
"Inserted LocalInventory Name below"
);
System
.
out
.
println
(
response
.
getName
());
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
e
);
}
}
public
static
void
main
(
String
[]
args
)
throws
Exception
{
Config
config
=
Config
.
load
();
// An ID assigned to a product by Google. In the format
// channel:contentLanguage:feedLabel:offerId
String
productId
=
"local:en:label:1111111111"
;
// The code uniquely identifying each store.
String
storeCode
=
"Example1"
;
insertLocalInventory
(
config
,
productId
,
storeCode
);
}
}
cURL
curl --location
'https://merchantapi.googleapis.com/inventories/v1/accounts/987654321/products/en~US~12345/localInventories:insert' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <API_TOKEN>' \
--data '{
"storeCode": "123456",
"localInventoryAttributes": {
"price": {
"amountMicros": "33450000",
"currencyCode": "USD"
},
"availability": "OUT_OF_STOCK"
}
}'
PHP
use Google\ApiCore\ApiException;
use Google\Shopping\Merchant\Inventories\V1\LocalInventory;
use Google\Shopping\Merchant\Inventories\V1\Client\LocalInventoryServiceClient;
use Google\Shopping\Merchant\Inventories\V1\InsertLocalInventoryRequest;
use Google\Shopping\Merchant\Inventories\V1\LocalInventoryAttributes;
use Google\Shopping\Merchant\Inventories\V1\LocalInventoryAttributes\Availability;
use Google\Shopping\Type\Price;
/**
* Class to insert a `LocalInventory` to a given product in your
* merchant account.
*
* Replaces the full `LocalInventory` resource if an entry with the same
* [`storeCode`]
* [google.shopping.merchant.inventories.v1beta.LocalInventory.storeCode]
* already exists for the product.
*
* It might take up to 30 minutes for the new or updated `LocalInventory`
* resource to appear in products.
*/
class InsertLocalInventory
{
// ENSURE you fill in the merchant account and product ID for the sample to
// work.
private const PARENT = 'accounts/[INSERT_ACCOUNT_HERE]/products/[INSERT_PRODUCT_HERE]';
// ENSURE you fill in store code for the sample to work.
private const LOCAL_INVENTORY_STORE_CODE = 'INSERT_STORE_CODE_HERE';
/**
* Inserts a local inventory underneath the parent product.
*
* @param string $parent The account and product where this inventory will be inserted.
* Format: `accounts/{account}/products/{product}`
* @param string $localInventoryRegion
* ID of the region for this
* `LocalInventory` resource. See the [Local availability and
* pricing](https://support.google.com/merchants/answer/9698880) for more details.
*/
public function insertLocalInventorySample(
string $parent,
string $localInventoryStoreCode
): void {
// Gets the OAuth credentials to make the request.
$credentials = Authentication::useServiceAccountOrTokenFile();
// Creates options config containing credentials for the client to use.
$options = ['credentials' => $credentials];
// Creates a client.
$localInventoryServiceClient = new LocalInventoryServiceClient($options);
// Creates a price object.
$price = new Price(
[
'currency_code' => "USD",
'amount_micros' => 33450000,
]
);
// Creates a new local inventory object.
$localInventory = (new LocalInventory())
->setStoreCode($localInventoryStoreCode)
->setLocalInventoryAttributes((new LocalInventoryAttributes())
->setAvailability(Availability::IN_STOCK)
->setPrice($price));
$request = (new InsertLocalInventoryRequest())
->setParent($parent)
->setLocalInventory($localInventory);
// Calls the API and catches and prints any network failures/errors.
try {
/** @var LocalInventory $response */
$response = $localInventoryServiceClient->insertLocalInventory($request);
printf('Response data: %s%s', $response->serializeToJsonString(), PHP_EOL);
} catch (ApiException $ex) {
printf('Call failed with message: %s%s', $ex->getMessage(), PHP_EOL);
}
}
/**
* Helper to execute the sample.
*/
public function callSample(): void
{
// Makes the call to insert the local inventory to the parent product
// for the given region.
$this->insertLocalInventorySample($this::PARENT, $this::LOCAL_INVENTORY_STORE_CODE);
}
}
$sample = new InsertLocalInventory();
$sample->callSample();