How to Manually Integrate IndexNow with Shopify for Faster Indexing (No Code)

Boosting your Shopify store’s search engine visibility is crucial, and IndexNow helps by instantly notifying search engines when your store’s content is updated. You can manually create webhooks to integrate IndexNow with Shopify. This step-by-step guide will show you how to set up webhooks for product and collection updates in Shopify.
Contents
Why Use IndexNow Webhooks in Shopify?
IndexNow enables search engines like Bing to quickly discover and index new or updated content on your website. By setting up Shopify webhooks, you ensure that:
- New and updated products get indexed faster.
- Collections are refreshed in search results more efficiently.
- Your store maintains strong visibility in search engines.
Steps to Manually Create Webhooks in Shopify

Step 1: Set Up Webhooks in Shopify
- Log in to your Shopify Admin dashboard.
- Click on Settings in the left-hand menu.
- Select Notifications.
- Scroll down to the Webhooks section.
Step 2: Create a Webhook for Collections
- Click “Create Webhook”.
- Under Event, select “Collection Create”.
- Under Format, select JSON.
- In the URL field, enter
https://www.kiaora.digital/indexnow/shopify-webhook.php?domain=[YOUR_STORE_DOMAIN]
&type=collections- Replace
[YOUR_STORE_DOMAIN]
with your store’s actual domain.
Example:https://www.kiaora.digital/indexnow/shopify-webhook.php?domain=www.example.com
&type=collections- If your store is on www (e.g.,
www.example.com
), keepwww.
in the domain. - If your store is on a subdomain (e.g.,
store.example.com
), keep the subdomain as it is. - If your store is on a root domain (e.g.,
example.com
), do not addwww.
.
- If your store is on www (e.g.,
- Replace
- Under Webhook API version, choose the latest stable version.
- Click Save.
- Repeat the steps above to create another webhook, but this time: Under Event, select “Collection Update”.
- Click Save again.
Step 3: Create a Webhook for Products
- Click “Create Webhook”.
- Under Event, select: “Product Create”
- Under Format, select JSON.
- In the URL field, enter
https://www.kiaora.digital/indexnow/shopify-webhook.php?domain=[YOUR_STORE_DOMAIN]
&type=products- Replace
[YOUR_STORE_DOMAIN]
with your store’s actual domain.
Example:https://www.kiaora.digital/indexnow/shopify-webhook.php?domain=www.example.com
&type=products- If your store is on www (e.g.,
www.example.com
), keepwww.
in the domain. - If your store is on a subdomain (e.g.,
store.example.com
), keep the subdomain as it is. - If your store is on a root domain (e.g.,
example.com
), do not addwww.
.
- If your store is on www (e.g.,
- Replace
- Under Webhook API version, choose the latest stable version.
- Click Save.
- Repeat the steps above to create another webhook, but this time: Under Event, select “Product Update”.
- Click Save again.
This screenshot below shows the correct webhook configurations for Collection Creation, Collection Update, Product Creation, and Product Update.

Step 4: Confirm Webhook Activity & Logs
After Shopify begins sending webhooks (when you update product or collection pages), you can verify if URLs are being submitted to IndexNow by checking your log file:
Log file URL format: https://www.kiaora.digital/indexnow/logs/[YOUR_STORE_DOMAIN]/indexnow_log.txt
Example for www.example.com
: https://www.kiaora.digital/indexnow/logs/www.example.com/indexnow_log.txt
✅ If the log file updates, your Shopify webhooks are working correctly!
❌ If the file is empty, check Shopify’s Webhook Delivery status in Settings > Notifications.
This Webhook URL Generator below simplifies the process by instantly generating the correct webhook URLs for your store based on your domain. Instead of manually formatting URLs, simply enter your store’s domain, and the tool will create properly structured webhook URLs for Collection Create, Collection Update, Product Create, and Product Update events.
Generate Webhook URLs
By setting up these webhooks, your Shopify store will automatically notify IndexNow when new products or collections are added or updated. This helps search engines index your pages faster, improving your SEO performance and keeping your store visible in search results.
Bonus: Hosting the Shopify Webhook Script on Your Server
If you want to host the shopify-webhook.php
file on your own server instead of using https://www.kiaora.digital/indexnow/shopify-webhook.php
, use this code
<?php
// Get domain from URL
$storeDomain = isset($_GET['domain']) ? $_GET['domain'] : "unknown";
$type = isset($_GET['type']) ? $_GET['type'] : "";
// Define log directory path
$logDir = __DIR__ . "/logs/" . preg_replace("/[^a-zA-Z0-9\.-]/", "_", $storeDomain); // Replaces special characters
// Ensure the directory exists (create if not)
if (!is_dir($logDir)) {
mkdir($logDir, 0777, true); // Create directory with full permissions
}
// Define log file path
$logFile = $logDir . "/indexnow_log.txt";
// Get Shopify store domain from webhook URL query parameter
$shopifyStoreDomain = isset($_GET['domain']) ? "https://" . $_GET['domain'] : "";
// Set IndexNow API Key
$indexNowApiKey = "IndexNow_API_Key"; // Replace with your actual key
// Read Shopify webhook request body
$requestBody = file_get_contents('php://input');
$shopifyData = json_decode($requestBody, true);
// Initialize $url
$url = "";
// Check if the webhook contains a collection or product URL
if (!empty($shopifyStoreDomain) && !empty($type) && isset($shopifyData['handle'])) {
// Construct collection or product URL manually
$url = $shopifyStoreDomain . "/" . $type . "/" . $shopifyData['handle'];
} else {
file_put_contents($logFile, date("Y-m-d H:i:s") . " - No valid URL found\n", FILE_APPEND);
http_response_code(400);
echo json_encode(["error" => "No valid URL found in webhook data"]);
exit();
}
// Send the URL to IndexNow using cURL
$indexNowUrl = "https://www.bing.com/indexnow?key=" . $indexNowApiKey . "&url=" . urlencode($url);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $indexNowUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Log IndexNow response
file_put_contents($logFile, date("Y-m-d H:i:s") . " - Submitted to IndexNow. Generated URL: " . $url . ". Response Code: " . $httpCode . " - Response: " . $response . "\n", FILE_APPEND);
// Return success response
http_response_code(200);
echo json_encode(["message" => "Successfully submitted to IndexNow", "url" => $url, "shopify_store" => $shopifyStoreDomain, "response_code" => $httpCode]);
?>