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
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.
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.
| Attio Owns | MonetizeNow Owns |
|---|---|
| Company and People profiles | Quote generation and lifecycle |
| Deal pipeline and stages | Contract creation and status |
| Rep workspace and CRM workflow | Revenue metrics (ARR, MRR) |
| Customer data edits | Invoicing, billing, payments |
Object Mapping
Every Attio record maps to a MonetizeNow record through a stored ID pair. Once linked, all sync decisions reference that pairing.
| From | To | |
|---|---|---|
| Attio Company | → | MonetizeNow Account |
| Attio Person | → | MonetizeNow Contact |
| Attio Deal | → | MonetizeNow Opportunity |
| MonetizeNow Primary Quote + Contract | → | Attio Deal (custom attributes) |
Sync Direction
| Direction | What syncs |
|---|---|
| Inbound | Attio Company and People edits sync into MonetizeNow Account and Contact records. |
| Outbound | MonetizeNow Primary Quote and Contract data syncs into Attio Deal custom attributes. |
Six Things Worth Knowing
An Opportunity can have multiple Quotes, but only Primary Quote writes data to Attio Deal. Drafts, alternatives, and older versions get skipped.
Each amendment or renewal creates a new Attio Deal named "Amendment - [description]" or "Renewal - [description]", preserving original Deal history.
Deleting an Attio Company or Person deactivates corresponding Account or Contact and unlinks association. Billing records stay intact for audit and contract integrity.
Only one Attio Workspace connects per Tenant, preventing cross-tenant data contamination and duplicate sync flows.
Every sync starts with an association check. If one exists, data flows. If not, a new association is created or that record is skipped.
When Attio pushes an update, only mapped fields change. Billing-specific values like status, custom fields, and configuration stay untouched.
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
- Create an Integration User in MonetizeNow
Create a user with Tenant Admin role. This user is tied to all sync actions from Attio into MonetizeNow. Use a shared/service account email, not a personal one. - Initiate OAuth from MonetizeNow
Navigate to Settings → CRM in your MonetizeNow Tenant and click "Connect to Attio". This launches OAuth. Log into Attio if prompted, then select your Workspace. - Automatic Workspace Configuration
On successful OAuth, custom attributes are created on Attio Company and Deal objects (MonetizeNow Account ID, Quote ID, ARR, MRR, Contract fields, etc.) and webhooks register automatically. App appears in your Attio Workspace installed apps. - Generate a MonetizeNow API Key
In MonetizeNow, go to Settings → API Keys and click "New API Key". Copy it. - Complete Workspace Connection in Attio
In Attio, open MonetizeNow app details. Under "Workspace Connection," click "+ Connect" and paste your MonetizeNow API key.
Connected
MonetizeNow now appears as an installed app in Attio. Custom attributes are live. Webhooks are listening. You can start creating Quotes from Deals.
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.
Validation
MonetizeNow validates that one Quote status does not map to multiple stages. If you see a validation error, check your mapping for duplicates.
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
- Validate Deal
- Resolve Company → Account
- Resolve People → Contacts
- Create Opportunity
- Redirect to Quote
Requirements
Attio Deal must have: a name, a currency, an associated Company, and at least one associated Person. If any are missing, Init Deal returns a validation error.
Steps for Reps
- Open your Attio Deal
Confirm it has a Company and at least one Person associated. - Click MonetizeNow icon
Located on right panel of Deal detail page. - Click "Create Quote"
MonetizeNow validates Deal, creates/resolves records, and redirects you to a Draft Quote. - Complete Quote in MonetizeNow
Add Offerings, set pricing, configure Contract terms. As you update Quote, data syncs back to Attio Deal automatically.
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.
Why separate Deals?
Each revenue event (new business, amendment, renewal) represents a distinct commercial motion with its own value, timing, and forecast implications. Collapsing them into one Deal loses pipeline context that sales and finance both need. Separate Deals preserve full revenue history.
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 |
Preserved fields
Account status, custom fields, legal entity, and dunning configuration are never overwritten by Attio updates.
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 |
Multi-account contacts
One Attio Person can map to multiple Contacts across different Accounts. Same person, different companies. When an Attio Person is updated, all associated Contacts update simultaneously.
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:
Hard sync gates
- Quote must be linked to an Opportunity.
- Quote must be Primary Quote on that Opportunity.
- 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. |
By design
Every entry in this table prevents a real failure mode: overwrite loops, phantom duplicates, or revenue data corruption from CRM-side edits. Boundaries like these are what keep sync reliable at scale.
Debugging Checklist
When sync behaves unexpectedly, work through these in order. Most issues resolve at steps 1 through 3.
- Does association exist? Check if Attio record is linked to a MonetizeNow entity. No association = no sync.
- Is association active? Disassociated or inactive links are skipped.
- Is Quote eligible? Must be Primary, linked to an Opportunity, and not migrated.
- Correct sync direction? Attio → MN for customer data. MN → Attio for Quotes/Contracts. Not reversible.
- Did webhook fire? Only
record.updatedandrecord.deletedevents are processed. - Required attributes present? Missing custom attributes on Attio side can block updates.
- Init Deal or manual flow? Some behaviors only apply during Init Deal orchestration.
Common Issues
Quote didn't sync to Attio Deal
- Confirm Quote is linked to an Opportunity
- Confirm it's Primary Quote on that Opportunity
- Confirm it's not a migrated Quote
- All three must be true for sync to proceed
- Verify Opportunity's Attio Deal association is active
Company update in Attio didn't reach MonetizeNow
- Check Company has
MonetizeNow Account IDattribute populated - If blank, no association exists and update has nowhere to go
- Confirm change was to a supported field (Name or Primary Location)
Person created multiple Contacts in MonetizeNow
- Expected when same Person is associated with Deals across multiple Companies
- Each Company maps to a different Account, each needing its own Contact
- One Person → multiple Contacts (across Accounts) is by design
Deal wasn't created for an Amendment or Renewal
- Deals only appear when Quote becomes Primary and is processed
- If Quote isn't Primary or hasn't been processed, no Deal gets created
- Verify original Opportunity has an active Attio Deal association
Deal stage didn't update when Quote status changed
- Stage mapping is optional, configured in Settings → CRM → Attio
- If Quote's new status has no mapped stage, Deal stage won't change
- Confirm mapping configuration exists for that status
- Ensure Quote is eligible: Primary + non-migrated + linked to Opportunity
Contract data only appears after Quote processing
- This is expected behavior
- Contract fields (ID, status, dates, end action) sync only after Quote is fully processed
- Before processing, those attributes stay empty
Deleted Attio record but MonetizeNow record still exists
- Records are deactivated, not deleted, in response to Attio deletions
- Association is marked as disassociated
- Preserves invoice history, contract integrity, and audit trails
Init Deal failed with a validation error
- Deal must have a name and default currency
- Deal must have an associated Company
- Deal must have at least one associated Person
- If any are missing, flow returns a validation error
- Ensure Company's Account doesn't conflict with Deal's Opportunity Account
Skipped vs. Failed
A skipped 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.
A failed sync means something structurally blocked action: conflicting association, missing required data, or inaccessible records. Failures are enforced by design.
Updated 2 days ago