Skip to content

A template and example for using Remix and Drizzle ORM with D1 database to create Shopify apps and deploy them on Cloudflare Pages

License

Notifications You must be signed in to change notification settings

vincaslt/remix-cf-pages-d1-drizzle-shopify-app

Repository files navigation

Shopify App Template - Remix+Drizzle with D1 on Cloudflare Pages

This is a template for building a Shopify app using the Remix framework that can be hosted on Cloudflare Pages. More information and detailed instructions here: https://codefrontend.com/deploy-shopify-apps-on-clouflare/

Rather than cloning this repo, you can use your preferred package manager and the Shopify CLI with these steps then following instruction in the blog post to configure it incrementally.

Visit the shopify.dev documentation for more details on the Remix app package.

Quick start

Prerequisites

  1. You must download and install Node.js if you don't already have it.
  2. You must create a Shopify partner account if you don’t have one.
  3. You must create a store for testing if you don't have one, either a development store or a Shopify Plus sandbox store.

Setup

If you used the CLI to create the template, you can skip this section.

Using yarn:

yarn install

Using npm:

npm install

Using pnpm:

pnpm install

Local Development

Using yarn:

yarn dev

Using npm:

npm run dev

Using pnpm:

pnpm run dev

Press P to open the URL to your app. Once you click install, you can start development.

Local development is powered by the Shopify CLI. It logs into your partners account, connects to an app, provides environment variables, updates remote config, creates a tunnel and provides commands to generate extensions.

Authenticating and querying data

To authenticate and query data you can use the shopify const that is exported from /app/shopify.server.js:

export async function loader({ request }) {
  const { admin } = await shopify.authenticate.admin(request);

  const response = await admin.graphql(`
    {
      products(first: 25) {
        nodes {
          title
          description
        }
      }
    }`);

  const {
    data: {
      products: { nodes },
    },
  } = await response.json();

  return json(nodes);
}

This template come preconfigured with examples of:

  1. Setting up your Shopify app in /app/shopify.server.js
  2. Querying data using Graphql. Please see: /app/routes/app._index.jsx.
  3. Responding to mandatory webhooks in /app/routes/webhooks.jsx

Please read the documentation for @shopify/shopify-app-remix to understand what other API's are available.

Deployment

Application Storage

This template uses Drizzle to store session data, by default using a D1 database. The database schema is defined in drizzle/schema.ts.

Build

Remix handles building the app for you, by running the command below with the package manager of your choice:

Using yarn:

yarn build

Using npm:

npm run build

Using pnpm:

pnpm run build

Hosting

When you're ready to set up your app in production, you can follow our deployment documentation to host your app on a cloud provider like Heroku or Fly.io.

When you reach the step for setting up environment variables, you also need to set the variable NODE_ENV=production.

Gotchas / Troubleshooting

Database tables don't exist

If you get this error:

The table `main.Session` does not exist in the current database.

You need to create the database for Prisma. Run the setup script in package.json using your preferred package manager.

Navigating/redirecting breaks an embedded app

Embedded Shopify apps must maintain the user session, which can be tricky inside an iFrame. To avoid issues:

  1. Use Link from @remix-run/react or @shopify/polaris. Do not use <a>.
  2. Use the redirect helper returned from authenticate.admin. Do not use redirect from @remix-run/node
  3. Use useSubmit or <Form/> from @remix-run/react. Do not use a lowercase <form/>.

This only applies if you app is embedded, which it will be by default.

Non Embedded

Shopify apps are best when they are embedded into the Shopify Admin. This template is configured that way. If you have a reason to not embed your please make 2 changes:

  1. Change the isEmbeddedApp prop to false for the AppProvider in /app/routes/app.jsx
  2. Remove any use of App Bridge APIs (window.shopify) from your code
  3. Update the config for shopifyApp in app/shopify.server.js. Pass isEmbeddedApp: false

OAuth goes into a loop when I change my app's scopes

If you change your app's scopes and authentication goes into a loop and fails with a message from Shopify that it tried too many times, you might have forgotten to update your scopes with Shopify. To do that, you can run the config push CLI command.

Using yarn:

yarn shopify app config push

Using npm:

npm run shopify app config push

Using pnpm:

pnpm run shopify app config push

My webhook subscriptions aren't being updated

This template registers webhooks after OAuth completes, usng the afterAuth hook when calling shopifyApp. The package calls that hook in 2 scenarios:

  • After installing the app
  • When an access token expires

During normal development, the app won't need to re-authenticate most of the time, so the subscriptions aren't updated.

To force your app to update the subscriptions, you can uninstall and reinstall it in your development store. That will force the OAuth process and call the afterAuth hook.

Admin created webhook failing HMAC validation

Webhooks subscriptions created in the Shopify admin will fail HMAC validation. This is because the webhook payload is not signed with your app's secret key.

Create webhook subscriptions using the shopifyApp object instead.

Test your webhooks with the Shopify CLI or by triggering events manually in the Shopify admin(e.g. Updating the product title to trigger a PRODUCTS_UPDATE).

Incorrect GraphQL Hints

By default the graphql.vscode-graphql extension for VS Code will assume that GraphQL queries or mutations are for the Shopify Admin API. This is a sensible default, but it may not be true if:

  1. You use another Shopify API such as the storefront API.
  2. You use a third party GraphQL API.

in this situation, please update the .graphqlrc.js config.

Benefits

Shopify apps are built on a variety of Shopify tools to create a great merchant experience.

The Remix app template comes with the following out-of-the-box functionality:

  • OAuth: Installing the app and granting permissions
  • GraphQL Admin API: Querying or mutating Shopify admin data
  • REST Admin API: Resource classes to interact with the API
  • Webhooks: Callbacks sent by Shopify when certain events occur
  • AppBridge: This template uses the next generation of the Shopify App Bridge library which works in unison with previous versions.
  • Polaris: Design system that enables apps to create Shopify-like experiences

Tech Stack

This template uses Remix. The following Shopify tools are also included to ease app development:

  • Shopify App Remix provides authentication and methods for interacting with Shopify APIs.
  • Shopify App Bridge allows your app to seamlessly integrate your app within Shopify's Admin.
  • Polaris React is a powerful design system and component library that helps developers build high quality, consistent experiences for Shopify merchants.
  • Webhooks: Callbacks sent by Shopify when certain events occur
  • Polaris: Design system that enables apps to create Shopify-like experiences

Resources

About

A template and example for using Remix and Drizzle ORM with D1 database to create Shopify apps and deploy them on Cloudflare Pages

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages