Setup guide: connect your Shopify store
About 5–10 minutes, once. You create your own small, read-only app in Shopify, so your store data and credentials stay between Shopify and your own Google account.
Before you start
- You must be the owner or a staff member with app-development permission on the Shopify store.
- Since 1 January 2026 Shopify no longer allows new legacy custom apps, so we use an app from the Shopify Dev Dashboard with the client credentials grant. Access tokens issued this way last about 24 hours; LedgerLeaf automatically asks for a fresh one using your saved client ID and secret.
- The Dev Dashboard app and the store must belong to the same Shopify organization (true if you create the app while signed in as the store owner).
1. Create the app
- Go to dev.shopify.com/dashboard and sign in with the account that owns your store.
- Click Create app (under Apps) and choose to start from the Dev Dashboard.
- Name it, for example
LedgerLeaf sync, and create it.
2. Choose read-only scopes
- In the app, open the Versions (or Configuration) screen and create a new version.
- Leave the App URL at its default/placeholder and turn off “embed app in Shopify admin” if offered. LedgerLeaf does not use a Shopify-hosted interface or webhooks.
- Under Access scopes, enter exactly:
read_orders,read_products,read_customers,read_inventory - Click Release.
Only read scopes are needed. LedgerLeaf never writes to your store.
3. Install the app on your store
- On the app’s Home page, click Install app and choose your store.
- Approve the access request in your store admin.
4. Copy the client ID and secret
- In the app, open Settings.
- Copy the Client ID and Secret (click to reveal).
Treat the secret like a password. You can rotate it in the Dev Dashboard at any time (then paste the new one into LedgerLeaf).
5. Connect in LedgerLeaf
- In your spreadsheet choose Extensions → LedgerLeaf → Open LedgerLeaf.
- On the Connect tab enter your shop domain (the
yourstore.myshopify.comaddress, not your custom domain), the client ID and the secret. - Click Connect & test. You should see your store name and currency.
- Go to the Sync tab, choose your data and click Sync now.
Where are the credentials kept? In your Google account’s private add-on storage (User Properties). They are never written into the spreadsheet and never sent to our server. Disconnect store in Settings deletes them.
Orders older than 60 days (read_all_orders)
By default Shopify only returns orders from the last 60 days. For full history (a Pro feature in LedgerLeaf) your app needs the read_all_orders scope, which Shopify must approve:
- In the Dev Dashboard open your app and look for API access requests (or the protected-scope request area).
- Request Read all orders and explain: “Custom app for my own store to export my historical orders to my own spreadsheet for tax reporting and bookkeeping.”
- When approved, add
read_all_ordersto your scopes (read_orders,read_all_orders,read_products,read_customers,read_inventory), create and release a new version, and re-approve the update on your store. - Click Test connection in LedgerLeaf and re-run the sync with a longer date range.
Customer data access
Shopify protects customer details such as shipping addresses and emails. LedgerLeaf needs the shipping province for the tax report. If a sync stops with an ACCESS_DENIED message mentioning customer data, open your app in the Dev Dashboard, find Protected customer data access (or API access requests), and request access for your own store’s data. Shopify may ask you to describe your use; “bookkeeping and tax reporting for my own store” is accurate.
Optional: payment fees
To include Shopify Payments processing fees in the profit report, also add the read_shopify_payments_payouts scope (Shopify Payments stores only) and enable Include payment fees in the add-on’s Settings. Without it, fees are reported as 0.
Troubleshooting
| Message | What to check |
|---|---|
| “Could not get an access token” | Client ID/secret copied correctly (no spaces)? App installed on this store? App and store in the same organization? Released a version after adding scopes? |
| “Store not found” | Use the .myshopify.com domain. |
| “ACCESS_DENIED” | A scope is missing or customer-data access is not granted. See the sections above. |
| Fewer orders than expected | Only 60 days without read_all_orders; free plan is 60 days / 500 rows. |
| Sync stops partway | Large stores sync in chunks. Click Resume, or let the Pro schedule continue it on the next hourly run. |
| Profit report shows “no cost” lines | Add unit cost in Shopify (Product → variant → Cost per item) or fill the COGS Override column on the Products tab. |
Still stuck? Contact support — please never email us your client secret.