Woodshop for old agent generation
Try the new agent generation
  • What is woodshop
  • How to's
    • Smart Relationship
      • GetIdsFromRequest
    • Smart views
      • Display a calendar view
      • Create a custom tinder-like validation view
      • Create a custom moderation view
      • Create a dynamic calendar view for an event-booking use case
    • Configure environment variables
      • NodeJS/Express projects
    • Elasticsearch Integration
      • Interact with your Elasticsearch data
      • Elasticsearch service/utils
      • Another example
    • Zendesk Integration
      • Authentication, Filtering & Sorting
      • Display Zendesk tickets
      • Display Zendesk users
      • View tickets related to a user
      • Bonus: Direct link to Zendesk + change priority of a ticket
    • Dwolla integration
      • Display Dwolla customers
      • Display Dwolla funding sources
      • Display Dwolla transfers
      • Link users and Dwolla customers
      • Dwolla service
    • Make filters case insensitive
    • Use Azure Table Storage
    • Create multiple line charts
    • Create Charts with AWS Redshift
    • View soft-deleted records
    • Send Smart Action notifications to Slack
    • Authenticate a Forest Admin API against an OAuth protected API Backend
    • Translate your project into TypeScript
      • V8
        • Migrate Mongoose files
        • Migrate Sequelize files
      • v7
        • Migrate Mongoose files
        • Migrate Sequelize files
      • v6
    • Geocode an address with Algolia
    • Display/edit a nested document
    • Send an SMS with Zapier
    • Hash a password with bcrypt
    • Display a customized response
    • Search on a smart field with two joints
    • Override the count route
    • Make a field readOnly with Sequelize
    • Hubspot integration
      • Create a Hubspot company
      • Display Hubspot companies
    • Impersonate a user
    • Import data from a CSV file
    • Import data from a JSON file
    • Load smart fields using hook
    • Pre-fill a form with data from a relationship
    • Re-use a smart field logic
    • Link to record info in a smart view
    • Display data in html format
    • Upload files to AWS S3
    • Display AWS S3 files from signed URLs
    • Prevent record update
    • Display, search and update attributes from a JSON field
    • Add many existing records at the same time (hasMany-belongsTo relationship)
    • Track users’ logs with morgan
    • Search on relationship fields by default
    • Export related data as CSV
    • Run automated tests
  • Forest Admin Documentation
Powered by GitBook
On this page
  • Requirements
  • How it works
  • Directory: /models
  • Directory: /forest
  • Directory: /routes

Was this helpful?

  1. How to's
  2. Hubspot integration

Create a Hubspot company

PreviousHubspot integrationNextDisplay Hubspot companies

Last updated 4 years ago

Was this helpful?

This example shows you how to create a Smart Action "Create company in Hubspot" that generates a company in Hubspot based on information from your database.

Requirements

  • An admin backend running on forest-express-sequelize

  • a Hubspot account

How it works

Directory: /models

This directory contains the companies.js file where the collection is declared.

/models/companies.js
module.exports = (sequelize, DataTypes) => {
  const { Sequelize } = sequelize;
  const Companies = sequelize.define('companies', {
    description: {
      type: DataTypes.STRING,
    },
    industry: {
      type: DataTypes.STRING,
    },
    headquarters: {
      type: DataTypes.STRING,
    },
    name: {
      type: DataTypes.STRING,
    },
    status: {
      type: DataTypes.ENUM,
      values: ['lead', 'customer', 'churn'],
    },
    crmId: {
      type: DataTypes.BIGINT,
    },
  }, {
    tableName: 'companies',
    underscored: true,
    timestamps: false,
    schema: process.env.DATABASE_SCHEMA,
    paranoid: true,
  });

  return Companies;
};

Directory: /forest

This directory contains the companies.js file where the smart action is declared. A smart field has also been added to add a link to the company's Hubspot profile if the company's crmId field is not null.

/forest/hubspot-companies.js
const { collection } = require('forest-express-sequelize');
​
collection('companies', {
  actions: [{
      name: 'Create company in Hubspot',
      type: 'single',
    }],
  fields: [{
      // adding a field that will allow to be directed on click to the company's profile in hubspot
      field: 'crm link',
      type: 'String',
      get: (company) => company.crmId ?
        'https://app.hubspot.com/contacts/6332498/company/' + company.dataValues.crmId : null
    }],
  segments: [],
});

Directory: /routes

This directory contains the companies.js file where the smart action logic is implemented.

In this logic a Hubspot company instance is created through a /post create company call to the Hubspot API.

The Hubspot API key is defined in the .env file and requested through the expression process.env.HUBSPOT_API.

/routes/hubspot-companies.js
const express = require('express');
const { PermissionMiddlewareCreator } = require('forest-express-sequelize');
const { companies } = require('../models');
const superagent = require('superagent');

const router = express.Router();

// function that returns a sequelize object
function getRecord(collection, recordId) {
  return collection.findOne({ where: { id: recordId } });
}

// function that update a company record crmId with the hubspot companyId
function setCrmId(record, hubspotId) {
  record.crmId = hubspotId;
  return record.save();
}

// function that creates a company in Hubspot through the hubspot API
function createHubspotCompany(company) {
  return superagent
    .post(`https://api.hubapi.com/companies/v2/companies?hapikey=${process.env.HUBSPOT_API}`)
    .send({properties: [
      {
        name: 'name',
        value: company.name,
      },
      {
        name: 'description',
        value: company.description,
      },
      {
        name: 'city',
        value: company.headquarters,
      },
      {
        name: 'industry',
        value: company.industry,
      },
    ]})
    .then((response) => JSON.parse(response.res.text));
}


router.post('/actions/create-company-in-Hubspot', async (req, res) => {
  const companyId = req.body.data.attributes.ids[0];
  const company = await getRecord(companies, companyId);

  if (company.crmId) {
    return res.status(400).send({ error: 'A lead from Hubspot is already assigned to this company' });
  }
  try {
    const hubspotCompany = await createHubspotCompany(company);
    await setCrmId(company, hubspotCompany.companyId);
  } catch (err) {
    console.log('error => ', err);
    res.status(400).send({ error: 'could not create lead' });
  }
  return res.send({ success: 'Lead has been created in Hubspot!' });
});

npm package

superagent