Step-by-Step Guide to Integrating QuickBooks Online with NodeJS

By manhnv, at: Nov. 24, 2024, 10:01 a.m.

Estimated Reading Time: 6 min read

Step-by-Step Guide to Integrating QuickBooks Online with NodeJS
Step-by-Step Guide to Integrating QuickBooks Online with NodeJS

Step-by-Step Guide to Integrating QuickBooks Online with NodeJS

QuickBooks Online (QBO) is a popular accounting platform used by businesses of all sizes. Integrating QBO with Node.js allows developers to automate tasks like syncing invoices, updating customer records, and retrieving reports programmatically.

In this guide, we’ll walk through the process of integrating QuickBooks Online with Node.js step by step. Followed by https://developer.intuit.com/app/developer/qbo/docs/develop/sdks-and-samples-collections/nodejs

 

Prerequisites

Before starting, make sure you have the following:

1. QuickBooks Online account: Sign up at QuickBooks Online.

2. Intuit Developer account: Register and create an app at Intuit Developer.

3. Node.js installed: Recommended version 14.x or later.

4. Packages to install:

  • express
     
  • axios
     
  • dotenv
     
  • quickbooks
     

Install these packages using npm:

npm install express axios dotenv quickbooks


5. OAuth credentials: Obtain the Client ID, Client Secret, and Redirect URI from the Intuit Developer portal.

 

Step 1: Setting Up Your Node.js Environment

1. Create a new project directory:

mkdir quickbooks-node-integration
cd quickbooks-node-integration
npm init -y

 

Install the necessary dependencies:

npm install express axios dotenv quickbooks

 

Create a .env file to store your credentials:

CLIENT_ID=Your_Client_ID
CLIENT_SECRET=Your_Client_Secret
REDIRECT_URI=http://localhost:3000/callback

 

Step 2: Configuring OAuth 2.0 Authentication

To access QuickBooks APIs, you must implement the OAuth 2.0 flow to obtain an access token.

Minimal Express Server for OAuth

Here’s an example of setting up OAuth authentication with Express:

const express = require('express');
const axios = require('axios');
require('dotenv').config();

const app = express();
const port = 3000;

const authUrl = `https://appcenter.intuit.com/connect/oauth2?client_id=${process.env.CLIENT_ID}&redirect_uri=${process.env.REDIRECT_URI}&response_type=code&scope=com.intuit.quickbooks.accounting`;

app.get('/', (req, res) => {
    res.send(`Connect to QuickBooks`);
});

app.get('/callback', async (req, res) => {
    const authCode = req.query.code;
    try {
        const response = await axios.post(
            'https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer',
            new URLSearchParams({
                grant_type: 'authorization_code',
                code: authCode,
                redirect_uri: process.env.REDIRECT_URI
            }),
            {
                auth: {
                    username: process.env.CLIENT_ID,
                    password: process.env.CLIENT_SECRET
                },
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            }
        );
        const { access_token, refresh_token } = response.data;
        res.send(`Access Token: ${access_token}
Refresh Token: ${refresh_token}`);
    } catch (error) {
        res.status(500).send('Error exchanging token: ' + error.message);
    }
});

app.listen(port, () => console.log(`Server running at http://localhost:${port}`));
 

 

Step 3: Connecting to the QuickBooks API

Once you have the access token, you can use the quickbooks library to interact with the API.

QuickBooks Client Setup

const QuickBooks = require('quickbooks');

// Replace these with your values
const qb = new QuickBooks(
    process.env.CLIENT_ID,
    process.env.CLIENT_SECRET,
    process.env.REDIRECT_URI,
    'access_token_here',  // Replace with your actual access token
    false,                // Set to true for sandbox mode
    true                  // Enable minorVersion support
);

 

Step 4: Performing Basic Operations

Fetching Customers

const QuickBooks = require('quickbooks');

// Replace these with your values
const qb = new QuickBooks(
    process.env.CLIENT_ID,
    process.env.CLIENT_SECRET,
    process.env.REDIRECT_URI,
    'access_token_here',  // Replace with your actual access token
    false,                // Set to true for sandbox mode
    true                  // Enable minorVersion support
);

 

Adding a Customer

qb.createCustomer(
    {
        DisplayName: 'John Doe',
        PrimaryEmailAddr: { Address: '[email protected]' }
    },
    (err, customer) => {
        if (err) {
            console.error('Error creating customer:', err);
        } else {
            console.log('Customer created:', customer);
        }
    }
);

 

Updating a Customer

qb.updateCustomer(
    {
        Id: '1',  // Replace with the actual customer ID
        SyncToken: '0',  // Replace with the actual SyncToken
        DisplayName: 'John Doe Updated'
    },
    (err, customer) => {
        if (err) {
            console.error('Error updating customer:', err);
        } else {
            console.log('Customer updated:', customer);
        }
    }
);

 

Step 5: Handling Errors and Debugging
 

  • Invalid Token: Implement token refresh logic using the refresh_token.
     
  • Rate Limits: Respect API rate limits and retry with exponential backoff.

 

Refreshing Tokens

async function refreshToken(refreshToken) {
    try {
        const response = await axios.post(
            'https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer',
            new URLSearchParams({
                grant_type: 'refresh_token',
                refresh_token: refreshToken
            }),
            {
                auth: {
                    username: process.env.CLIENT_ID,
                    password: process.env.CLIENT_SECRET
                },
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            }
        );
        console.log('New Access Token:', response.data.access_token);
    } catch (error) {
        console.error('Error refreshing token:', error);
    }
}

 

Step 6: Deployment and Security
 

  • Use a secure configuration library like dotenv to store environment variables.
     
  • Deploy securely on a cloud platform like AWS, Azure, or Heroku.
     
  • Rotate and refresh tokens regularly.

 

Conclusion

Integrating QuickBooks Online with Node.js can automate your accounting processes and improve business efficiency. By following this guide, you’ve set up OAuth 2.0 authentication, made API calls to manage customers, and learned best practices for handling errors and security.

 

Additional Resources

 


Subscribe

Subscribe to our newsletter and never miss out lastest news.