Integration Guide
Connect your CRM and revenue stack so customer data, quotes, contracts, and billing metrics stay in sync without either system overwriting the other.
How Integration Works
<p>Attio handles your CRM workflow: companies, people, deals, pipeline. MonetizeNow handles quoting, contracts, and revenue. Records link across both systems through ID-to-ID pairings, so each side always knows which record it's talking to.</p>Sync runs in one direction per data type. Customer data flows from Attio into MonetizeNow. Quote and Contract data flows from MonetizeNow back into Attio. Each system owns its data, and neither overwrites another.
CRM and billing need to stay separate in your revenue stack. When one overwrites another, you get duplicate records, phantom pipeline, and unreliable ARR. Clear ownership boundaries keep both systems trustworthy.
<div class="layers">
<div class="layer-card attio">
<h4>Attio Owns</h4>
<ul>
<li>Company and People profiles</li>
<li>Deal pipeline and stages</li>
<li>Rep workspace and CRM workflow</li>
<li>Customer data edits</li>
</ul>
</div>
<div class="layer-card mn">
<h4>MonetizeNow Owns</h4>
<ul>
<li>Quote generation and lifecycle</li>
<li>Contract creation and status</li>
<li>Revenue metrics (ARR, MRR)</li>
<li>Invoicing, billing, payments</li>
</ul>
</div>
</div>
<h2>Object Mapping</h2>
<p>Every Attio record maps to a MonetizeNow record through a stored ID pair. Once linked, all sync decisions reference that pairing.</p>
<div class="map-grid">
<div class="map-left"><div class="map-sys">Attio</div><div class="map-obj">Company</div></div>
<div class="map-arrow">→</div>
<div class="map-right"><div class="map-sys">MonetizeNow</div><div class="map-obj">Account</div></div>
<div class="map-left"><div class="map-sys">Attio</div><div class="map-obj">Person</div></div>
<div class="map-arrow">→</div>
<div class="map-right"><div class="map-sys">MonetizeNow</div><div class="map-obj">Contact</div></div>
<div class="map-left"><div class="map-sys">Attio</div><div class="map-obj">Deal</div></div>
<div class="map-arrow">→</div>
<div class="map-right"><div class="map-sys">MonetizeNow</div><div class="map-obj">Opportunity</div></div>
<div class="map-left"><div class="map-sys">MonetizeNow</div><div class="map-obj">Primary Quote + Contract</div></div>
<div class="map-arrow">→</div>
<div class="map-right"><div class="map-sys">Attio</div><div class="map-obj">Deal (custom attributes)</div></div>
</div>
<h2>Sync Direction</h2>
<div class="dir-banner">
<span class="dir-label dir-in">Inbound</span>
<span class="dir-text">Attio Company and People edits sync into MonetizeNow Account and Contact records.</span>
</div>
<div class="dir-banner">
<span class="dir-label dir-out">Outbound</span>
<span class="dir-text">MonetizeNow Primary Quote and Contract data syncs into Attio Deal custom attributes.</span>
</div>
<h2>Six Things Worth Knowing</h2>
<div class="num-grid">
<div class="num-card">
<div class="num">01 /</div>
<div class="num-title">Only Primary Quote syncs</div>
<div class="num-body">An Opportunity can have multiple Quotes, but only <strong>Primary Quote</strong> writes data to Attio Deal. Drafts, alternatives, and older versions get skipped.</div>
</div>
<div class="num-card">
<div class="num">02 /</div>
<div class="num-title">Amendments and Renewals create separate Deals</div>
<div class="num-body">Each amendment or renewal creates a new Attio Deal named "Amendment - [description]" or "Renewal - [description]", preserving original Deal history.</div>
</div>
<div class="num-card">
<div class="num">03 /</div>
<div class="num-title">Deletions deactivate</div>
<div class="num-body">Deleting an Attio Company or Person deactivates corresponding Account or Contact and unlinks association. Billing records stay intact for audit and contract integrity.</div>
</div>
<div class="num-card">
<div class="num">04 /</div>
<div class="num-title">One Workspace per Tenant</div>
<div class="num-body">Only one Attio Workspace connects per Tenant, preventing cross-tenant data contamination and duplicate sync flows.</div>
</div>
<div class="num-card">
<div class="num">05 /</div>
<div class="num-title">Association-driven identity</div>
<div class="num-body">Every sync starts with an association check. If one exists, data flows. If not, a new association is created or that record is skipped.</div>
</div>
<div class="num-card">
<div class="num">06 /</div>
<div class="num-title">Selective updates</div>
<div class="num-body">When Attio pushes an update, only mapped fields change. Billing-specific values like status, custom fields, and configuration stay untouched.</div>
</div>
</div>Prerequisites
You need admin access to both your Attio Workspace and MonetizeNow Tenant. You also need to create a dedicated integration user in MonetizeNow before connecting.
Connection Steps
Custom Attributes Created Automatically
On Attio Company
| Attribute | Purpose |
|---|---|
MonetizeNow Account ID | Links Company to MonetizeNow Account |
On Attio Deal
| Attribute | Purpose |
|---|---|
MN Opportunity ID | Links Deal to MonetizeNow Opportunity |
MN Primary Quote ID | Currently active Primary Quote |
MN Quote Type | New, Amendment, or Renewal |
MN Quote Status | Current Quote lifecycle status |
MN Quote ARR | Annual Recurring Revenue from Quote |
MN Quote MRR | Monthly Recurring Revenue from Quote |
MN Quote Incremental ARR | ARR change (Amendment/Renewal) |
MN Quote Incremental MRR | MRR change (Amendment/Renewal) |
MN Quote Discount Amount | Applied discount value |
MN Quote Amount Without Discount | Pre-discount total |
MN Contract ID | Contract identifier once processed |
MN Contract Status | Contract lifecycle status |
MN Contract Start Date | Contract term start |
MN Contract End Date | Contract term end |
MN Contract End Action | What happens at expiry |
MN Previous Contract ID | For Renewal context |
Deal Stage Mapping
Map MonetizeNow Quote statuses to Attio Deal stages so that when a Quote transitions (Draft → Pending → Accepted), Attio Deal stage updates automatically.
Navigate to Settings → CRM → Attio in MonetizeNow to configure mapping. Each Quote status maps to one Deal stage. Multiple statuses can map to one stage. If no mapping exists for a status, Deal stage stays unchanged.
Init Deal: Create a Quote from Attio
Init Deal validates Deal context, resolves or creates all necessary commercial records (Account, Contacts, Opportunity), and hands you a pre-filled Draft Quote. One click from Attio, full commercial context ready in MonetizeNow.
Every step checks for existing associations first. If an Account already exists for that Attio Company, it reuses it. If not, it creates one. Same for Contacts and Opportunity. Safe to run multiple times without creating duplicates.
Orchestration Flow
Steps for Reps
List Quotes from a Deal
From app panel on any Attio Deal, click "List Quotes" to see all Quotes associated with that Opportunity. Each entry shows status, type, and a direct link.
View Contract from a Deal
Once a Quote is processed and a Contract exists, click "View Contract" from Deal panel. Opens Contract record showing status, term dates, and subscription details.
List Contracts from a Company
From any Attio Company, app panel shows all Contracts associated with that Account. Gives account managers a complete view of active, expired, and pending Contracts without switching platforms.
Amendment and Renewal Behavior
When an Amendment or Renewal Quote becomes Primary and is processed, a new Attio Deal is created, preserving original Deal history intact.
Deal name follows pattern: "Amendment - \[description]" or "Renewal - \[description]", linked to same Opportunity.
Attio → MonetizeNow
Attio is source of truth for customer and contact data. Changes propagate to MonetizeNow through validated webhooks. Updates are selective: they modify specific fields without overwriting MonetizeNow-specific values.
Company → Account
| Attio Field | MonetizeNow Account Field | Behavior |
|---|---|---|
| Name | Account Name | Updated on change |
| Primary Location | Billing Address + Shipping Address | Updated on change |
| Deal Currency | Default Currency | Set during Init Deal |
Person → Contact
| Attio Field | MonetizeNow Contact Field | Behavior |
|---|---|---|
| Name | Full Name | Updated on change |
| Email Address | Prefers existing match | |
| Phone Number | Phone | Prefers existing match |
| Primary Location | Address | Updated on change |
| Job Title | Title | Updated on change |
Delete Behavior
When Attio Company or Person is deleted, corresponding record is deactivated and association marked as disassociated. Records are never hard-deleted from billing.
MonetizeNow → Attio
Quote and Contract data flows into Attio Deal attributes. CRM users see commercial progress without switching platforms.
Quote Sync Eligibility
A Quote syncs to an Attio Deal only if all three conditions are met:
2. Quote must be Primary Quote on that Opportunity.
3. Quote must not be a migrated Quote.
If any condition fails, Quote is silently skipped. No error, no partial sync.
Quote → Deal Field Mapping
| MonetizeNow Record | Field | Attio Deal Attribute |
|---|---|---|
| Quote | ID | MN Primary Quote ID |
| Quote | Description | Deal Name |
| Quote | Type | MN Quote Type |
| Quote | Status | MN Quote Status |
| Quote | Status | Deal Stage (if mapped) |
| Quote | ARR | MN Quote ARR |
| Quote | MRR | MN Quote MRR |
| Quote | Incremental ARR | MN Quote Incremental ARR |
| Quote | Incremental MRR | MN Quote Incremental MRR |
| Quote | Amount | Value |
| Quote | Discount Amount | MN Quote Discount Amount |
| Quote | Amount Without Discount | MN Quote Amount Without Discount |
Contract → Deal Field Mapping
These fields sync when a Quote is processed and a Contract is created:
| MonetizeNow Field | Attio Deal Attribute |
|---|---|
| Contract ID | MN Contract ID |
| Contract Status | MN Contract Status |
| Start Date | MN Contract Start Date |
| End Date | MN Contract End Date |
| End Action | MN Contract End Action |
| Previous Contract ID | MN Previous Contract ID (Renewals) |
What Doesn't Sync (and Why)
These are intentional boundaries. Each one prevents a specific class of data integrity problem.
| What | Direction | Why |
|---|---|---|
| Account/Contact edits | MN → Attio | Attio is customer data source of truth |
| Non-primary Quotes | MN → Attio | Keeps CRM focused on commercially active Quote |
| Migrated Quotes | MN → Attio | Historical imports should not trigger CRM activity |
| Deal edits | Attio → MN Opportunity | Opportunity state is managed by MonetizeNow Quote lifecycle |
| Deal stage changes | Attio → MN Quote Status | Stage mapping is one-directional (MN → Attio only) |
| Line items | Either | Product-level detail lives in MonetizeNow Quotes only |
| Invoices and payments | Either | Billing data stays in billing system |
| Quote deletion events | Either | Not implemented. Quotes persist. |
Debugging Checklist
<p>When sync behaves unexpectedly, work through these in order. Most issues resolve at steps 1 through 3.</p>
<ol class="debug-list">
<li><strong>Does association exist?</strong> Check if Attio record is linked to a MonetizeNow entity. No association = no sync.</li>
<li><strong>Is association active?</strong> Disassociated or inactive links are skipped.</li>
<li><strong>Is Quote eligible?</strong> Must be Primary, linked to an Opportunity, and not migrated.</li>
<li><strong>Correct sync direction?</strong> Attio → MN for customer data. MN → Attio for Quotes/Contracts. Not reversible.</li>
<li><strong>Did webhook fire?</strong> Only <code>record.updated</code> and <code>record.deleted</code> events are processed.</li>
<li><strong>Required attributes present?</strong> Missing custom attributes on Attio side can block updates.</li>
<li><strong>Init Deal or manual flow?</strong> Some behaviors only apply during Init Deal orchestration.</li>
</ol>
<h2>Common Issues</h2>
<details class="ts-card"></details>
<details class="ts-card">MonetizeNow Account ID attribute populated</details>
<details class="ts-card"></details>
<details class="ts-card"></details>
<details class="ts-card"></details>
<details class="ts-card"></details>
<details class="ts-card"></details>
<details class="ts-card"></details>
<h2>Skipped vs. Failed</h2>
<p>A <strong>skipped</strong> sync means MonetizeNow couldn't identify a valid target and held off rather than write to an unverified record. Typically points to a missing association or ineligible Quote.</p>
<p>A <strong>failed</strong> sync means something structurally blocked action: conflicting association, missing required data, or inaccessible records. Failures are enforced by design.</p>Updated 5 months ago