Skip to content

Integration Platform

High-chroma blue. The connector names in the hero, a catalogue with honest live/beta/planned status, four SDK languages and a dated roadmap for everyone who is not on the list.

4 routes4 pages · 14 blocks29 files · 3,498 lineslucide-reactAdded 2 Sept 2026

What's included

  • app/changelog/page.tsx
  • app/docs/page.tsx
  • app/globals.css
  • app/layout.tsx
  • app/not-found.tsx
  • app/page.tsx
  • and 8 more files
  • 4 pages it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab init integration-platform ./my-app

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Every screen

38 connectors, one contract

One API for every system your customers already run

Junction normalises 38 CRMs, ledgers and HR systems behind a single schema. Write the integration once; we keep it working when their vendor changes the field names.

  • Salesforce
  • HubSpot
  • NetSuite
  • Xero
  • QuickBooks
  • Workday
  • BambooHR
  • Dynamics 365
  • and 30 more

The whole catalogue, with what actually works

Beta means the endpoints exist and the edge cases do not all have tests yet. Planned means it is not built. We would rather lose the signup than the trust.

  • Salesforce

    CRM

    Available

    Accounts, contacts, opportunities and custom objects.

  • HubSpot

    CRM

    Available

    Full CRM object model, including associations.

  • Pipedrive

    CRM

    Available

    Deals, persons, organisations and activities.

  • NetSuite

    Ledger

    Available

    GL, AR/AP, subsidiaries and saved searches.

  • Xero

    Ledger

    Available

    Invoices, bills, contacts and tracking categories.

  • QuickBooks

    Ledger

    Available

    Online only — the desktop editions are not supported.

  • Sage Intacct

    Ledger

    Beta

    Dimensions, journals and multi-entity consolidation.

  • Workday

    HR

    Beta

    Workers, org structure and compensation, read-only.

  • BambooHR

    HR

    Available

    Employees, time off and custom fields.

  • Personio

    HR

    Available

    Employees, absences and attendance.

  • Dynamics 365

    CRM

    Beta

    Sales and Business Central. Finance & Ops is planned.

  • SAP S/4HANA

    Ledger

    Planned

    Scoped to the finance modules. In build with two design partners.

  • Oracle Fusion

    Ledger

    Planned

    ERP and HCM. Design partners wanted.

  • Gusto

    HR

    Planned

    Payroll runs, employees and contractor payments.

One normalised payload, whatever is behind it
import { Junction } from '@junction/sdk'

const junction = new Junction(process.env.JUNCTION_KEY!)

// Same shape whether the account lives in Salesforce,
// HubSpot or Dynamics — the connector is a parameter,
// not a different code path.
const { data } = await junction.accounts.list({
  connection: 'conn_8fK2',
  updatedSince: '2026-08-01',
  limit: 100,
})

for (const account of data) {
  console.log(account.id, account.name, account.owner?.email)
}

What this does that a webhook does not

Every one of these is a thing you would otherwise build once per connector, and then maintain once per connector for as long as the product exists.

Normalisation

One schema, thirty-eight field-naming conventions

An account is an account whether the system underneath calls it a Customer, an Organisation or a Business Partner. Custom fields come through in a typed passthrough rather than being dropped, so the 20% of every integration that is somebody’s bespoke field does not fall out of the abstraction.

  • One object model across CRM, ledger and HR
  • Custom fields preserved and typed
  • Field-level mapping you can override per connection

Auth

The OAuth dance, thirty-eight times, already done

A hosted connection flow your customer completes in your product, with token refresh, revocation handling and the per-vendor quirks absorbed. The one that expires silently after 90 days is handled; you find out from a webhook rather than from a customer.

  • Hosted or embedded connect flow
  • Refresh and revocation handled
  • Per-connection scope reporting

Change

When their vendor breaks the API, it is our incident

Upstream schema changes are absorbed behind the normalised model wherever they can be, and announced with a migration window where they cannot. In four years we have passed through two breaking changes to customers, both with ninety days’ notice.

  • Versioned, with a 12-month support window
  • 2 breaking changes passed through since 2022
  • Status per connector, not just per platform

Pricing

Credits, because integration volume is not a straight line

A customer’s migration month is fifty times a normal one. Seats make the quiet months feel like a rip-off and the busy ones like a penalty.

One credit is one API call to a connected system — a read, a write or a page of results. Retries after our own failures are not charged.

  • 250K

    $99

    per month

    Enough for about 40 connected customers on a normal month.

    Start here
  • Most bought

    2M

    $599Save 25%

    per month

    The tier most teams settle on once they are past a hundred connections.

    Choose 2M
  • 10M

    $2,200Save 45%

    per month

    Volume pricing below this rate is available above 25M.

    Talk to us
  • Unused credits roll over for 12 months
  • Retries after our own failures are never charged
  • No per-connector fee and no per-seat fee
  • Hard caps available, so a runaway job cannot invoice you

If yours is not on the list yet

Dated where we can date it, and marked planned rather than “coming soon”. Design partners get the connector free for the first year and a say in the field mapping.

Shipped

2
  • Salesforce custom objects, write path

    Landed in v3.1, August.

  • Sage Intacct multi-entity

    Consolidation dimensions included.

In progress

3
  • Workday write pathQ4 2026

    Read-only today; writes with two design partners.

  • Dynamics 365 Finance & OpsQ4 2026

    Sales and Business Central are already live.

  • Webhook-based change feeds for every connectorQ1 2027

    Polling today on 11 of the 38.

Planned

3
  • SAP S/4HANA, finance modulesH1 2027

    Scoped with two design partners. Not started.

  • Oracle Fusion ERPH1 2027

    Design partners wanted — talk to us.

  • Gusto and Rippling payrollH1 2027

    Payroll is a different object model; scoping now.

What you will ask in the security review

Or at the point where somebody senior asks what happens if this goes away.

Do you store our customers’ data?
Only what is needed to serve a request, and by default only for the 24 hours a retry window needs. Sync mode caches normalised records so you can query without hitting the upstream rate limit; it is opt-in per connection, and the retention is yours to set down to zero.
What happens when we outgrow you?
Every connection can be exported with its tokens and its field mappings, in a documented format, on every plan. We would rather you left cleanly than stayed because leaving was expensive — and the number of teams that ask this and then never leave is most of them.
How do you handle upstream rate limits?
Per-connection budgeting, queued writes and automatic backoff tuned to each vendor’s published limits. Your call either returns data or returns a documented 429 with a retry-after — it never silently returns a partial page.
Who is liable when a connector loses data?
We are, up to the limits in the contract, and the contract is on the site rather than behind a sales call. Writes are idempotent by key so a retry cannot double-post, which is the failure mode this question is really about.
Can we self-host it?
No, and we would rather say so plainly than run a sales process that ends here. Single-tenant deployment in your cloud region is available on the top tier; the code does not leave our estate.
What is your uptime, and where is it published?
99.95% on the API, measured per connector and published per connector — a status page that stays green while one connector has been broken for a week is worse than no status page at all.

Live components in your current theme — switch routes, or the phone icon to check the mobile layout. Colours are this template’s Cobalt palette, which ships in app/globals.css. The blue everything infrastructure is, done properly rather than by default — high chroma at 212°, with a lighter azure accent to keep it off the navy end.

Get it

29 files · .zip · nothing to configure · Pro

then

cd integration-platform
npm install
npm run dev

The archive contains the whole project — routes, blocks, theme tokens, Tailwind and PostCSS config, tsconfig and a .gitignore. One runtime dependency, and no Hoverlab dependency at all: it is your code from the moment it unzips.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

Routes

PathPageFile
/Integration Platform Landing Pageapp/page.tsx
/docsDocumentation Pageapp/docs/page.tsx
/changelogChangelog Pageapp/changelog/page.tsx
404404 Pageapp/not-found.tsx

What you get

project root(8 files)

  • GETTING-STARTED.md
  • gitignore
  • next.config.ts
  • package.json
  • postcss.config.mjs
  • README.md
  • tailwind.config.ts
  • tsconfig.json

app/(6 files)

  • changelog/page.tsx
  • docs/page.tsx
  • globals.css
  • layout.tsx
  • not-found.tsx
  • page.tsx

components/(15 files)

  • changelog-timeline.tsx
  • code-tabs-panel.tsx
  • docs-layout.tsx
  • faq-grid.tsx
  • feature-rows.tsx
  • footer-mega.tsx
  • footer-minimal.tsx
  • hero-integrations.tsx
  • integration-grid.tsx
  • navbar-simple.tsx
  • newsletter-signup.tsx
  • not-found-404.tsx
  • pricing-credits.tsx
  • roadmap-columns.tsx
  • theme-provider.tsx

Every file is listed. The 14 files in components/ are the blocks the pages import — each one has its own page if you want to read it on its own.

Project files

Everything except the blocks. Opens on app/globals.css — the file that makes the rest look right, since every block styles itself with bg-card and text-muted-foreground rather than literal colours.

app/globals.css
@tailwind base;
@tailwind components;
@tailwind utilities;

/**
 * Design tokens — the Cobalt palette.
 *
 * The blue everything infrastructure is, done properly rather than by default — high chroma at 212°, with a lighter azure accent to keep it off the navy end.
 *
 * This file is the reason a pasted block looks right. Every block and page
 * styles itself with semantic classes — `bg-card`, `text-muted-foreground`,
 * `border-border` — rather than literal colours, so they inherit whatever
 * you define here instead of fighting it. Change a value below and every
 * section in the project moves with it. Change the hue on `--primary` and
 * `--ring` together and you have rebranded the site.
 *
 * Values are bare HSL channels, not `hsl(...)` calls. That is what lets
 * Tailwind compose them with an alpha suffix: `bg-primary/10` expands to
 * `hsl(var(--primary) / 0.1)`, which is impossible if the variable already
 * carries its own function wrapper.
 *
 * Every foreground/background pair below clears WCAG AA (4.5:1) in both
 * themes. If you retune one, check the pair rather than trusting the eye —
 * mid-lightness accents are the ones that fail.
 */

@layer base {
  :root {
    --background: 210 40% 99%;
    --foreground: 215 45% 10%;
    --card: 0 0% 100%;
    --card-foreground: 215 45% 10%;
    --popover: 0 0% 100%;
    --popover-foreground: 215 45% 10%;
    --primary: 212 90% 36%;
    --primary-foreground: 0 0% 100%;
    --secondary: 210 35% 95%;
    --secondary-foreground: 215 40% 18%;
    --muted: 210 28% 95%;
    --muted-foreground: 215 12% 42%;
    --accent: 198 60% 92%;
    --accent-foreground: 205 60% 18%;
    --destructive: 0 72% 47%;
    --destructive-foreground: 0 0% 100%;
    --border: 210 24% 89%;
    --input: 210 24% 89%;
    --ring: 212 90% 36%;

    --radius: 0.75rem;
  }

  .dark {
    --background: 215 42% 5%;
    --foreground: 210 15% 97%;
    --card: 215 34% 8%;
    --card-foreground: 210 15% 97%;
    --popover: 215 34% 8%;
    --popover-foreground: 210 15% 97%;
    --primary: 208 90% 66%;
    --primary-foreground: 215 50% 7%;
    --secondary: 215 26% 15%;
    --secondary-foreground: 210 15% 97%;
    --muted: 215 26% 15%;
    --muted-foreground: 212 12% 67%;
    --accent: 198 32% 18%;
    --accent-foreground: 198 55% 86%;
    --destructive: 0 62% 52%;
    --destructive-foreground: 0 0% 100%;
    --border: 215 22% 19%;
    --input: 215 22% 19%;
    --ring: 208 90% 66%;
  }
}

@layer base {
  * {
    @apply border-border;
  }

  body {
    @apply bg-background text-foreground antialiased;
  }

  /**
   * Global motion opt-out.
   *
   * Blocks guard their own animations with Tailwind's `motion-safe:`, but
   * third-party CSS and anything you add later will not. This is the
   * backstop: it neutralises every animation and transition on the page
   * for users who have asked the OS for reduced motion, rather than
   * relying on each author to remember.
   */
  @media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
      animation-duration: 0.01ms !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.01ms !important;
      scroll-behavior: auto !important;
    }
  }
}

More Landing Pages

Open the full page for this template

Startup Waitlist

The waitlist hero with the count on it

A pre-launch site in violet: one email field, a blog to keep the list warm, and no pricing to be held to. The smallest honest thing to put in front of a product that does not exist yet.

4 routes4 pages13 blocksUltraviolet
Pro
Open the full page for this template

Developer Tool

The terminal hero, typing the install

Near-black buttons, square corners and a terminal-green accent. Install command above the fold, real code before any prose, docs and changelog behind it.

5 routes5 pages17 blocksGraphite
Pro
Open the full page for this template

Mobile App

The store-badge download hero

Emerald and 16px corners, built around one conversion: the store install. Badges and the App Store rating above the fold, a single price, and an account area for the subscription.

5 routes5 pages18 blocksSignal
Pro
Open the full page for this template

Agency Studio

Case studies that name the constraint

Terracotta on warm paper, with no blue in it anywhere. Full-bleed hero, client list, the actual team, a journal and a careers page — and no pricing, on purpose.

5 routes5 pages15 blocksSandstone
Pro
Open the full page for this template

Local Service

Hours, address and phone above the fold

Deep teal, for a business people let into their house. A booking widget above the fold, every price published, and a compliance footer with the registrations a regulated trade has to show.

4 routes4 pages14 blocksHarbour
Pro
Open the full page for this template

Marketplace

Both sides of the market on one page

Dark olive on warm off-white, built for two audiences at once: search and real listings for buyers, the seller economics below the fold, and a browse route behind it.

5 routes5 pages19 blocksMoss
Pro
Open the full page for this template

Enterprise

The security posture band

Burgundy and square corners — the register of things bought in a boardroom. Numbers in the hero, a comparison table that concedes rows, and published prices instead of a sales wall.

5 routes5 pages18 blocksClaret
Pro
Open the full page for this template

Creator Course

The curriculum, module by module

Magenta-plum with the softest corners in the set, for one person selling one thing. A student testimonial as the hero, a long instructor section, one price and the refund policy on the page.

5 routes5 pages15 blocksPlum
Open the full page for this template

Newsletter

The archive, above the testimonials

One decision, made from the archive: a hero with the field in it, the back issues as the actual argument, and the three worries about handing over an address answered as content.

6 routes6 pages22 blocksTideline