--- title: ResourceFeedback description: Notify merchants about actions required to resolve errors with your app. api_version: 2025-10 api_name: admin-rest api_type: rest source_url: html: 'https://shopify.dev/docs/api/admin-rest/latest/resources/resourcefeedback' md: 'https://shopify.dev/docs/api/admin-rest/latest/resources/resourcefeedback.md' --- ![](https://shopify.dev/images/logos/GraphQL.svg)![](https://shopify.dev/images/logos/GraphQL-dark.svg) The REST Admin API is a legacy API as of October 1, 2024. Starting April 1, 2025, all new public apps must be built exclusively with the [GraphQL Admin API](https://shopify.dev/docs/api/admin-graphql). For details and migration steps, visit our [migration guide](https://shopify.dev/docs/apps/build/graphql/migrate). # Resource​Feedback Requires `resource_feedbacks` access scope. The ResourceFeedback resource lets your app report the status of shops and their resources. For example, if your app is a marketplace channel, then you can use resource feedback to alert merchants that they need to connect their marketplace account by signing in. Resource feedback notifications are displayed to the merchant on the home screen of their Shopify admin, and in the product details view for any products that are published to your app. This resource should be used only in cases where you're describing steps that a merchant is required to complete. If your app offers optional or promotional set-up steps, or if it makes recommendations, then don't use resource feedback to let merchants know about them. ## Sending feedback on a shop You can send resource feedback on a shop to let the merchant know what steps they need to take to make sure that your app is set up correctly. Feedback can have one of two states: `requires_action` or `success`. You need to send a `requires_action` feedback request for each step that the merchant is required to complete. If there are multiple set-up steps that require merchant action, then send feedback with a state of `requires_action` as merchants complete prior steps. And to remove the feedback message from the Shopify admin, send a `success` feedback request. Important 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. ## Formatting the resource feedback message field If the feedback state is `requires_action`, then you can send a string message that communicates the action to be taken by the merchant. The string must be a single message up to 100 characters long and must end with a period. You need to adhere to the message formatting rules or your requests will fail: * `[Explanation of the problem]. [Suggested action].` **Examples:** * `[Your app name]` is not connected. Connect your account to use this sales channel. `[Learn more]` * `[Your app name]` is not configured. Agree to the terms and conditions to use this app. `[Learn more]` Both `Your app name` and `Learn more` (a button which directs merchants to your app) are automatically populated in the Shopify admin. ## Setting feedback permissions Add the `write_resource_feedbacks` permission to your [requested scopes](https://shopify.dev/docs/admin-api/access-scopes). \# ## Endpoints * [post](https://shopify.dev/docs/api/admin-rest/latest/resources/resourcefeedback.md#post-resource-feedback) [/admin/api/latest/resource\_​feedback.​json](https://shopify.dev/docs/api/admin-rest/latest/resources/resourcefeedback.md#post-resource-feedback) Create a new ResourceFeedback [![](https://shopify.dev/images/logos/GraphQL.svg)![](https://shopify.dev/images/logos/GraphQL-dark.svg)](https://shopify.dev/docs/api/admin-graphql/latest/mutations/shopResourceFeedbackCreate?example=create-a-new-resourcefeedback) [shopResourceFeedbackCreate](https://shopify.dev/docs/api/admin-graphql/latest/mutations/shopResourceFeedbackCreate?example=create-a-new-resourcefeedback) * [get](https://shopify.dev/docs/api/admin-rest/latest/resources/resourcefeedback.md#get-resource-feedback) [/admin/api/latest/resource\_​feedback.​json](https://shopify.dev/docs/api/admin-rest/latest/resources/resourcefeedback.md#get-resource-feedback) Receive a list of all ResourceFeedbacks [![](https://shopify.dev/images/logos/GraphQL.svg)![](https://shopify.dev/images/logos/GraphQL-dark.svg)](https://shopify.dev/docs/api/admin-graphql/latest/queries/app) [app](https://shopify.dev/docs/api/admin-graphql/latest/queries/app) *** ## The ResourceFeedback resource ### Properties *** created\_at deprecated DateTime when the resource feedback record was stored by Shopify. **Type:** ISO 8601 UTC DateTime as string with year, month (or week), day, hour, minute, second, time zone. *** updated\_at deprecated DateTime when the resource feedback record was last updated by Shopify. **Type:** ISO 8601 UTC DateTime as string with year, month (or week), day, hour, minute, second, time zone. *** resource\_id read-only -> [![](https://shopify.dev/images/logos/GraphQL.svg)![](https://shopify.dev/images/logos/GraphQL-dark.svg)](https://shopify.dev/docs/api/admin-graphql/latest/objects/Shop#field-Shop.fields.id) [id](https://shopify.dev/docs/api/admin-graphql/latest/objects/Shop#field-Shop.fields.id) Unique id of the resource. *** resource\_type read-only -> [![](https://shopify.dev/images/logos/GraphQL.svg)![](https://shopify.dev/images/logos/GraphQL-dark.svg)](https://shopify.dev/docs/api/admin-graphql/latest/objects/Shop#field-Shop.fields.id) [id](https://shopify.dev/docs/api/admin-graphql/latest/objects/Shop#field-Shop.fields.id) Type of resource for which feedback is returned. eg. Shop, Product. *** state -> [![](https://shopify.dev/images/logos/GraphQL.svg)![](https://shopify.dev/images/logos/GraphQL-dark.svg)](https://shopify.dev/docs/api/admin-graphql/latest/objects/AppFeedback#field-AppFeedback.fields.state) [state](https://shopify.dev/docs/api/admin-graphql/latest/objects/AppFeedback#field-AppFeedback.fields.state) Indicates the state that the Shop or resource is in, from the perspective of your app. Valid values are `requires_action`, or `success`. *** messages -> [![](https://shopify.dev/images/logos/GraphQL.svg)![](https://shopify.dev/images/logos/GraphQL-dark.svg)](https://shopify.dev/docs/api/admin-graphql/latest/objects/AppFeedback#field-AppFeedback.fields.messages) [messages](https://shopify.dev/docs/api/admin-graphql/latest/objects/AppFeedback#field-AppFeedback.fields.messages) 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 Shop feedback:** one message up to 100 characters long. *** feedback\_generated\_at -> [![](https://shopify.dev/images/logos/GraphQL.svg)![](https://shopify.dev/images/logos/GraphQL-dark.svg)](https://shopify.dev/docs/api/admin-graphql/latest/objects/AppFeedback#field-AppFeedback.fields.feedbackGeneratedAt) [feedbackGeneratedAt](https://shopify.dev/docs/api/admin-graphql/latest/objects/AppFeedback#field-AppFeedback.fields.feedbackGeneratedAt) 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. Note 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 ResourceFeedback resource ```json { "created_at": "2025-10-01 18:30:56 UTC", "updated_at": "2025-10-01 18:30:56 UTC", "resource_id": 321, "resource_type": "Shop", "state": "requires_action", "messages": [ "is not connected. Connect your account to use this sales channel." ], "feedback_generated_at": "2025-10-01T18:30:56.057217Z" } ``` *** ## postCreate a new Resource​Feedback [![](https://shopify.dev/images/logos/GraphQL.svg)![](https://shopify.dev/images/logos/GraphQL-dark.svg)](https://shopify.dev/docs/api/admin-graphql/latest/mutations/shopResourceFeedbackCreate?example=create-a-new-resourcefeedback) [shopResourceFeedbackCreate](https://shopify.dev/docs/api/admin-graphql/latest/mutations/shopResourceFeedbackCreate?example=create-a-new-resourcefeedback) Creates shop resource feedback. ### Parameters *** api\_version string 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 a single message. See [*Formatting the resource feedback message field*](<#formatting-the-resource-feedback-field-{{ current_version }}>) for formatting requirements. *** state required Must be one of the following values: Show state properties * **requires\_action**: Indicates that your app requires the merchant to resolve an issue with their shop. * **success**: Indicates that the app does not have any outstanding issues with this shop. *** ### Examples Create a shop feedback record indicating a problem specific to your app Request body resource\_​feedback​ Resource\_feedback resource Show resource\_feedback properties resource\_​feedback.state:​"requires\_action" Indicates the state that the Shop or resource is in, from the perspective of your app. Valid values are `requires_action`, or `success`. resource\_​feedback.messages:​\["is not connected. Connect your account to use this sales channel."] 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 Shop feedback:** one message up to 100 characters long. resource\_​feedback.feedback\_​generated\_​at:​"2025-10-01T18:56:53.423703Z" 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. Note 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. Create a shop feedback record indicating the Shop is usable by your app Request body resource\_​feedback​ Resource\_feedback resource Show resource\_feedback properties resource\_​feedback.state:​"success" Indicates the state that the Shop or resource is in, from the perspective of your app. Valid values are `requires_action`, or `success`. resource\_​feedback.feedback\_​generated\_​at:​"2025-10-01T18:56:54.124312Z" 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. Note 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. Sending an invalid feedback payload returns an error Request body resource\_​feedback​ Resource\_feedback resource Show resource\_feedback properties resource\_​feedback.state:​"foobar" Indicates the state that the Shop or resource is in, from the perspective of your app. Valid values are `requires_action`, or `success`. resource\_​feedback.feedback\_​generated\_​at:​"2025-10-01T18:56:54.848583Z" 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. Note 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. Sending outdated feedback (previous feedback payload has a greater resource\_updated\_at value) returns an error Request body resource\_​feedback​ Resource\_feedback resource Show resource\_feedback properties resource\_​feedback.state:​"success" Indicates the state that the Shop or resource is in, from the perspective of your app. Valid values are `requires_action`, or `success`. resource\_​feedback.feedback\_​generated\_​at:​"2025-10-01T18:56:56.247292Z" 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. Note 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. post ## /admin/api/2025-10/resource\_​feedback.​json ```bash curl -d '{"resource_feedback":{"state":"requires_action","messages":["is not connected. Connect your account to use this sales channel."],"feedback_generated_at":"2025-10-01T18:56:53.423703Z"}}' \ -X POST "https://your-development-store.myshopify.com/admin/api/2025-10/resource_feedback.json" \ -H "X-Shopify-Access-Token: {access_token}" \ -H "Content-Type: application/json" ``` {} ## Response JSON ```json HTTP/1.1 202 Accepted { "resource_feedback": { "created_at": "2025-10-01T14:56:53-04:00", "updated_at": "2025-10-01T14:56:53-04:00", "resource_id": 548380009, "resource_type": "Shop", "resource_updated_at": null, "messages": [ "is not connected. Connect your account to use this sales channel." ], "feedback_generated_at": "2025-10-01T14:56:53-04:00", "state": "requires_action" } } ``` ### examples * #### Create a shop feedback record indicating a problem specific to your app ##### ```curl curl -d '{"resource_feedback":{"state":"requires_action","messages":["is not connected. Connect your account to use this sales channel."],"feedback_generated_at":"2025-10-01T18:56:53.423703Z"}}' \ -X POST "https://your-development-store.myshopify.com/admin/api/2025-10/resource_feedback.json" \ -H "X-Shopify-Access-Token: {access_token}" \ -H "Content-Type: application/json" ``` ##### ```remix const { admin, session } = await authenticate.admin(request); const resource_feedback = new admin.rest.resources.ResourceFeedback({session: session}); resource_feedback.state = "requires_action"; resource_feedback.messages = [ "is not connected. Connect your account to use this sales channel." ]; resource_feedback.feedback_generated_at = "2025-10-01T18:56:53.423703Z"; await resource_feedback.save({ update: true, }); ``` ##### ```ruby # Session is activated via Authentication test_session = ShopifyAPI::Context.active_session resource_feedback = ShopifyAPI::ResourceFeedback.new(session: test_session) resource_feedback.state = "requires_action" resource_feedback.messages = [ "is not connected. Connect your account to use this sales channel." ] resource_feedback.feedback_generated_at = "2025-10-01T18:56:53.423703Z" resource_feedback.save! ``` ##### ```node // Session is built by the OAuth process const resource_feedback = new shopify.rest.ResourceFeedback({session: session}); resource_feedback.state = "requires_action"; resource_feedback.messages = [ "is not connected. Connect your account to use this sales channel." ]; resource_feedback.feedback_generated_at = "2025-10-01T18:56:53.423703Z"; await resource_feedback.save({ update: true, }); ``` #### response ```json HTTP/1.1 202 Accepted{"resource_feedback":{"created_at":"2025-10-01T14:56:53-04:00","updated_at":"2025-10-01T14:56:53-04:00","resource_id":548380009,"resource_type":"Shop","resource_updated_at":null,"messages":["is not connected. Connect your account to use this sales channel."],"feedback_generated_at":"2025-10-01T14:56:53-04:00","state":"requires_action"}} ``` * #### Create a shop feedback record indicating the Shop is usable by your app ##### ```curl curl -d '{"resource_feedback":{"state":"success","feedback_generated_at":"2025-10-01T18:56:54.124312Z"}}' \ -X POST "https://your-development-store.myshopify.com/admin/api/2025-10/resource_feedback.json" \ -H "X-Shopify-Access-Token: {access_token}" \ -H "Content-Type: application/json" ``` ##### ```remix const { admin, session } = await authenticate.admin(request); const resource_feedback = new admin.rest.resources.ResourceFeedback({session: session}); resource_feedback.state = "success"; resource_feedback.feedback_generated_at = "2025-10-01T18:56:54.124312Z"; await resource_feedback.save({ update: true, }); ``` ##### ```ruby # Session is activated via Authentication test_session = ShopifyAPI::Context.active_session resource_feedback = ShopifyAPI::ResourceFeedback.new(session: test_session) resource_feedback.state = "success" resource_feedback.feedback_generated_at = "2025-10-01T18:56:54.124312Z" resource_feedback.save! ``` ##### ```node // Session is built by the OAuth process const resource_feedback = new shopify.rest.ResourceFeedback({session: session}); resource_feedback.state = "success"; resource_feedback.feedback_generated_at = "2025-10-01T18:56:54.124312Z"; await resource_feedback.save({ update: true, }); ``` #### response ```json HTTP/1.1 202 Accepted{"resource_feedback":{"created_at":"2025-10-01T14:56:54-04:00","updated_at":"2025-10-01T14:56:54-04:00","resource_id":548380009,"resource_type":"Shop","resource_updated_at":null,"messages":[],"feedback_generated_at":"2025-10-01T14:56:54-04:00","state":"success"}} ``` * #### Sending an invalid feedback payload returns an error ##### ```curl curl -d '{"resource_feedback":{"state":"foobar","feedback_generated_at":"2025-10-01T18:56:54.848583Z"}}' \ -X POST "https://your-development-store.myshopify.com/admin/api/2025-10/resource_feedback.json" \ -H "X-Shopify-Access-Token: {access_token}" \ -H "Content-Type: application/json" ``` ##### ```remix const { admin, session } = await authenticate.admin(request); const resource_feedback = new admin.rest.resources.ResourceFeedback({session: session}); resource_feedback.state = "foobar"; resource_feedback.feedback_generated_at = "2025-10-01T18:56:54.848583Z"; await resource_feedback.save({ update: true, }); ``` ##### ```ruby # Session is activated via Authentication test_session = ShopifyAPI::Context.active_session resource_feedback = ShopifyAPI::ResourceFeedback.new(session: test_session) resource_feedback.state = "foobar" resource_feedback.feedback_generated_at = "2025-10-01T18:56:54.848583Z" resource_feedback.save! ``` ##### ```node // Session is built by the OAuth process const resource_feedback = new shopify.rest.ResourceFeedback({session: session}); resource_feedback.state = "foobar"; resource_feedback.feedback_generated_at = "2025-10-01T18:56:54.848583Z"; await resource_feedback.save({ update: true, }); ``` #### response ```json HTTP/1.1 422 Unprocessable Entity{"errors":{"messages":["State must be one of success and requires_action"]}} ``` * #### Sending outdated feedback (previous feedback payload has a greater resource\_updated\_at value) returns an error ##### ```curl curl -d '{"resource_feedback":{"state":"success","feedback_generated_at":"2025-10-01T18:56:56.247292Z"}}' \ -X POST "https://your-development-store.myshopify.com/admin/api/2025-10/resource_feedback.json" \ -H "X-Shopify-Access-Token: {access_token}" \ -H "Content-Type: application/json" ``` ##### ```remix const { admin, session } = await authenticate.admin(request); const resource_feedback = new admin.rest.resources.ResourceFeedback({session: session}); resource_feedback.state = "success"; resource_feedback.feedback_generated_at = "2025-10-01T18:56:56.247292Z"; await resource_feedback.save({ update: true, }); ``` ##### ```ruby # Session is activated via Authentication test_session = ShopifyAPI::Context.active_session resource_feedback = ShopifyAPI::ResourceFeedback.new(session: test_session) resource_feedback.state = "success" resource_feedback.feedback_generated_at = "2025-10-01T18:56:56.247292Z" resource_feedback.save! ``` ##### ```node // Session is built by the OAuth process const resource_feedback = new shopify.rest.ResourceFeedback({session: session}); resource_feedback.state = "success"; resource_feedback.feedback_generated_at = "2025-10-01T18:56:56.247292Z"; await resource_feedback.save({ update: true, }); ``` #### response ```json HTTP/1.1 409 Conflict{"errors":{"messages":["Feedback request not delivered. Feedback request is older than a previously delivered feedback request."]}} ``` *** ## getReceive a list of all Resource​Feedbacks [![](https://shopify.dev/images/logos/GraphQL.svg)![](https://shopify.dev/images/logos/GraphQL-dark.svg)](https://shopify.dev/docs/api/admin-graphql/latest/queries/app) [app](https://shopify.dev/docs/api/admin-graphql/latest/queries/app) Returns a list (zero or one) of resource feedback objects. Important Note that ids are not returned as part of this request. Records are immutable except when POST replaces them. ### Parameters *** api\_version string required *** ### Examples Get a list of resource feedback records for a specific shop get ## /admin/api/2025-10/resource\_​feedback.​json ```bash curl -X GET "https://your-development-store.myshopify.com/admin/api/2025-10/resource_feedback.json" \ -H "X-Shopify-Access-Token: {access_token}" ``` {} ## Response JSON ```json HTTP/1.1 200 OK { "resource_feedback": [ { "created_at": "2025-10-01T14:56:55-04:00", "updated_at": "2025-10-01T14:56:55-04:00", "resource_id": 548380009, "resource_type": "Shop", "resource_updated_at": null, "messages": [ "is not connected. Connect your account to use this sales channel." ], "feedback_generated_at": "2025-10-01T13:56:55-04:00", "state": "requires_action" } ] } ``` ### examples * #### Get a list of resource feedback records for a specific shop ##### ```curl curl -X GET "https://your-development-store.myshopify.com/admin/api/2025-10/resource_feedback.json" \ -H "X-Shopify-Access-Token: {access_token}" ``` ##### ```remix await admin.rest.resources.ResourceFeedback.all({ session: session, }); ``` ##### ```ruby # Session is activated via Authentication test_session = ShopifyAPI::Context.active_session ShopifyAPI::ResourceFeedback.all( session: test_session, ) ``` ##### ```node // Session is built by the OAuth process await shopify.rest.ResourceFeedback.all({ session: session, }); ``` #### response ```json HTTP/1.1 200 OK{"resource_feedback":[{"created_at":"2025-10-01T14:56:55-04:00","updated_at":"2025-10-01T14:56:55-04:00","resource_id":548380009,"resource_type":"Shop","resource_updated_at":null,"messages":["is not connected. Connect your account to use this sales channel."],"feedback_generated_at":"2025-10-01T13:56:55-04:00","state":"requires_action"}]} ```