# Send Yotpo review requests when Shopify orders ship

> The moment an order is fulfilled, we register it with Yotpo so the review request is timed off real delivery, and we log every sync so failures never go unnoticed.

- Workflow type: code
- Services: Shopify, Yotpo, Google Sheets
- Categories: Operations, Marketing
- Published: 2026-08-10

## What it does

- Picks up every Shopify order the moment it is marked fulfilled, with no schedule to wait for and nothing to run by hand.
- Hands Yotpo the whole picture in one go: the order, the products that were bought, the customer, and the shipping details, so Yotpo can time its review request off when the parcel actually arrives instead of when the order was placed.
- Skips test orders and any order with no customer email address, so you are not chasing reviews that could never be sent anyway.
- Adds a row to a Google Sheet for every order it handles, recording the order number, customer, products, fulfillment date and whether Yotpo accepted the sync, so a failed handoff is visible rather than silent.

## What you'll need

- A Shopify store you can connect, with access to read orders and fulfillments.
- A Yotpo account with reviews set up, plus the store ID and secret from your Yotpo store settings.
- A Google account and a spreadsheet to use as the audit log.
- Shopify configured to notify us when an order is fulfilled, which is a standard notification setting in your store admin.

## Prompt

When Shopify tells me an order has been fulfilled, register that order in Yotpo so the review request actually goes out, and keep a log I can audit. Trigger this from a Shopify webhook for order fulfillment, and take the order ID from the webhook payload as the starting point for everything else.

Using that order ID, call Shopify Get Order to pull the full order, including line items and customer details. Then call Shopify List Fulfillments for Order to confirm the fulfillment really exists and to pick up the fulfillment date and tracking information. Use every fulfillment on the order, so orders that ship in multiple parcels are handled correctly rather than only the first shipment being recorded.

Before syncing anything, apply two filters. Skip test orders, and skip any order that has no customer email address, since Yotpo has no way to request a review without somewhere to send it. When an order is skipped, do not treat it as a failure; it simply does not need to go to Yotpo.

Push everything into Yotpo with Send Aggregated Order Info. This is the right call because it registers the order, its products and its fulfillment state in one batch, rather than requiring separate product and order syncs. Passing the fulfillment state is the whole point: it lets Yotpo time the review request off real delivery data instead of the purchase date, so the customer is asked once they have actually received the product.

Use the Shopify order ID as the external ID on the Yotpo side. In Yotpo, external_id is the merchant's own identifier while yotpo_id is Yotpo's generated one, so keying on the Shopify order ID is what makes this idempotent: re-sending the same fulfillment updates the existing Yotpo order instead of creating a duplicate. That means a retry after a failure is always safe.

After each attempt, append a row to Google Sheets with Append Values recording the order number, customer email, the products on the order, the fulfillment date and the Yotpo sync result. Write a row whether the sync succeeded or failed, and put the error detail in the result column when it failed, so problems are visible rather than silent and I can go back and re-send the ones that did not land.

Handle Yotpo rate limiting deliberately. The Yotpo Core v3 API is capped at 5 requests per second per store and returns a 429 with a RateLimit-Reset header telling you how many seconds until the limit resets. Back off and retry when that happens, and if the order still cannot be synced, log it as a failed row so it can be retried later rather than being dropped.

## How to customize

- Narrow which orders qualify, for example only orders above a certain value, only specific product lines, or only certain shipping destinations.
- Add more columns to the log, such as order total, shipping country, or the carrier handling the delivery.
- Point the log at a different spreadsheet or tab, and keep a filtered view of failed syncs so re-runs are easy to spot.

## FAQ

### Will this create duplicate orders in Yotpo if an order is fulfilled more than once?

No. Each order is filed in Yotpo under its Shopify order ID, so sending the same order again updates the record that is already there instead of creating a second copy. That makes it safe to re-run for orders that failed the first time.

### Does this send the review request email itself?

No. Yotpo owns the sending and the timing. This workflow makes sure Yotpo has the order, the products and the delivery information it needs, so your existing review request flow can fire at the right moment.

### Why time review requests off delivery instead of the order date?

Because someone cannot review a product that has not arrived yet. Timing off fulfillment means the request lands once the customer has actually had the product in hand, which is when they are most likely to leave a review and least likely to be annoyed by the ask.

### What happens if the sync to Yotpo fails?

The failure is written to the log alongside the order number and customer, so you can see exactly which orders did not make it through and send them again. Nothing fails quietly.

### Does it handle orders that ship in more than one parcel?

Yes. We look at every fulfillment recorded against the order, so partially shipped orders and multi parcel orders are picked up with their shipping and tracking details.

Use this prompt in General Input: https://www.generalinput.com/prompts/send-yotpo-review-requests-when-shopify-orders-ship