{
  "slug": "irely",
  "url": "https://apps.sectorgrowth.com/integrations/irely/",
  "name": "iRely",
  "vendor": "iRely",
  "aliases": [
    "i21",
    "iRely i21",
    "iRely Commodity",
    "iRely Agriculture",
    "iRely Petroleum"
  ],
  "website": "https://irely.com/",
  "category": {
    "slug": "manufacturing-and-distribution-erp",
    "name": "Manufacturing and distribution ERP",
    "url": "https://apps.sectorgrowth.com/categories/manufacturing-and-distribution-erp/"
  },
  "summary": "iRely's i21 holds commodity contracts, producer accounts and invoices behind a documented REST API that reads far more of that record than it writes.",
  "answer": "No. Neither HubSpot nor iRely publishes an i21 app in the HubSpot App Marketplace as of September 2026, and a search returns only listings that mention the name in passing. The route we recommend is a custom API integration over the i21 REST API, reading customers, contracts and orders on their last-updated dates, at 70 to 150 build hours. It runs one way at first, because the API cannot create an i21 customer.",
  "nativeApp": {
    "status": "none",
    "verifiedAt": "2026-09-28"
  },
  "api": {
    "style": "rest",
    "auth": "session",
    "webhooks": "unknown",
    "changedSince": "partial",
    "sandbox": "unknown",
    "docsUrl": "https://api.irely.com/docs/api/introduction"
  },
  "objects": [
    {
      "source": "Customer",
      "hubspot": "company",
      "direction": "to_hubspot",
      "key": "Entity id in a custom HubSpot property, with the customer number shown as a label",
      "notes": "One entity can be flagged as customer and vendor at once, and still becomes one company."
    },
    {
      "source": "Entity contact",
      "hubspot": "contact",
      "direction": "to_hubspot",
      "key": "Entity contact id, with the email checked for collisions before the upsert",
      "notes": "Contacts document no last-updated date, so they are re-read in full each cycle."
    },
    {
      "source": "Commodity contract",
      "hubspot": "custom",
      "direction": "to_hubspot",
      "key": "Contract header id, with the contract number as the readable label",
      "notes": "The entity id on the contract names the customer or vendor, so it associates without a lookup."
    },
    {
      "source": "Opportunity",
      "hubspot": "deal",
      "direction": "to_hubspot",
      "key": "Opportunity id",
      "notes": "Only where the i21 CRM keeps the pipeline, since the API reads opportunities and cannot write them."
    },
    {
      "source": "Sales order",
      "hubspot": "custom",
      "direction": "to_hubspot",
      "key": "Sales order id, with the order number as the label",
      "notes": "The list names the customer rather than returning its id, so the association needs a match step."
    },
    {
      "source": "Invoice",
      "hubspot": "custom",
      "direction": "to_hubspot",
      "key": "Invoice id, with the invoice number as the label",
      "notes": "No documented last-updated date, so open invoices are re-read until i21 marks them paid."
    }
  ],
  "approaches": [
    {
      "kind": "custom",
      "fit": "recommended",
      "why": "A keyed service reads each i21 resource on its own watermark, asks the timestamp endpoints which ids were deleted, and re-reads contacts and open invoices, which carry no documented last-updated date."
    },
    {
      "kind": "ipaas",
      "fit": "possible",
      "why": "An iPaaS with a generic HTTP step can call the i21 API for one narrow flow, such as new customers into a marketing list. Six watermarks, a deletion sweep and token refresh are more state than it holds well."
    },
    {
      "kind": "native",
      "fit": "avoid",
      "why": "The HubSpot App Marketplace has no app for iRely or i21 from HubSpot or from iRely, only listings whose descriptions happen to mention the name."
    }
  ],
  "connectionMethods": [
    "api",
    "ipaas"
  ],
  "effort": {
    "discoveryHours": [
      10,
      20
    ],
    "buildHours": [
      70,
      150
    ],
    "buildBand": "70 to 150 hours",
    "typicalElapsed": "4 to 8 weeks"
  },
  "pattern": "polling-watermark",
  "faqs": [
    {
      "q": "Is there an iRely or i21 app in the HubSpot App Marketplace?",
      "a": "No. A search of the HubSpot App Marketplace for iRely returned 35 listings, and every one was a fuzzy match whose description mentions the word, with nothing published by HubSpot or by iRely. The routes that exist are a build against the documented i21 REST API, or an iPaaS calling that same API for a narrow flow."
    },
    {
      "q": "How does the i21 REST API authenticate a HubSpot integration?",
      "a": "With a login call. The integration posts a username, a password and a company code to the authentication endpoint and receives a JSON Web Token to send as a bearer token, plus a longer-lived refresh token. iRely documents a second login for iRely user credentials. Tokens expire after a period set by the server, and an expired one returns a 401."
    },
    {
      "q": "How fresh is iRely data in HubSpot?",
      "a": "As fresh as the schedule you choose, because the public i21 reference documents no webhooks to push a change. Customers, contracts, sales orders and opportunities read incrementally on their last-updated dates, so a frequent cycle stays cheap. Contacts and open invoices are re-read in full, and the size of that re-read is what limits how often a cycle can run."
    },
    {
      "q": "What happens when an i21 record is deleted or a sync runs twice?",
      "a": "Deletions are found through the timestamp endpoints, which report a deletion date for the ids the service already holds, and we mark the matching HubSpot record for review rather than deleting it outright. A second run of the same batch changes nothing, because every upsert keys on the i21 id held in a unique HubSpot property."
    },
    {
      "q": "Can HubSpot create customers in iRely i21?",
      "a": "Not through the API. The i21 customer and entity resources are read only, so a new customer is set up in i21 by the office and reaches HubSpot on the next cycle. The API does accept quotes, sales orders and activities, and a won deal raising a draft quote for the office to review is the write-back we would scope as a second phase."
    },
    {
      "q": "Which i21 permissions does a HubSpot integration need?",
      "a": "A read permission on each resource it syncs, such as customer.read and invoice.read, granted to the API user and carried as claims in its token. A user without one gets a 403 on that resource while the others succeed, so we list the permissions in discovery and treat the first 403 as a stop, never a skip."
    },
    {
      "q": "How long does an iRely and HubSpot integration take?",
      "a": "Plan on 10 to 20 hours of discovery and 70 to 150 hours of build for customers, contacts, contracts, orders, invoices and opportunities, with watermarks, a deletion sweep and replay endpoints. Most of the discovery goes on two questions: which system owns the pipeline, and how sales orders resolve to customers when the order list names them."
    }
  ],
  "sections": [
    {
      "depth": 2,
      "text": "Why teams connect iRely to HubSpot",
      "anchor": "#why-teams-connect-irely-to-hubspot",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#why-teams-connect-irely-to-hubspot"
    },
    {
      "depth": 2,
      "text": "What syncs",
      "anchor": "#what-syncs",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#what-syncs"
    },
    {
      "depth": 2,
      "text": "Architecture",
      "anchor": "#architecture",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#architecture"
    },
    {
      "depth": 2,
      "text": "Three ways to connect",
      "anchor": "#three-ways-to-connect",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#three-ways-to-connect"
    },
    {
      "depth": 2,
      "text": "What breaks and how we prevent it",
      "anchor": "#what-breaks-and-how-we-prevent-it",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#what-breaks-and-how-we-prevent-it"
    },
    {
      "depth": 3,
      "text": "Inactive customers hidden by default",
      "anchor": "#inactive-customers-hidden-by-default",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#inactive-customers-hidden-by-default"
    },
    {
      "depth": 3,
      "text": "Sales orders that name the customer",
      "anchor": "#sales-orders-that-name-the-customer",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#sales-orders-that-name-the-customer"
    },
    {
      "depth": 3,
      "text": "Invoices with no last-updated date",
      "anchor": "#invoices-with-no-last-updated-date",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#invoices-with-no-last-updated-date"
    },
    {
      "depth": 3,
      "text": "A token that expires mid run",
      "anchor": "#a-token-that-expires-mid-run",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#a-token-that-expires-mid-run"
    },
    {
      "depth": 3,
      "text": "One missing read permission",
      "anchor": "#one-missing-read-permission",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#one-missing-read-permission"
    },
    {
      "depth": 2,
      "text": "Our approach",
      "anchor": "#our-approach",
      "url": "https://apps.sectorgrowth.com/integrations/irely/#our-approach"
    }
  ],
  "caseStudies": [],
  "guides": [
    "https://apps.sectorgrowth.com/guides/choose-a-hubspot-integration-approach/",
    "https://apps.sectorgrowth.com/guides/how-sector-growth-scopes-an-integration/"
  ],
  "status": "published",
  "verifiedAt": "2026-09-28",
  "updatedAt": "2026-09-28",
  "authors": [
    {
      "name": "Prash",
      "role": "Lead of Technical Integrations and AI Solutions"
    }
  ],
  "sources": [
    {
      "title": "i21 API: Introduction",
      "url": "https://api.irely.com/docs/api/introduction"
    },
    {
      "title": "i21 API: Authentication",
      "url": "https://api.irely.com/docs/api/authentication"
    },
    {
      "title": "i21 API: HTTP Status Codes",
      "url": "https://api.irely.com/docs/api/status-codes"
    },
    {
      "title": "i21 API: Dynamic Parameters",
      "url": "https://api.irely.com/docs/api/dynamic-parameters"
    },
    {
      "title": "i21 API: Customers",
      "url": "https://api.irely.com/docs/api/customer"
    },
    {
      "title": "i21 API: Sales Orders",
      "url": "https://api.irely.com/docs/api/salesorder"
    },
    {
      "title": "i21 API: Invoices",
      "url": "https://api.irely.com/docs/api/invoice"
    },
    {
      "title": "i21 API: Opportunities",
      "url": "https://api.irely.com/docs/api/opportunity"
    },
    {
      "title": "i21 API: Contracts",
      "url": "https://api.irely.com/docs/api/contract"
    },
    {
      "title": "i21 API: Entities",
      "url": "https://api.irely.com/docs/api/entity"
    },
    {
      "title": "i21 API: Revision History",
      "url": "https://api.irely.com/docs/api/changelog"
    },
    {
      "title": "CRM - i21 Documentation - Confluence",
      "url": "https://irely.atlassian.net/wiki/spaces/DOC/pages/43437564/CRM"
    },
    {
      "title": "Our Story - iRely",
      "url": "https://irely.com/company/"
    }
  ]
}