All articles

Pipedrive to Attio for a milestone-billed consulting firm: how we migrated Keenan Reid Strategies

·11 min read

Most CRM migrations die at the same place. The new tool is faster, cleaner, better priced. The team logs in on Monday, opens a record, and the notes are gone. The stage history is gone. The dashboard the leadership team has been reading for two years is gone. The migration is technically a success and the team goes back to the old tool inside a week.

This is the story of a migration that did not do that.

Keenan Reid Strategies is a milestone-billed consulting firm running two sales pipelines (CashConvert+ and Commercial). Sarah Olson and her team had outgrown Pipedrive, but the team also could not afford to lose the reporting cadence the business ran on. The migration had one rule: nothing gets lost.

Here is how it went.

The constraints, not the goals

Most case studies open with goals. The interesting part of this migration was the constraints.

The team had two of them.

Notes had to come across. Pipedrive had years of meeting notes, call summaries, and follow-up context attached to records. Every one of them had to land on the right Company, Person, or Deal in Attio. If a partner opened a record in Attio on day one and saw an empty notes tab, the migration was a failure.

Stage history had to come across. The leadership team ran their monthly business review off Pipedrive reports that depended on stage transition timestamps. Time in Stage. Pipeline Movement. Lost Deal Time to Close. These reports cannot be rebuilt against a flat snapshot of the current state. They need to know when each deal entered each stage.

Most CRM-to-CRM migrations skip both of these. Records come over, but notes get exported as a flat CSV that nobody can attach back to the right record, and stage history collapses to "current stage as of migration date."

The model had to support a clean carry-over of both before we touched any data.

Several calls before anything moved

We ran four calls with Sarah before we exported a single record from Pipedrive.

This is the part of a migration that buys back the rest of the timeline. If the mapping is right, the rest of the work is mechanical. If the mapping is wrong, the team finds out three weeks later when a report does not match what Pipedrive said last month, and the only fix is to redo the migration.

The calls covered:

  1. Which Pipedrive fields map to which Attio attributes, exactly.
  2. Which fields get merged (Pipedrive's split between Stage and Status, which Attio does not separate by default).
  3. Which fields get dropped (Pipedrive concepts like "archived" that have no Attio equivalent).
  4. Which custom objects we needed to add to Attio before the migration, so that records had a place to land.

Sarah finished the last call knowing exactly what was going to happen. Nothing about the migration was a surprise.

The six-object data model

Pipedrive runs on three objects: Persons, Organizations, Deals. That model was the reason the team had outgrown the tool. Staffing assignments were buried in deal notes. Inbound leads and live sales opportunities shared the same view. Revenue milestones lived in a spreadsheet next to the CRM.

We rebuilt the model with six objects in Attio. Four of them were custom.

Companies and People stayed as the standard Attio objects. Clients, prospects, and partners on Companies. Contacts and candidates on People.

Deals became a custom object covering both pipelines. The shared stage taxonomy runs eight stages: Qualified, Contact made, Discussion scheduled, Proposal and development, Negotiations underway, Contract agreed, Active, and Renewal Ready, plus the two terminal stages (Closed Won, Closed lost). Every Deal carries pipeline as a select attribute, so reports either segment across both pipelines or filter to one.

Staffing Assignments became its own custom object. This was the unlock. In Pipedrive, a placement was a note inside the deal that won it. In Attio, the placement is a record, linked to the Deal, with its own fields for consultant, start date, end date, and split percentage. Operational placement work stopped living inside the sales record.

Leads got its own object too. Inbound conversations that have not yet been qualified into Deals land in Leads first. This is the single biggest thing teams get wrong in early Attio workspaces, and it is the reason most "deals created last 30 days" reports lie. A lead that turns into nothing should never have been a Deal.

Milestones was the custom object the business actually needed and Pipedrive could not give them.

Why milestones became their own object

KRS bills consulting work milestone by milestone, not as a flat split of the contract. A six-month, hundred-thousand-dollar engagement does not mean about $16,700 per month. It might mean thirty thousand in month one, fourteen thousand each remaining month, with a final invoice on completion. The shape of the cash flow is the shape of the contract.

A standard Deal carries one number: total contract value. A monthly forecast cannot be built from one number. The team had been exporting Deals to a spreadsheet, expanding each contract into its own row per month, and weighting by probability by hand. Every month.

We added a Milestone object on Deals. One record per month. Each milestone carries a date, an amount, and a reference back to the parent Deal. The team enters the actual monthly amounts as the contract is signed. The forecast reports aggregate milestones by month, not Deals.

This is the move that took the monthly business review off a spreadsheet and put it back inside the CRM.

Two pipelines, one stage model

CashConvert+ and Commercial run as two separate pipelines, but they share the same eight-stage taxonomy. This is the pattern we recommend for almost every team running multiple sales motions inside one company.

The alternative is to give each pipeline its own stage names. We have seen that pattern in many Attio workspaces. It always produces the same problem: leadership reports either ignore one pipeline or require a translation layer between stage names. Neither is acceptable.

A shared stage model lets reports compare cleanly. Average Time in Stage across both pipelines. Lost reasons across both pipelines. Pipeline movement across both pipelines. The team sees the business as one business, with two motions running through it.

The pipeline attribute lives on the Deal as a select. Stage lives as a status. The team filters per pipeline when they want to, and pulls cross-pipeline reports when they want that.

The migration itself

Once the model was in place and Sarah had signed off, the migration was a single cutover.

Notes came across in full. Every Pipedrive note landed on the matching record in Attio, attached to the right Company, Person, or Deal. The team opened Attio on day one and saw the same context they had been reading in Pipedrive.

Deal history came across. Stage transitions and their timestamps came over so the Time in Stage and Pipeline Movement reports had real history to work with. Most of the Won-equivalent deals migrated as already-closed, which means their stage history inside Attio is short. New deals progressing through stages inside Attio will populate the per-stage time history over the next two to three months. We told Sarah this in advance and the team is fine with it. The reports are not lying. They are warming up.

Twelve reports rebuilt

The reporting parity was the deliverable. Twelve dashboard widgets covering every Pipedrive report the team used to run the business.

The headline forecasting reports came over first:

  • 2026 Weighted Pipeline value. Single-metric sum across Milestones, weighted by stage probability. This is the number the team forecasts against.
  • Pipeline Weighted Revenue Forecast 2026. Time-series of weighted revenue from Milestones, by month, scoped to the 2026 forecast year.
  • Booked Revenue Forecast 2026. Time-series of booked revenue from Milestones. Separated from the weighted view so the team can see committed vs forecast at a glance.
  • Deals won Revenue. Single-metric sum of estimated deal value across won Deals. Headline revenue card.

The pipeline-health reports came next:

  • Pipeline Movement. Stacked bar of Deals by stage, by date changed. Week-over-week pipeline shift.
  • Deals time in stage. Average time per stage across all Deals.
  • Won Deal time to close by Stage. Average time per stage for Deals that closed won. Healthy velocity benchmark.
  • Lost Deal Time to Close by Stage. Same view, for Deals that closed lost. Highlights where time is being spent on deals that do not convert.

And the top-of-funnel reports:

  • Deals Created Last 30 Days by Pipeline. Count of new Deals, split CashConvert+ and Commercial.
  • Deals created by Month. Monthly count, used for tracking top-of-funnel volume over time.
  • Lost Reason Trailing 180 Days. Stacked count of closed-lost Deals by reason. Drives the conversation about pricing and qualification.
  • Leads Created Trailing 90 Days. Single-metric count from the Leads object. Top of the funnel, separate from the Deals number.

All twelve reports run from the data model the team already had inside Pipedrive. Same questions, same numbers, same shape, sitting on the new stack.

What we were honest about

One Pipedrive report did not survive the migration cleanly.

Pipedrive has a Conversion Rate scorecard: one tile, one percentage, "Won as a percent of Won plus Lost over the trailing ninety days." Attio's reports builder does not support this directly. The funnel report only does stage-to-stage conversion. The regular reports builder does not have a "percent of total" display.

We told Sarah this on the call before we started. The workaround on the dashboard is two scorecards side by side, one counting Won deals in the trailing ninety days and one counting Won plus Lost in the same window. The reader divides the first by the second. It is one extra step. It is not the same as Pipedrive's single tile.

We flagged it. The team accepted it. The migration moved on.

This is the kind of thing that needs to come up before the migration, not after. If we had not mentioned it, the team would have noticed on day one that the conversion rate tile was missing, and the migration would have lost trust at the wrong moment.

The result

Pipedrive shut down with no loss of notes, deal history, or contacts.

Six objects in Attio (Companies, People, Deals, Staffing Assignments, Leads, Milestones) cover the full lifecycle from lead to active placement.

Two pipelines run on a shared stage model, so reports compare cleanly across both motions without translation.

Twelve reports rebuilt in Attio dashboards, covering revenue, forecast, pipeline movement, time in stage, lost reasons, and lead volume. The monthly business review runs off the new dashboard.

Sarah and the team opened Attio on day one and recognised every record and every report.

> "George helped us migrate from Pipedrive to Attio and it was quick and seamless. He was super responsive and had several calls with me before we started to make sure I understood everything."

> — Sarah Olson, Keenan Reid Strategies

What this story is about, beyond KRS

Three patterns from this migration come up on almost every consulting and services business we move onto Attio.

Milestones belong on their own object when billing is uneven. The default Deal object carries one contract value. Any business that bills in uneven chunks per month needs a child object to model the cash flow. Without it, monthly forecasting lives in a spreadsheet next to the CRM, and the CRM stops being where the business gets run.

Staffing or placement work belongs on its own object when it survives the deal. The deal closes, the work begins, and the operational record of the placement deserves its own home. Burying it inside the deal that won it makes both the sales report and the delivery report worse.

Two motions sharing one stage model beats two motions with their own stage names. Always. Every cross-pipeline report repays the small upfront cost of a shared taxonomy. We have not seen a counterexample.

If you are running a consulting or services firm on Pipedrive and the monthly forecast already lives in a spreadsheet, the move to Attio is not just a tool swap. It is a chance to put the forecast back where the rest of the business lives.

The full structured case study for KRS lives at craftt.io/case-studies/keenan-reid-strategies. The generic Pipedrive-to-Attio playbook lives at Pipedrive to Attio: a step-by-step migration guide. If you want to talk through your own setup, book a call.

Need help with your Attio setup?

We migrate teams, build data models, wire automations, and train Claude agents inside your workspace. Discovery call is free.

Book a free discovery call