Migrate from HubSpot to SuiteCRM without losing sales or service history
A renewal, seat growth or a data residency requirement has put HubSpot under review, and the answer is that moving to self-hosted SuiteCRM is a data mapping, rebuild and cutover project with moderate effort and clear risks. The work is not a lift and shift. Contacts, companies, deals and tickets must be mapped to SuiteCRM modules, custom properties must be matched to fields or dropped, and every HubSpot association must be re-created as a relationship that users can actually navigate. Most teams run this with internal CRM administrators who own the business rules, supported by an implementation partner who handles the technical extraction, import scripts and environment setup. The effort depends less on record volume than on how heavily the portal relies on custom properties, custom objects, associations and workflows. A portal with a small set of standard properties and a few pipelines is a far simpler job than one with years of layered automation.
Start with an inventory before choosing a timeline. Export the property definitions and list every workflow, sequence and report that writes to or reads from a CRM field, then decide for each one whether it becomes a SuiteCRM field, a workflow, a dropdown value or nothing at all. Ask your partner to document how the SuiteCRM 8 environment will be set up and how HubSpot data will be moved into it, and confirm that the target version is the current 8.x release line and that its compatibility matrix matches your hosting stack. Plan for a staging instance from day one. SuiteCRM's own migration guidance recommends testing on staging, backing up files and database, and reviewing customizations, because the process may remove non-core files under the public/legacy folder. Log the results of each test import so the production cutover is a repeat of a known process rather than a first attempt.
Plan for the risks that are specific to this move. Service history is the most fragile part: ticket threads, attachments and the link between a ticket and the contact or account it belongs to must survive the export, so verify a sample of tickets end to end before cutover. Login also needs a decision early, because SuiteCRM 8 can authenticate through LDAP with AUTH_TYPE=ldap or SAML with AUTH_TYPE=saml, and the SAML implementation in 8.7.0 and later does not support IdP-initiated logout, so signing out at the identity provider does not end the SuiteCRM session. Keep HubSpot read-only for a defined period after cutover, and confirm with your team how historical email and marketing data will be handled, since those belong to a separate decision. The cutover plan should name an owner for each sign-off, a rollback point and a date after which HubSpot is no longer the system of record.
Which HubSpot capabilities map to SuiteCRM and which need rework
This table compares HubSpot objects, pipelines, associations, Sales Hub sequences and Service Hub help desk features with their closest SuiteCRM 8 modules or functions. Each row is marked clean, needs rework or gap, so you can size the migration before the first export. Confirm every module behavior against the SuiteCRM 8.10 documentation and in a staging instance, because field and workflow details vary with your configuration.
| HubSpot capability | SuiteCRM 8 equivalent | Status |
|---|---|---|
| Contacts and companies | Contacts and Accounts modules with standard fields and relationships | Clean |
| Deals and pipeline stages | Opportunities module with sales stages; confirm stage lists and probability settings | Needs rework |
| Tickets and help desk queues | Cases module for ticket records; queue routing and SLA timers need configuration or add-ons | Needs rework |
| Custom object properties | Custom fields added through Studio or module builder; map each HubSpot property type to a field type | Needs rework |
| Custom objects | Custom modules built with Module Builder; confirm the structure and relationships before loading data | Needs rework |
| Associations between records | Relationships between modules; HubSpot association labels usually need to be recreated as relationship definitions | Needs rework |
| Sales Hub sequences and email cadences | No direct equivalent confirmed for this migration; plan a separate sequencing tool or manual process | Gap |
| Service Hub knowledge base and feedback surveys | Knowledge base and survey features are not covered by core Cases; confirm with SuiteCRM documentation or another tool | Gap |
What data moves out of HubSpot and which integrations must be rebuilt
HubSpot data leaves through a documented export path with hard limits, while integrations, mailboxes and login do not move on their own. Plan the export window first, then rebuild the connections that the new SuiteCRM 8 instance needs to run the business from day one.
Record exports with properties and associations
Users with export permissions can export contacts, companies, deals, tickets and custom objects as CSV, XLSX or XLS files, with property values and associations included. Confirm which of your custom objects and association types appear in each export file, since a flat file does not preserve the relationships in the same form SuiteCRM expects. Build a mapping sheet that ties each HubSpot object to a SuiteCRM module before you start pulling files, so the import order follows the relationships (accounts before contacts, contacts before opportunities and cases).
Export concurrency and rolling limits
HubSpot allows up to 300 exports in a rolling 24-hour window and up to three exports running at once. A large portal with many custom objects can exhaust the daily allowance quickly if each object is exported in separate small batches. Plan the extraction in one scheduled run, keep a log of every file name and export time, and reserve spare exports for re-pulls after a failed import.
Attachments and files outside the export
Record exports carry property values and associations, but attachments on notes, emails and tickets need separate handling. Ask your HubSpot admin which file types and volumes are attached to records, then decide whether they are downloaded through the HubSpot interface or left in place with links. Store the retrieved files on your own object storage or file server, and record the link between each file and its SuiteCRM record so the context survives the move.
Email sync and mailbox connections
HubSpot email logging and inbox connections do not transfer to SuiteCRM. Decide which mailboxes must be linked to SuiteCRM, which historical emails are worth importing, and which stay in the mail system only. Confirm with the mail platform and the SuiteCRM email configuration that inbound and outbound mail reach the new instance, and test with a sample account before cutover.
Third-party integrations and API connections
Every HubSpot connection to forms, calendars, telephony, ERP or data warehouse tools must be inventoried and either rebuilt against SuiteCRM's own interfaces or retired. Start from the HubSpot integrations list and the API token owners, because a token that feeds a tool may be the only record of that dependency. Document each integration with its data direction, owner and test case, and confirm with the vendor of each tool that it supports SuiteCRM before committing.
LDAP or SAML login for SuiteCRM 8
SuiteCRM 8 can authenticate users through LDAP, enabled with AUTH_TYPE=ldap, or through SAML, enabled with AUTH_TYPE=saml. Confirm which directory or identity provider your users already use, then test group mapping and account provisioning before go-live. Note that the SuiteCRM 8.7.0+ SAML implementation does not support IdP-initiated logout, so signing out at the identity provider does not end the SuiteCRM session. Plan a session timeout and user offboarding procedure to cover that gap.
The migration sequence from inventory to decommission
This sequence moves HubSpot contacts, companies, deals and tickets into a SuiteCRM 8 instance you host yourself, proving the mapping on test data before any live user depends on it. Each step ends with a written artifact so the cutover and the HubSpot seat cancellation rest on evidence rather than memory.
Inventory HubSpot objects and properties
List every object in use: contacts, companies, deals, tickets, custom objects, pipelines, owners, teams and associations between them. For each custom property, record its internal name, field type, allowed values, owner and whether reports, workflows or integrations read it. Pull the portal's workflow and sequence list at the same time, since these rules are the logic you will rebuild. The output is a field mapping sheet that pairs each HubSpot property with a planned SuiteCRM module and field, and flags anything with no target yet. Sign-off comes when the business owners of each pipeline have reviewed the sheet.
Build the SuiteCRM 8.10 staging environment
Deploy SuiteCRM 8.10 on a staging host in your own infrastructure, using the PHP, Apache and MariaDB or MySQL versions listed in the SuiteCRM compatibility matrix for that release. Configure the login method you plan to use in production, whether LDAP or SAML, so that access is tested with the same identity flow users will see. Keep staging isolated from production email and any integration endpoints. The output is a documented build record with versions, configuration keys and the backup routine, confirmed by the platform owner.
Run a pilot with a test data set
Export a representative slice of HubSpot records as CSV or XLSX, including contacts with company associations, deals in each pipeline stage and a sample of tickets with their notes. Import the slice into staging through the mapping sheet, then check field types, date formats, currency values, owner assignments and association links against the source. Rebuild one pipeline and one case queue end to end, and have a sales lead and a support lead work through real scenarios. The output is a signed-off pilot report listing every mapping change made during testing and every open defect, with the decision to proceed recorded by the business owners.
Run the parallel period
Migrate the full data set into a production SuiteCRM instance while HubSpot remains the system of record for daily work. Repeat the export and import in a controlled order so that record counts, association counts and pipeline totals can be compared between the two systems. Keep a log of any records created or changed in HubSpot during this window, because they will need a delta load. The output is a reconciliation report that compares counts and sampled field values per object, with each difference explained or fixed. Confirm the report with the data owner before moving to cutover.
Cut over users and final data
Freeze edits in HubSpot for a short, announced window, run the final export, load the delta, and rerun the reconciliation for the records that changed. Switch users to SuiteCRM login, confirm that each role sees only the records its permissions allow, and point any remaining integrations at the new endpoints. Confirm that attachments and notes were carried over, since attachments and files in HubSpot may need a separate export. The output is a cutover record showing the freeze time, the final reconciliation result and the list of users who completed a first login.
Archive HubSpot exports before decommissioning
Before cancelling any seats, produce a complete archive of HubSpot data in the formats the export tools provide, covering all objects, properties and associations you need to retain for records, disputes or audits. Store the archive in your own controlled storage with access logs and a documented retention period set by your compliance owner. Check export limits and link expiry in advance so the archive is not rushed. The output is an archive inventory listing each export file, its date, its checksum and its custodian.
Decommission HubSpot seats and confirm closure
Remove users from HubSpot in stages, starting with integrations and service accounts, then human seats, and confirm that no workflow, form or sync still writes to the portal. Review the contract terms with your commercial team to understand notice requirements and what happens to data after cancellation. Revoke API keys and private apps once nothing depends on them. The output is a closure checklist signed by the CRM owner and finance, recording the date of the last active seat, the revoked credentials and the location of the archive.
How SuiteCRM 8 is set up and why a fresh environment matters
SuiteCRM 8 is installed as a new environment, not upgraded in place from SuiteCRM 7. The 8.x line pairs an Angular frontend with a Symfony backend, so the application, its configuration and its customizations are not a drop-in replacement for the 7.x codebase. Before the HubSpot data arrives, the platform team should provision a clean host or container set, confirm the PHP runtime (SuiteCRM 8.10 supports PHP 8.2, 8.3 and 8.4) and choose a database from the supported MariaDB or MySQL versions listed in the SuiteCRM 8 compatibility matrix. Check the matrix again on the day you build, because version support changes between releases. Plan a staging instance first so that the configuration and the data import can be rehearsed before cutover.
Login is the decision that most affects day-two operations. SuiteCRM 8 can authenticate users against LDAP, enabled with AUTH_TYPE=ldap, or against SAML, enabled with AUTH_TYPE=saml. Confirm with your identity team which option matches your directory and whether role mapping can be handled at login. Note also that the SAML implementation in 8.7.0 and later does not support IdP-initiated logout or POST binding to the logout service. Signing out at your identity provider therefore does not end the SuiteCRM session, so you should document that behavior for users and decide whether session lifetimes or a separate logout step will compensate for it. Verify both settings in the SuiteCRM 8.7.0+ SAML configuration reference before you sign off the staging build.
What drives migration cost and duration
This table lists the main drivers of effort in a HubSpot to SuiteCRM move and how each one can be kept down. No price or duration is given because both depend on the written scope, which DeployOpen agrees with you before work starts. Use the table to see which items your own portal makes large.
| Driver | Why it moves cost or effort | How to keep it down |
|---|---|---|
| Record volume | Every contact, company, deal and ticket must be exported, cleaned, deduplicated and loaded, and HubSpot caps exports at 300 in a rolling 24-hour window with three running at once, so large portals need a longer extraction plan. | Archive inactive records, remove duplicates in HubSpot before export, and agree which history is migrated and which stays in an archive file. |
| Custom properties and object mapping | Each custom property must be mapped to a SuiteCRM field or module, and HubSpot custom objects may need new modules or relationship definitions, which adds design and testing time. | Audit the property list early, retire unused fields, and reuse standard SuiteCRM modules where they fit before building custom ones. |
| Associations between records | Contacts, companies, deals and tickets are linked in HubSpot, and those links must be rebuilt as SuiteCRM relationships, so a dense association graph is harder to verify. | Export associations with the records they belong to, define the relationship rules in writing, and sample-check linked records on staging. |
| HubSpot workflows to rebuild | Each workflow that assigns owners, sends notifications, updates properties or moves deals must be re-created as a SuiteCRM workflow or custom logic, and each one needs testing. | List every active workflow, mark which ones are still used, and rebuild only the live ones in priority order. |
| Service desk and SLA design | Ticket pipelines, priorities, queues and SLA targets from HubSpot Service Hub must be defined as SuiteCRM case management settings, and the SLA rules need sign-off from the support team. | Document current ticket stages and SLA targets before design starts, and limit the first release to the queues that carry most volume. |
| Integrations | Each connected tool, such as email, telephony, the website forms or a data warehouse, needs its own connector, credentials and test cycle, and integrations often break when the CRM changes. | Inventory every integration with its owner, drop those no longer used, and confirm which ones have a supported path into SuiteCRM 8. |
| Identity and login set-up | Single sign-on through LDAP or SAML requires configuration with your identity provider, group mapping and testing, and SAML logout behavior in SuiteCRM 8.7.0+ does not end the CRM session when the user signs out at the identity provider. | Confirm the identity source and group model early, and agree the logout behavior with your security team before go-live. |
| Staff training and change management | Sales, service and admin staff must learn new screens, list views and reports, and a poor handover adds support load in the first weeks after cut-over. | Train on a staging copy with real workflows, keep a short reference guide per role, and plan a parallel run period. |
| Validation and cut-over testing | Record counts, field values, attachments and associations must be checked against HubSpot exports before the old system is switched off, and SuiteCRM migration guidance advises testing on a staging instance first. | Write acceptance checks per object, keep HubSpot exports as the reference, and agree a rollback plan in the scope. |
What usually goes wrong when moving from HubSpot to SuiteCRM
Most HubSpot-to-SuiteCRM problems come from data that does not survive the trip intact: associations, tickets, properties and logic that nobody wrote down. The cards below cover the failure points we see most often, with a prevention step for each that fits into a staged migration plan.
Broken associations after CSV import
HubSpot exports contacts, companies, deals and tickets as separate files, and the links between them live in association columns. A flat CSV import into SuiteCRM can create the records but attach them to the wrong account, or to none at all. Before loading anything, build a key map that carries HubSpot record IDs into a legacy ID field, then check parent links on a sample of accounts and deals in staging. Reconcile counts per relationship, not just per object.
Lost ticket history and attachments
Ticket threads, internal notes and attachments are often the first things teams assume will move and the last things they verify. A CSV export of ticket records typically carries summary fields, not the full conversation or the files attached to it. Decide early which closed tickets must be kept, export their conversation and attachments as a separate set, and load them into a read-only archive or linked notes in SuiteCRM. Sample a closed ticket end to end before cutover.
Unmapped custom properties
Custom HubSpot properties, including dropdown values, date fields and calculated scores, rarely have a one-to-one field in SuiteCRM. Properties that are silently dropped or imported as plain text break reports, list views and any logic that depended on them. Build a mapping sheet listing every property, its type, its allowed values and its target module and field, and mark each one as mapped, merged, archived or retired. Sign-off on that sheet should come from the people who run reports today.
Undocumented workflow logic
HubSpot workflows often hold business rules that no one has written down: lead assignment by region, deal stage notifications, SLA timers on tickets or reminders tied to a property change. These rules do not travel with the data, so they stop working on day one without anyone noticing. Export the workflow list, record each trigger, condition and action, and rebuild them in SuiteCRM workflows or scheduled jobs. Test each rule with a dummy record in staging before turning it on.
Duplicate contacts from multiple sources
Contacts in a long-lived HubSpot portal are often duplicated across forms, imports and integrations, and an import into SuiteCRM can multiply those duplicates when matching is weak. Match on email and company domain, then merge or flag the rest before load. Agree a rule for which record wins on conflicting fields, and keep the original HubSpot ID so merges can be audited later. A reconciliation step should compare record counts before and after the merge.
Customizations under public/legacy
SuiteCRM's migration documentation warns that the migration may remove non-core files under the public/legacy folder. Any custom code, theme changes or extension files placed there can disappear without a visible error. Inventory every file you changed on the current SuiteCRM 7 instance, move custom code into a supported extension location, and keep full file and database backups before any run. Confirm the list against the migration guide on a staging copy, not production.
How the move differs by team size and HubSpot footprint
Teams that use HubSpot mainly for contacts, companies, deals and pipelines have the most direct path. SuiteCRM's sales modules cover accounts, contacts, leads, opportunities and pipeline stages, so most of the work is mapping properties and rebuilding stage logic rather than changing how the team works. Sales-only teams should still decide early whether sequences, quotes and meeting links are needed, because those features sit in different parts of the SuiteCRM stack or in separate open-source tools.
- Object mapping: Map HubSpot deals, contacts and companies to SuiteCRM opportunities, contacts and accounts, and confirm how associations are carried over.
- Pipeline stages: Recreate each deal stage and its probability values in SuiteCRM before importing historical deals.
- Email and calendar: Confirm which mailbox and calendar integrations the sales team relies on, since these are configured separately from the CRM data.
- Marketing forms: Forms that create leads in HubSpot need a new destination, such as a self-hosted form tool or a marketing platform connected through the API.
- Sales-only features: Quotes, sequences and forecasting need a checklist, because each one either maps to a SuiteCRM feature or needs another tool.
Before committing, confirm with your team which Sales Hub features are used every day and which are rarely used, and test those flows on a staging instance.
Teams that run tickets and customer support from HubSpot Service Hub need the move to cover two workflows at once. SuiteCRM includes case management, which is the natural target for HubSpot tickets, but support teams will also rely on queues, SLAs, customer-facing channels and knowledge content that may or may not follow the same model. Confirm what SuiteCRM covers for your support process and where a dedicated help desk tool may be a better fit, then decide how the ticket history links back to the CRM accounts.
- Tickets to cases: Map HubSpot ticket properties, pipelines and owners to SuiteCRM cases, and check how ticket associations to contacts and companies are preserved.
- Queues and SLAs: Document the routing and response rules your team uses now and rebuild them as SuiteCRM workflows or as settings in a separate tool.
- Customer channels: Email, chat and portal channels need a plan, because they are not all covered by the CRM itself.
- Knowledge and feedback: Knowledge articles and satisfaction surveys in HubSpot need separate destinations.
- Shared views: Support and sales staff often share account views, so define which SuiteCRM modules and roles each group needs.
Before cutover, ask the support lead to walk through three real ticket types from start to close, and confirm each step has a SuiteCRM equivalent or a named replacement.
Teams with large HubSpot portals or heavy marketing email face the largest planning burden. Export limits, the volume of custom properties and the amount of marketing data shape the schedule more than the CRM itself. Marketing email, forms, lead scoring and consent records are often the hardest part to move, and SuiteCRM covers marketing needs differently from HubSpot, so these functions usually move to a dedicated marketing platform such as Mautic rather than into the CRM. Plan the split before the export begins.
- Export planning: Check HubSpot's export limits and count the records and associations you need, so the extraction can be scheduled across several runs.
- Custom properties: Audit custom properties and remove unused ones before mapping, since each one needs a SuiteCRM field or a documented decision to drop it.
- Marketing email: Decide whether campaigns, templates and sending move to a separate marketing platform, and how consent and unsubscribe status are carried over.
- Lead scoring: Scoring rules rarely transfer directly, so document them and rebuild them in the target system or drop them with stakeholder agreement.
- Sending and deliverability: Confirm which sending service and sending domain will be used, and who is responsible for deliverability settings.
Ask the marketing lead to confirm which lists, consent records and campaign histories must be kept, because these determine what must be migrated first.
Questions buyers ask before moving from HubSpot to SuiteCRM
How much effort and cost does a HubSpot to SuiteCRM migration involve?
The cost is driven mostly by the work, not the software, because SuiteCRM 8 is free to download and self-host under AGPLv3. The main cost components are infrastructure to host SuiteCRM, the implementation work to map objects, properties and associations, data extraction and cleansing, workflow rebuilds, login setup, testing and staff training. Infrastructure and support are recurring, while mapping, migration and rebuild work is largely one-time. Costs rise with the number of custom properties, custom objects, active workflows and integrations you need to replace. Ask any quote to itemize these components, state who performs each one, and say whether SuiteCRM support from SuiteCRM Ltd, such as SuiteASSURED, is included or optional.
How long does the migration take, and what sets the timeline?
No duration is fixed in advance, so treat any timeline as something to agree in writing against your own scope. The biggest factors are the size of your HubSpot portal, how many custom objects and properties must be mapped, how many workflows and integrations need rebuilding, and whether you run a staging instance for testing before cutover. Export limits also shape the schedule, since HubSpot allows up to 300 exports in a rolling 24-hour window. Your team's availability for sign-off and your decision on how much history to carry over matter as well. Ask the quote to show the phases, the testing window and the cutover plan.
What does our internal team need to provide during the migration?
Your team needs to own the business decisions, even if an outside partner does the technical work. Typically this means a named owner who can approve the data model, a list of which HubSpot properties and pipelines matter, and people who can validate migrated records against what sales and service staff actually use. You will also need administrators who can provision the hosting environment, set up email and DNS, and decide on the login method, such as LDAP or SAML. Plan time for reviewing customizations, since the SuiteCRM migration documentation advises checking them before moving. Confirm the staffing expected from your side in any written scope.
Can we run the HubSpot to SuiteCRM migration without an outside partner?
Yes, a capable internal team can do it, provided it has the skills and time. The SuiteCRM migration documentation covers the process, and the work requires testing on a staging instance, backing up files and the database, reviewing customizations, and configuring login and integrations. The questions to weigh are whether your team has experience with PHP, MariaDB or MySQL, Linux hosting, data mapping and access control, and whether it can maintain the system after go-live. An implementation partner can take on the scoped work in writing, which lets your staff keep working on the business. Either way, decide ownership of the work before you start.
How do we handle HubSpot export limits during a full extraction?
Plan the extraction around HubSpot's limits rather than assuming one pass will work. HubSpot lets users with export permissions export contacts, companies, deals, tickets and custom objects with property values and associations as CSV, XLSX or XLS files. Exports are capped at 300 in a rolling 24-hour window and three running at once, so large portals need a schedule across several days. Export in logical batches, keep a log of each file, and check that associations survive the export. Run a test export first, reconcile record counts against HubSpot, and keep a final export close to cutover to capture recent changes. Confirm the export approach and the reconciliation method in the quote.
Do we need a SuiteCRM support contract after go-live?
A support contract is optional, because SuiteCRM is free to self-host. SuiteCRM Ltd sells paid services around the software, including the SuiteASSURED support package, SuiteCRM Hosted, implementation, training and migration services. Without a contract, you must provide your own patching, backups and expertise. Patch releases contain only security and bug fixes, and minor 8.x releases arrive roughly every eight weeks, so someone must apply them. If you are on SuiteCRM 7, note that its 7.15 extended support release receives security fixes until January 2028, while no SuiteCRM 8 extended support release had been nominated yet. Ask any support proposal which versions and response terms it covers.
Which SuiteCRM version and login method should we plan for?
Plan for SuiteCRM 8, since SuiteCRM 8.10.2 is the latest stable version in the SuiteCRM-Core repository. SuiteCRM 8.10 supports PHP 8.2, 8.3 and 8.4, Apache 2.4, MariaDB 10.6, 10.11, 11.4 and 11.8, and MySQL 8.0 and 8.4 on Linux, Unix or macOS, so confirm your server stack against that matrix. For login, SuiteCRM 8 can use LDAP through AUTH_TYPE=ldap or SAML through AUTH_TYPE=saml. Note that the SuiteCRM 8.7.0+ SAML implementation does not support IdP-initiated logout, so ending a session at the identity provider does not end the SuiteCRM session. Ask your engineers to test this behavior against your identity provider before go-live.
How DeployOpen scopes and runs a HubSpot to SuiteCRM migration
DeployOpen plans and implements SuiteCRM inside your own cloud account, data center or air-gapped network, and treats the HubSpot move as a scoped migration with named data sets, tested imports and written handover. Engagements are fixed-scope, so the mapping, build, testing and documentation work is agreed in writing before any data moves.
How we scope
- Inventory HubSpot objects, custom properties, associations, pipelines and workflows to decide what maps to SuiteCRM modules
- Agree in writing which record types, attachments, email history and integrations are in and out of the migration
- Confirm the hosting target, PHP and MariaDB or MySQL versions, and the login method, such as LDAP or SAML
How we build
- Stand up a SuiteCRM 8 environment and build modules, fields, case management and workflows to match the agreed mapping
- Run test imports from HubSpot CSV or XLSX exports on a staging instance before any production load
- Review customizations and file changes against the SuiteCRM migration guidance, and back up files and database before each run
How we hand over
- Deliver a field-level mapping document, import runbook and reconciliation report comparing record counts and associations
- Document admin procedures for users, roles, workflows, backups and SuiteCRM patch and minor release updates
- Walk your administrators through the configured system and record open items, owners and decisions
How we support
- Provide hypercare after cutover as part of the agreed scope, with the length confirmed in the written proposal
- Offer ongoing support, upgrades and continuous testing as a retainer after handover
- Ask for a quote built from the written scope, since DeployOpen does not publish a price list

