[Sidekick] Application/quote intent type for quote & negotiation apps

Summary
Add an application/quote action-intent type so quote/negotiation apps can register Sidekick actions on a quote. The immediate, highest-value action is open (navigate the merchant to a specific quote); the type would also support staged, merchant-confirmed send_proposal / counter / convert / create.

Motivation
We build QuotWay — B2B Quote & Negotiation (public App Store app). Our Sidekick data extension already works well: merchants ask, “Which quotes are pending approval?” or “Show my highest-value quote,” and Sidekick answers from our app.

The gap is the moment the merchant follows up with “open it”:

Merchant: Can you open it?
Sidekick: I’m not able to directly open QuotWay for you, but you can
Navigate to QW-1013 through the QuotWay app in your admin.

A data extension has no matching action intent, and there’s no quote/negotiation type in the vocabulary (application/{ad, campaign, email, faq,loyalty-program, return, review, shipment, ticket}. '). + shopify/{customer, order, product}), so we can't declare anadmin.app.intent.linkfor it —Shopify app deployrejects unknown intent types. We already return the correct deep link in the resource-link_meta, but Sidekick has no route to use it.

B2B quoting/negotiation is a growing surface (Companies + payment terms now reach. Basic→Advanced, not just Plus), and “open / send / counter / convert this quote” is exactly the in-flow action Sidekick is built for.

Proposed type
application/quote — actions: open | create | edit | send_proposal | counter | convert.

 {
   "type": "application/quote",
   "value": {                      // the quote to act on (open/edit/send/counter/convert)
   "type": "string",
   "description": "GID or reference of the quote (e.g. gid://application/quote/123 or QW-1042).",
   "mapTo": "param",
   "fieldName": "id"
},
   "inputSchema": {                // all optional (no required fields, per the intent rules)
     "buyer_email": { "type": "string", "format": "email" },
    "company":     { "type": "string", "description": "Company name or GID (B2B)" },
    "total":       { "type": "string", "description": "Proposed total in shop currency" },
     "message":     { "type": "string", "description": "Note to the buyer" }
   }
 }

Apps wire this to their own confirm UI (we’d use our contextual save bar + convert preview), so nothing commits without the merchant — the same stay-in-control model the existing action intents use.

Alternatives considered

  • A generic app-navigation intent — let an app declare admin.app.intent.link to open ANY of its own resources by URL, with no predefined schema. This would solve open for every app (not just quotes) and is arguably the smaller change. Happy to take this instead of/alongside application/quote.
  • Reusing application/ticket — semantically wrong for a quote and would misrepresent the resource (also a content-policy concern), so we ruled it out.

Minimum viable

If the full type is too broad to start, just open (or the generic navigation intent) already closes the most common merchant request and unblocks every quote app.

Moving this to the Extensions category and adding the Sidekick tag :slight_smile:

@Liam-Shopify

Thank you for your attention and for moving to the right category.

@Jahangir can you put up a proposal for the application/quote type in this repo ? In the meantime, you can return a url pointing to the resource in your app and sidekick should be able to open it without making it an intent. You can use an absolute url or one with the app: protocol if your app is an embedded app (see docs).

@Trish_Ta Thank you for the direction.

I’ve submitted the proposal for the application/quote intent type in the RFC repo here: Application/quote intent type for quote & negotiation apps (open, send, counter, convert) · Shopify/app-intent-types · Discussion #5 · GitHub

In the meantime, I’ll try the suggested workaround by returning a direct URL/deep link to the quote resource in our app so Sidekick can open the quote without requiring a new intent type.

That should help us cover the immediate “open this quote” use case. For quote-specific actions like send_proposal, counter, and convert, I still believe a dedicated application/quote intent type would make the experience more structured and consistent for quote/negotiation apps.

Thanks again for the guidance. I’ll test the URL approach and share any findings if we hit limitations.

Thanks @Trish_Ta - confirmed working! :raising_hands:

Returning a first-class url on the tool result (I’d mistakenly buried it in _meta at first) does exactly what you described: Sidekick opens the deep link with no intent type needed. I used the app: protocol (app://) since we’re an embedded app, and it resolves straight to the right in-app page - verified end-to-end: Sidekick calls the tool, returns the data, and the link opens the exact quote.

Really appreciate the pointer!

Great to hear this is working for you @Jahangir - marking this as solved :slight_smile:

Let us know if you run into any other issues!