Pipedrive integrates with Bolt.new through a Next.js API route using a simple API token from your Pipedrive account settings. Store the token in .env, create API routes that call Pipedrive's REST API to fetch deals, pipeline stages, contacts, and organizations, and build a custom Kanban-style deal pipeline visualization or export deals as JSON. No OAuth required — Pipedrive's token authentication is one of the easiest CRM integration patterns.
Pipedrive Sales Pipeline Integration for Bolt.new Apps
Pipedrive is built with a singular focus: making sales pipeline management visual and actionable. While platforms like HubSpot have expanded into full marketing suites, Pipedrive remains centered on the deal — what stage it is in, when it is expected to close, and what activities are needed to move it forward. This focused design philosophy extends to the API, which is clean, well-documented, and uses straightforward token-based authentication that makes it one of the easiest CRM integrations to implement in Bolt.new.
The common developer query 'export Pipedrive to JSON' reflects a real use case: sales teams often need to extract Pipedrive data for analysis in other tools (spreadsheets, BI platforms, custom reports) or sync it to other systems. The Pipedrive API makes this accessible — with just an API token and a few GET requests, you can retrieve complete deal, contact, and pipeline data as JSON. Bolt.new makes building a custom export and reporting interface around this data straightforward.
For Bolt.new apps, Pipedrive integration serves three primary purposes: building a custom pipeline visualization that matches your brand or workflow better than Pipedrive's default UI (for internal tools or client-facing dashboards), capturing leads from a website or marketing tool and automatically creating Pipedrive contacts and deals, and exporting or syncing Pipedrive data to other systems for reporting or multi-tool workflows. The API token authentication is particularly developer-friendly — no OAuth flow, no redirect URIs, no token expiration to manage. One token gives you immediate API access.
Integration method
Pipedrive uses simple API token authentication — get the token from Settings → Personal Preferences → API, store it in .env, and add it as a query parameter or Bearer token on every API call. Next.js API routes proxy all Pipedrive requests server-side to keep the token out of the browser bundle. Pipedrive's REST API follows standard conventions and is one of the easiest CRM APIs to work with.
Prerequisites
- A Pipedrive account (pipedrive.com) — a free trial is available with full API access; paid plans start at $14/user/month
- Your Pipedrive API token from Settings → Personal Preferences → API — a 40-character alphanumeric token
- Your Pipedrive pipeline ID and stage IDs — find them via the API at /v1/stages or in the Pipedrive URL when viewing a pipeline
- A Bolt.new project using Next.js (for API routes that keep the token server-side)
- Optional: Pipedrive company domain (your-company.pipedrive.com) for the subdomain-based API URL pattern
Step-by-step guide
Get your Pipedrive API token and configure environment variables
Get your Pipedrive API token and configure environment variables
Pipedrive uses one of the simplest authentication patterns available in any CRM: a static API token that you add as a query parameter or Authorization Bearer token on every API request. Unlike OAuth flows, there are no redirect URIs, no token expiration (unless you manually regenerate the token), and no scopes to configure — a single token gives you full access to all API endpoints your user account can access. To get your API token, log into Pipedrive and go to your personal settings. Click your avatar in the top-right and select 'Personal preferences.' Navigate to the API tab. You will see your personal API token — a 40-character alphanumeric string. Copy it. This token has the same access level as your Pipedrive user account, so it can read and write all deals, contacts, and pipeline data you have permission to access. Pipedrive offers two ways to pass the API token in requests. Method 1: Add it as a query parameter on every request URL: https://api.pipedrive.com/v1/deals?api_token=YOUR_TOKEN. Method 2: Pass it as a Bearer token in the Authorization header: Authorization: Bearer YOUR_TOKEN. The query parameter approach is simpler for testing; the Authorization header approach is cleaner for production code since tokens do not appear in server access logs. You also need your pipeline ID and stage IDs for creating deals. To find them, make a GET request to https://api.pipedrive.com/v1/stages?api_token=YOUR_TOKEN in a browser or API tool. The response lists all pipeline stages with their IDs, names, and the pipeline they belong to. Stage IDs are small integers (typically 1-50 for accounts with a few pipelines). Store the token in .env as PIPEDRIVE_API_TOKEN. Add your primary pipeline ID as PIPEDRIVE_PIPELINE_ID. These are server-side credentials — never prefix them with NEXT_PUBLIC_ since the API token gives write access to your entire CRM.
Add Pipedrive API credentials to .env. Create the file with: PIPEDRIVE_API_TOKEN=your_40_char_token_here (server-side only, never NEXT_PUBLIC_) and PIPEDRIVE_PIPELINE_ID=your_pipeline_id (find via GET https://api.pipedrive.com/v1/stages?api_token=TOKEN). Add a comment explaining where to find each value in Pipedrive's settings.
Paste this in Bolt.new chat
1# .env2# Pipedrive API token — server-side only, never NEXT_PUBLIC_3# Get from Pipedrive Settings → Personal Preferences → API tab4# 40-character alphanumeric string that gives full API access5PIPEDRIVE_API_TOKEN=a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b267# Primary pipeline ID for creating new deals8# Find via: GET https://api.pipedrive.com/v1/stages?api_token={TOKEN}9PIPEDRIVE_PIPELINE_ID=11011# Optional: stage ID for new inbound leads (first stage in your pipeline)12PIPEDRIVE_NEW_LEAD_STAGE_ID=1Pro tip: Pipedrive has two API domains: api.pipedrive.com (standard) and your-company.pipedrive.com (subdomain-based, used for OAuth apps). For API token authentication, always use api.pipedrive.com — the subdomain format is only required for OAuth flows.
Expected result: The Pipedrive API token is stored in .env. You can test it immediately by opening https://api.pipedrive.com/v1/deals?api_token=YOUR_TOKEN in a browser — it should return your Pipedrive deals as JSON without any additional setup.
Build the Pipedrive API service and deal management routes
Build the Pipedrive API service and deal management routes
Create the Pipedrive API service module and the core Next.js API routes for deal and contact operations. Pipedrive's REST API v1 is the current stable version. All endpoints follow standard CRUD patterns and return consistent response shapes with a 'data' field containing the result and a 'success' boolean. The key Pipedrive endpoints are: GET /v1/deals (list deals with filtering by status, pipeline, person, and organization), GET /v1/deals/{id} (single deal with full details), POST /v1/deals (create deal), PUT /v1/deals/{id} (update deal), GET /v1/stages (all pipeline stages), GET /v1/persons (contacts), POST /v1/persons (create contact), GET /v1/organizations (companies), POST /v1/organizations (create company), and POST /v1/notes (add note to a deal, person, or org). For deal listing, the most useful query parameters are: status (open, won, lost, deleted, or all_not_deleted), pipeline_id (filter to a specific pipeline), stage_id (filter to a specific stage), user_id (assigned user filter), start (pagination offset), and limit (up to 500). The response includes an additional_data.pagination object with start, limit, more_items_in_collection, and next_start for pagination. Pipedrive returns custom fields (fields you added in Pipedrive's settings) with auto-generated hash keys like 'abc123def456'. To map these to human-readable names, call GET /v1/dealFields to get the field definitions with their keys and names. Cache this field mapping to avoid fetching it on every request. Build the service module with typed helper functions and test the deal listing endpoint in Bolt's preview. Outbound API calls to api.pipedrive.com work in the WebContainer since they use standard HTTPS — you should see your Pipedrive deals appear in the dashboard immediately.
Create a Pipedrive API integration for this Next.js app. (1) Create lib/pipedrive.ts with a pipedriveFetch(endpoint, options) utility that adds the PIPEDRIVE_API_TOKEN as a query parameter to https://api.pipedrive.com/v1 requests. Export: getDeals(filters), getDeal(id), createDeal(fields), createPerson(fields), createOrganization(name), addNote(dealId, content), and getStages(pipelineId). (2) Create app/api/pipedrive/deals/route.ts with GET (list open deals, grouped by stage) and POST (create deal from form submission — create person and org first if they don't exist). (3) Create app/api/pipedrive/stages/route.ts that returns all pipeline stages. Include TypeScript types for Pipedrive deal and person objects.
Paste this in Bolt.new chat
1// lib/pipedrive.ts2const PD_BASE = 'https://api.pipedrive.com/v1';34function getToken(): string {5 const token = process.env.PIPEDRIVE_API_TOKEN;6 if (!token) throw new Error('PIPEDRIVE_API_TOKEN not configured');7 return token;8}910async function pipedriveFetch<T>(11 endpoint: string,12 options: RequestInit = {},13 queryParams: Record<string, string> = {}14): Promise<T> {15 const params = new URLSearchParams({ api_token: getToken(), ...queryParams });16 const url = `${PD_BASE}${endpoint}?${params}`;1718 const res = await fetch(url, {19 ...options,20 headers: { 'Content-Type': 'application/json', ...options.headers },21 });2223 if (!res.ok) {24 const body = await res.json().catch(() => ({ error: res.statusText }));25 throw Object.assign(new Error(body.error ?? 'Pipedrive API error'), {26 status: res.status,27 body,28 });29 }3031 const json = await res.json();32 if (!json.success) {33 throw new Error(json.error ?? 'Pipedrive returned success: false');34 }35 return json.data as T;36}3738export interface PipedriveDeal {39 id: number;40 title: string;41 value: number;42 currency: string;43 stage_id: number;44 pipeline_id: number;45 person_name: string;46 org_name: string;47 expected_close_date: string;48 owner_name: string;49 status: string;50}5152export async function getDeals(53 status: string = 'open',54 pipelineId?: number,55 limit = 10056) {57 const params: Record<string, string> = { status, limit: limit.toString() };58 if (pipelineId) params.pipeline_id = pipelineId.toString();59 return pipedriveFetch<PipedriveDeal[]>('/deals', {}, params);60}6162export async function createDeal(fields: {63 title: string;64 value?: number;65 pipeline_id?: number;66 stage_id?: number;67 person_id?: number;68 org_id?: number;69}) {70 return pipedriveFetch<{ id: number }>('/deals', {71 method: 'POST',72 body: JSON.stringify(fields),73 });74}7576export async function createPerson(fields: {77 name: string;78 email?: string[];79 phone?: string[];80 org_id?: number;81}) {82 return pipedriveFetch<{ id: number }>('/persons', {83 method: 'POST',84 body: JSON.stringify(fields),85 });86}8788export async function createOrganization(name: string) {89 return pipedriveFetch<{ id: number }>('/organizations', {90 method: 'POST',91 body: JSON.stringify({ name }),92 });93}9495export async function addNote(dealId: number, content: string) {96 return pipedriveFetch<{ id: number }>('/notes', {97 method: 'POST',98 body: JSON.stringify({ deal_id: dealId, content }),99 });100}101102export async function getStages(pipelineId?: number) {103 const params: Record<string, string> = {};104 if (pipelineId) params.pipeline_id = pipelineId.toString();105 return pipedriveFetch<Array<{ id: number; name: string; pipeline_id: number; order_nr: number }>>(106 '/stages',107 {},108 params109 );110}Pro tip: Pipedrive's API response wraps data in a 'data' field and includes a 'success: true/false' boolean. Always check the success field before using the data — the API returns 200 status with success: false for logical errors like 'deal not found.'
Expected result: lib/pipedrive.ts provides full CRUD access to Pipedrive deals, persons, and organizations. The /api/pipedrive/deals route returns open deals grouped by stage. Outbound calls to api.pipedrive.com work in the Bolt WebContainer preview — you should see your real Pipedrive deals immediately.
Build the Kanban pipeline visualization
Build the Kanban pipeline visualization
The core value of a custom Pipedrive integration is a visual deal pipeline that your team or clients can use without needing individual Pipedrive licenses. A Kanban board showing deals organized by stage, with values and close dates visible at a glance, is the canonical display format. Fetch pipeline stages first using GET /v1/stages?pipeline_id={your_pipeline_id} to get the ordered list of stages with their IDs and names. Then fetch deals and group them by stage_id. Display stages as columns in horizontal scroll order matching the Pipedrive pipeline flow. Each deal card should show: deal title, associated person or organization name, deal value formatted as currency using Intl.NumberFormat, the assigned user (owner), and expected close date with a relative indicator (days remaining or days overdue). Color-code the close date: green for 14 or more days away, yellow for 1-13 days, red for past due. Add a pipeline summary header showing the total number of deals and total value per stage — this immediately communicates pipeline health without counting individual cards. The total value for the 'Closed Won' stage over the current month is a key metric for any sales dashboard. For performance, avoid re-fetching all deals on every interaction. Fetch once on page load, store in React state, and update optimistically when users move deals between stages. The Pipedrive API supports deal stage updates via PUT /v1/deals/{id} with a new stage_id — this enables drag-to-move functionality if you want to build it, though it requires deployed testing since the API call works in the WebContainer but drag-and-drop interactions may behave differently across environments.
Build a Pipedrive Kanban pipeline dashboard at app/dashboard/pipeline/page.tsx. Fetch stages from /api/pipedrive/stages and deals from /api/pipedrive/deals. Group deals by stage_id and display as Kanban columns. Each deal card shows: title, org name, deal value (Intl.NumberFormat with currency), expected close date with color coding (green: 14+ days, yellow: 1-13 days, red: overdue), and owner avatar/initials. Column headers show stage name, deal count, and total stage value. Add a total pipeline value summary at the top. Add a search input that filters deal cards by title or org name. Use Tailwind CSS with shadow cards and a horizontal scroll layout for mobile.
Paste this in Bolt.new chat
1// app/api/pipedrive/deals/route.ts2import { NextResponse } from 'next/server';3import { getDeals, getStages } from '@/lib/pipedrive';45export async function GET(request: Request) {6 const { searchParams } = new URL(request.url);7 const pipelineId = searchParams.get('pipeline_id')8 ? parseInt(searchParams.get('pipeline_id')!)9 : undefined;10 const status = searchParams.get('status') ?? 'open';1112 try {13 const [deals, stages] = await Promise.all([14 getDeals(status, pipelineId),15 getStages(pipelineId),16 ]);1718 // Group deals by stage19 const byStage: Record<number, typeof deals> = {};20 for (const stage of stages) {21 byStage[stage.id] = [];22 }23 for (const deal of (deals ?? [])) {24 if (byStage[deal.stage_id]) {25 byStage[deal.stage_id].push(deal);26 }27 }2829 return NextResponse.json({30 stages: stages ?? [],31 dealsByStage: byStage,32 totalValue: (deals ?? []).reduce((sum, d) => sum + (d.value ?? 0), 0),33 currency: deals?.[0]?.currency ?? 'USD',34 });35 } catch (error) {36 const message = error instanceof Error ? error.message : 'Unknown error';37 return NextResponse.json({ error: message }, { status: 500 });38 }39}Pro tip: Pipedrive's GET /v1/deals endpoint returns up to 500 deals per request when limit=500. For accounts with more than 500 open deals, implement cursor-based pagination using the additional_data.pagination.next_start value returned in the response.
Expected result: The Kanban pipeline dashboard shows Pipedrive deals grouped by stage with color-coded close dates and per-stage totals. The total pipeline value is displayed at the top. Searching filters deal cards in real time without additional API calls.
Implement deal creation from lead capture forms and JSON export
Implement deal creation from lead capture forms and JSON export
Complete the integration by adding two features: creating Pipedrive deals from lead capture form submissions (automating the manual CRM data entry), and exporting Pipedrive data as JSON for analysis or integration with other systems. For deal creation from forms, the workflow creates three connected records in sequence: an organization (the company), a person (the contact), and a deal linked to both. Pipedrive's API requires sequential creation because each resource returns an ID needed for the next: create the organization first, get its ID, create the person with the org_id, get the person's ID, then create the deal with both person_id and org_id. Add a note to the deal with any message or additional context from the form. For JSON export, implement pagination to retrieve all deals rather than just the first page. Pipedrive returns pagination metadata in the additional_data field: pagination.start (current page offset), pagination.limit (items per page), pagination.more_items_in_collection (boolean), and pagination.next_start (next page offset). Loop through all pages until more_items_in_collection is false, accumulating all deals. The export endpoint should accept filter parameters: status (open/won/lost), pipeline_id, start_date and end_date (filtering by expected_close_date or add_time), and user_id (assigned sales rep). Return the full deal array as JSON with a Content-Type: application/json header and a Content-Disposition: attachment; filename=pipedrive-deals.json header to trigger file download from the browser. This covers the popular 'export Pipedrive to JSON' use case: developers and sales managers can schedule exports, download historical data for reporting, or feed Pipedrive data into BI tools like Google Data Studio or Tableau without needing to set up a formal data integration platform.
Add two features to the Pipedrive integration: (1) Lead form route: Create app/api/pipedrive/leads/route.ts with a POST handler that accepts { name, email, phone, company, message, dealTitle }. Create an organization (POST /v1/organizations), then person with org_id (POST /v1/persons), then deal with person_id and org_id (POST /v1/deals), then note with the message (POST /v1/notes). Use PIPEDRIVE_PIPELINE_ID and PIPEDRIVE_NEW_LEAD_STAGE_ID from process.env. Return the deal ID. (2) Export route: Create app/api/pipedrive/export/route.ts with GET that fetches ALL deals (paginating through all pages using additional_data.pagination) and returns them as JSON with appropriate download headers.
Paste this in Bolt.new chat
1// app/api/pipedrive/export/route.ts2import { NextResponse } from 'next/server';34export async function GET(request: Request) {5 const token = process.env.PIPEDRIVE_API_TOKEN;6 if (!token) {7 return NextResponse.json({ error: 'PIPEDRIVE_API_TOKEN not configured' }, { status: 500 });8 }910 const { searchParams } = new URL(request.url);11 const status = searchParams.get('status') ?? 'all_not_deleted';12 const pipelineId = searchParams.get('pipeline_id') ?? '';1314 const allDeals: Record<string, unknown>[] = [];15 let start = 0;16 let hasMore = true;1718 while (hasMore) {19 const params = new URLSearchParams({20 api_token: token,21 status,22 limit: '500',23 start: start.toString(),24 ...(pipelineId && { pipeline_id: pipelineId }),25 });2627 const res = await fetch(`https://api.pipedrive.com/v1/deals?${params}`);28 if (!res.ok) break;2930 const json = await res.json();31 if (!json.success || !json.data) break;3233 allDeals.push(...json.data);3435 const pagination = json.additional_data?.pagination;36 hasMore = pagination?.more_items_in_collection ?? false;37 start = pagination?.next_start ?? 0;38 }3940 return new NextResponse(JSON.stringify(allDeals, null, 2), {41 headers: {42 'Content-Type': 'application/json',43 'Content-Disposition': `attachment; filename=pipedrive-deals-${new Date().toISOString().split('T')[0]}.json`,44 },45 });46}Pro tip: When creating linked records (organization → person → deal), handle the case where the organization or person already exists. Pipedrive does not have native upsert for organizations and persons — you may want to search for an existing organization by name before creating a duplicate.
Expected result: Submitting the lead capture form creates a linked organization, person, and deal in Pipedrive automatically. The export endpoint returns all Pipedrive deals as a downloadable JSON file, paginating through all records regardless of total count.
Common use cases
Custom Kanban Deal Pipeline Dashboard
A custom React interface showing Pipedrive deals organized by pipeline stage as a Kanban board. Sales team members can view their deals, filter by assigned user, and see expected close dates and deal values — all in a custom-branded interface that can be embedded in internal tools or shared with stakeholders who do not have Pipedrive licenses.
Build a Pipedrive deal pipeline dashboard. Create /api/pipedrive/deals that GETs https://api.pipedrive.com/v1/deals?api_token={PIPEDRIVE_API_TOKEN}&status=open&limit=100 and returns deals with id, title, value, currency, stage_id, person_name, org_name, expected_close_date, and owner_name. Create /api/pipedrive/stages that GETs /v1/stages?api_token={token}. In React, display deals as a Kanban board with one column per stage, ordered by pipeline position. Each deal card shows: title, company, value formatted as currency, days until expected close (red if past due). Show total value per stage in each column header. Use Tailwind CSS with a clean card design.
Copy this prompt to try it in Bolt.new
Export Pipedrive Data as JSON
A data export tool that fetches all Pipedrive deals (or filtered subsets) as structured JSON for analysis or import into other systems. Users can filter by date range, pipeline, or assigned user and download the result as a JSON file. This satisfies the 'export Pipedrive to JSON' use case for developers who need to sync data programmatically.
Create a Pipedrive data export tool. Build /api/pipedrive/export/deals that accepts query parameters: pipeline_id (optional), start_date, end_date, and status (open/won/lost/all). Fetch deals from Pipedrive API with pagination (follow the 'additional_data.pagination' cursor until all pages are retrieved). Return the complete array of deals as JSON. Add a React UI with date range pickers, a pipeline filter dropdown, and an 'Export JSON' button that downloads the response as deals.json. Show the count of deals exported. Also add a CSV export option.
Copy this prompt to try it in Bolt.new
Lead Capture Form Creating Pipedrive Deals
A contact or quote request form on a Bolt.new website that automatically creates a Pipedrive person (contact) and deal when submitted. The lead enters their details, the form submits to a Next.js API route, and the route creates both the person and an associated deal in the appropriate pipeline stage for new inbound leads.
Add a contact form that creates Pipedrive leads. Build a form with name, email, phone, company, and message fields. On submit, POST to /api/pipedrive/leads which: (1) Creates a person at /v1/persons with name, email, phone using PIPEDRIVE_API_TOKEN, (2) Creates an organization at /v1/organizations with the company name, (3) Creates a deal at /v1/deals with title '{name} - Inbound Lead', person_id from step 1, org_id from step 2, pipeline_id from PIPEDRIVE_PIPELINE_ID, and a note with the message field content. Return the deal ID on success. Show a thank-you message when the form submits.
Copy this prompt to try it in Bolt.new
Troubleshooting
Pipedrive API returns 401 Unauthorized on all requests
Cause: The PIPEDRIVE_API_TOKEN in .env is incorrect, empty, or has extra whitespace. Pipedrive also returns 401 if you pass the token as a Bearer header but the token is a personal API token (not an OAuth token) — personal tokens must be passed as the api_token query parameter.
Solution: Verify the token in .env matches exactly what is shown in Pipedrive Settings → Personal Preferences → API. Check for extra spaces, quotes, or line breaks. If using the token as a query parameter (the simplest approach), ensure the URL is formed as: https://api.pipedrive.com/v1/deals?api_token=YOUR_TOKEN_HERE with no quotes around the token value.
1// Correct: API token as query parameter2const params = new URLSearchParams({ api_token: process.env.PIPEDRIVE_API_TOKEN! });3const res = await fetch(`https://api.pipedrive.com/v1/deals?${params}`);45// Also correct: API token as Bearer header6const res2 = await fetch('https://api.pipedrive.com/v1/deals', {7 headers: { Authorization: `Bearer ${process.env.PIPEDRIVE_API_TOKEN}` },8});Pipedrive GET /v1/deals returns an empty array even though deals exist in the Pipedrive UI
Cause: The default status filter for the deals endpoint is 'open', which excludes won and lost deals. If you are looking for historical deals or your pipeline shows all deals including closed ones, the filter is excluding them.
Solution: Add status=all_not_deleted to return all non-deleted deals, or use status=won to see closed deals. Also check if the deals are in a different pipeline — if PIPEDRIVE_PIPELINE_ID is set, the filter may be excluding deals in other pipelines.
1// Fetch all deals regardless of status2const params = new URLSearchParams({3 api_token: process.env.PIPEDRIVE_API_TOKEN!,4 status: 'all_not_deleted', // open, won, lost, deleted, or all_not_deleted5 limit: '100',6});Deal creation from the lead form fails with 'person_id is not valid' or 'org_id is not valid'
Cause: The person or organization creation call failed silently, and the code is passing undefined or null as the person_id or org_id when creating the deal. Pipedrive requires valid integer IDs for linked records.
Solution: Add explicit error handling after each creation step. Verify that createPerson() and createOrganization() return objects with an id field before using them in createDeal(). The Pipedrive API returns { success: true, data: { id: 123, ... } } on success — ensure you are extracting data.id, not the top-level response.
1// Always check the created IDs before using them2const org = await createOrganization(company);3if (!org?.id) throw new Error('Failed to create organization in Pipedrive');45const person = await createPerson({ name, email: [email], org_id: org.id });6if (!person?.id) throw new Error('Failed to create person in Pipedrive');78const deal = await createDeal({9 title: `${name} - Inbound Lead`,10 person_id: person.id,11 org_id: org.id,12 pipeline_id: parseInt(process.env.PIPEDRIVE_PIPELINE_ID!),13});Best practices
- Store the Pipedrive API token in server-side .env with no NEXT_PUBLIC_ prefix — it gives full read/write access to your sales pipeline and should never appear in client-side code
- Pass the API token as a query parameter rather than logging it in URLs by using URL construction methods that keep it in the query string rather than concatenating it into log messages
- When creating deals from forms, handle the case where the organization or person already exists to avoid creating duplicate CRM records — search by email or company name before creating
- Fetch pipeline stages once and cache them in React state rather than requesting them on every page load — stage names and IDs change infrequently
- Use Pipedrive's pagination (additional_data.pagination) for data exports rather than increasing the limit — the maximum limit is 500 per request, so large pipelines require multiple requests
- For the Kanban visualization, only fetch deal data the user can act on — fetching all historical won and lost deals alongside open deals adds API load without providing dashboard value
- Test your integration in the Bolt WebContainer preview first — outbound calls to api.pipedrive.com work in the preview, so you can validate deal creation and retrieval before deploying
Alternatives
Choose HubSpot over Pipedrive if you need a full CRM with built-in marketing automation, email campaigns, and a free tier — HubSpot is a broader platform while Pipedrive is focused purely on sales pipeline.
Choose Zoho CRM over Pipedrive if you need broader CRM capabilities at a lower price point, especially if you use other Zoho products — Zoho CRM includes marketing automation features not available in Pipedrive's base plans.
Choose Freshsales over Pipedrive if you want a CRM with built-in phone, email sequencing, and AI-powered lead scoring in a similar deal-pipeline-focused interface.
Choose Salesforce over Pipedrive if your organization needs enterprise-grade CRM with custom objects, complex workflow automation, and deep integrations with other enterprise software — at a significantly higher price and complexity.
Frequently asked questions
Does Pipedrive work with Bolt.new?
Yes. Pipedrive's REST API uses standard HTTPS requests that work in Bolt's WebContainer via a Next.js API route. Unlike OAuth-based CRMs, Pipedrive uses a simple API token with no redirect URI requirement, so you can test the full integration (fetching and creating deals) directly in the Bolt preview without deploying first.
How do I connect Bolt.new to Pipedrive?
Get your API token from Pipedrive Settings → Personal Preferences → API tab. Add it to .env as PIPEDRIVE_API_TOKEN. Create Next.js API routes that call Pipedrive's REST API at api.pipedrive.com/v1 with the token as a query parameter or Bearer header. React components call your API routes — never Pipedrive's API directly — to keep the token server-side.
How do I export Pipedrive deals to JSON using Bolt.new?
Create a Next.js API route that fetches deals from GET /v1/deals with your API token, paginates through all results using the additional_data.pagination cursor, and returns the accumulated array as a JSON response with Content-Disposition: attachment headers to trigger a file download. The route can accept filter parameters (status, pipeline_id, date range) for targeted exports.
Can I use Pipedrive in the Bolt WebContainer preview without deploying?
Yes — unlike OAuth-based integrations, Pipedrive API token authentication works fully in the Bolt preview. You can fetch deals, create contacts and deals from forms, and see real Pipedrive data in your dashboard without needing to deploy. Deploy only when you are ready to share with users or need a stable public URL for webhooks.
How do I find my Pipedrive pipeline ID and stage IDs?
Make a GET request to https://api.pipedrive.com/v1/stages?api_token=YOUR_TOKEN in a browser. The response lists all stages with their IDs, names, and the pipeline_id they belong to. You can also find pipeline IDs by visiting Pipedrive and looking at the URL when viewing a pipeline — the number in the URL is the pipeline ID.
Does Pipedrive have a free tier for testing the API?
Pipedrive offers a 14-day free trial with full API access — no credit card required during the trial. After the trial, paid plans start at $14/user/month. The API token works identically during the trial and on paid plans, so integrations built during the trial work without changes when you upgrade.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation