# Product ResourceFeedback
Product ResourceFeedback is only for use with the Sales Channel SDK.
You can send feedback on a product to let merchants know what steps they need to take to make sure your app is set up correctly.
Feedback can have one of two states: requires_action
or success
.
You will need to send a requires_action
feedback request for each step that the merchant is required to complete.
If there are multiple setup steps requiring merchant action, send feedback with a state of requires_action
as merchants complete prior steps.
Send a success feedback request to remove the feedback message from Shopify admin.
Sending feedback replaces previously sent feedback for the Shop. Unlike REST-style APIs, you don't need to make a PATCH or PUT request to update any previously sent feedback. Send a new POST request to push the latest state of a shop or its resources to Shopify.
If your state is requires_action
you can send up to ten string messages, which communicate the action to be taken by the
merchant. Each string must be a single message up to 100 characters long, must start with a capital letter (but not use all caps), and must end with a period.
You must adhere to the message formatting rules or your requests will fail:
Examples:
Needs at least one image.
Needs to be a shippable product.
Merchants viewing individual products will see your app's messages as a bulleted list of errors.
Other user interfaces in Shopify admin will report statistics like the number of errors your app has
reported.
Once the merchant has made a single or a series of updates to validate the product,
your app can send a status ofsuccess
.
A concise set of copy strings to be displayed to merchants, to guide them in resolving problems your app encounters when trying to make use of their Shop and its resources.
Required only when state is requires_action
. Disallowed when state is success
.
Content restrictions for product feedback: ten messages up to 100 characters long.
* Type: x-string * Example: ["Needs at least one image."] * feedback_generated_at:The time at which the payload is constructed. Used to help determine whether incoming feedback is outdated compared to feedback already received, and if it should be ignored upon arrival. Type: ISO 8601 UTC DateTime as string with year, month [or week], day, hour, minute, second, millisecond, and time zone.
If you queue a Feedback API payload for delivery at a later time, do not update this value when the API call is actually made; ensure that the current time is set when building the payload.
The forwarded updated_at
timestamp of the product. Used only for versioned resources, where the updated_at
timestamp changes
based on merchant actions.
When required, it is used along with feedback_generated_at
to help determine whether incoming
feedback is outdated compared to feedback already received, and if it should be ignored upon arrival.
Create product feedback.
### Endpoint
/admin/api/#{api_version}/products/{product_id}/resource_feedback.json (POST)
### Parameters
* api_version (required):
* feedback_generated_at (required): An ISO 8601 date and time indicating when the feedback was generated by your app.
* messages (required): An array containing up to ten messages.
* product_id (required):
* resource_updated_at (required): The forwarded updated_at
timestamp of the product.
* state (required): Must be one of the following values:
### Responses
#### 202
Create a new Product ResourceFeedback
Examples:
##### Create a product feedback record indicating a problem specific to your app
Request:
```
POST /admin/api/unstable/products/632910392/resource_feedback.json
{"resource_feedback":{"state":"requires_action","messages":["Needs at least one image."],"resource_updated_at":"2025-01-02T11:09:43-05:00","feedback_generated_at":"2025-01-02T16:22:23.605756Z"}}
```
Response:
```
HTTP/1.1 202 Accepted
{"resource_feedback":{"created_at":"2025-01-02T11:22:24-05:00","updated_at":"2025-01-02T11:22:24-05:00","resource_id":632910392,"resource_type":"Product","resource_updated_at":"2025-01-02T11:09:43-05:00","messages":["Needs at least one image."],"feedback_generated_at":"2025-01-02T11:22:23-05:00","state":"requires_action"}}
```
##### Create a product feedback record indicating the product is usable by your app
Request:
```
POST /admin/api/unstable/products/632910392/resource_feedback.json
{"resource_feedback":{"state":"success","resource_updated_at":"2025-01-02T11:09:43-05:00","feedback_generated_at":"2025-01-02T16:22:23.139254Z"}}
```
Response:
```
HTTP/1.1 202 Accepted
{"resource_feedback":{"created_at":"2025-01-02T11:22:23-05:00","updated_at":"2025-01-02T11:22:23-05:00","resource_id":632910392,"resource_type":"Product","resource_updated_at":"2025-01-02T11:09:43-05:00","messages":[],"feedback_generated_at":"2025-01-02T11:22:23-05:00","state":"success"}}
```
#### 403
Create a new Product ResourceFeedback
Examples:
##### If the app is not configured as a Sales Channel, the API returns an error
Request:
```
POST /admin/api/unstable/products/632910392/resource_feedback.json
{"resource_feedback":{"state":"success","resource_updated_at":"2025-01-02T11:09:43-05:00","feedback_generated_at":"2025-01-02T16:22:22.060410Z"}}
```
Response:
```
HTTP/1.1 403 Forbidden
{"errors":{"message":"App must be configured as a Sales Channel."}}
```
#### 422
Create a new Product ResourceFeedback
Examples:
##### Sending an invalid feedback payload returns an error
Request:
```
POST /admin/api/unstable/products/632910392/resource_feedback.json
{"resource_feedback":{"state":"foobar","resource_updated_at":"2025-01-02T11:09:43-05:00","feedback_generated_at":"2025-01-02T16:22:22.655564Z"}}
```
Response:
```
HTTP/1.1 422 Unprocessable Entity
{"errors":{"messages":["State must be one of success and requires_action"]}}
```
#### 409
Create a new Product ResourceFeedback
Examples:
##### Sending outdated feedback (previous feedback
payload has a greater resource_updated_at value) returns an error
Request:
```
POST /admin/api/unstable/products/632910392/resource_feedback.json
{"resource_feedback":{"state":"success","resource_updated_at":"2025-01-02T11:09:43-05:00","feedback_generated_at":"2025-01-02T16:22:21.486286Z"}}
```
Response:
```
HTTP/1.1 409 Conflict
{"errors":{"messages":["Feedback request not delivered. Feedback request is older than a previously delivered feedback request."]}}
```
## Receive a list of all Product ResourceFeedbacks
Retrieve all product feedback from your app associated with the product.
### Endpoint
/admin/api/#{api_version}/products/{product_id}/resource_feedback.json (GET)
### Parameters
* api_version (required):
* product_id (required):
* product_id: Retrieve feedback for a specific product, by product id.
### Responses
#### 200
Receive a list of all Product ResourceFeedbacks
Examples:
##### Get a list of resource feedback records for a specific product
Request:
```
GET /admin/api/unstable/products/632910392/resource_feedback.json
```
Response:
```
HTTP/1.1 200 OK
{"resource_feedback":[{"created_at":"2025-01-02T11:22:20-05:00","updated_at":"2025-01-02T11:22:20-05:00","resource_id":632910392,"resource_type":"Product","resource_updated_at":"2025-01-02T11:09:43-05:00","messages":["Needs at least one image."],"feedback_generated_at":"2025-01-02T10:22:20-05:00","state":"requires_action"}]}
```