> ## Documentation Index
> Fetch the complete documentation index at: https://help.bodharouteplanner.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Method CRM Integration

> Connect Method CRM to Bodha Route Planner and turn QuickBooks invoices and sales orders into delivery routes automatically.

> [!NOTE]
>
> The Method CRM integration is available on the **Pro** plan. One Method connection per organization.

## Overview

Method CRM is a QuickBooks-native CRM. When connected to Bodha Route Planner, your invoices and sales orders flow automatically into the **Orders Inbox** — ready to be planned into routes.

**What this integration does:**

| Direction | What happens |
| - | - |
| **Method → Bodha Route Planner** | Invoices or sales orders are pulled on a schedule and land as delivery orders in your inbox. |
| **Bodha Route Planner → Method** | When a driver completes or fails a delivery, the outcome is written back to the Method record (delivery status, timestamp, tracking link, notes). |

***

## How it works

1. You enter your Method CRM API key in Bodha Route Planner
2. You pick which **table** holds your deliverable work (Invoice, SalesOrder, etc.)
3. You set a **filter** to narrow the pull to relevant records (e.g. only unpaid invoices, only this week's orders)
4. Bodha Route Planner **samples a real record** from that table and shows you every field
5. You **map** Method fields to Bodha Route Planner fields (address, name, phone, etc.)
6. Bodha Route Planner pulls new and updated records on a schedule (default: every 15 minutes)
7. Orders land in your inbox, geocoded and ready to add to routes
8. After delivery, the outcome is written back to your Method record

***

## Setup

**1. Get your Method CRM API key**

In Method CRM, go to **Integrations → API** and generate a new API key. Copy it — you'll paste it in the next step.

> [!TIP]
>
> The API key gives Bodha Route Planner access to read your records and (optionally) write delivery status back. It does not give access to modify financial data.

**2. Connect in Bodha Route Planner**

1. Go to **Integrations** in the main navigation
2. Find **Method CRM** and click **Connect**
3. Give the connection a name (e.g. "Method Invoices")
4. Paste your Method API key
5. Click **Test Connection** — Bodha Route Planner verifies it can reach your account

**3. Choose the source table**

Select which Method table holds the work you want to deliver:

* **Invoice** — Most common. QuickBooks invoices synced through Method.
* **SalesOrder** — Sales orders, if your workflow uses those instead.
* **Custom table** — Any table you've created in Method that holds deliverable work.

> [!WARNING]
>
> You must have **at least one record** in the selected table. Method has no metadata endpoint, so Bodha Route Planner reads a real record to discover your fields. An empty table can't be mapped.

**4. Set a filter**

A filter narrows the pull to records that are actually ready for delivery. Without a filter, the first sync would pull your entire history.

Example filters:

* `IsPending eq true` — Only open/unpaid invoices
* `DueDate ge 2026-10-01` — Invoices due after a date
* `Status eq 'Open'` — Only open records

> [!NOTE]
>
> Filter syntax follows OData conventions. Method's documentation has the full filter reference for each table.

**5. Map your fields**

Bodha Route Planner reads a real record from your table and shows you every field with a sample value. Map each one to the corresponding Bodha Route Planner field:

| Bodha Route Planner field | What to map it to | Required |
| - | - | - |
| **Address** | Your shipping/delivery address field (e.g. `ShipAddressLine1`) | **Yes** |
| **Address line 2** | Secondary address (e.g. `ShipAddressLine2`) | No |
| **City** | City field (e.g. `ShipAddressCity`) | No |
| **State** | State/province (e.g. `ShipAddressState`) | No |
| **Postcode** | Postal/ZIP code (e.g. `ShipAddressPostalCode`) | No |
| **Country** | Country (e.g. `ShipAddressCountry`) | No |
| **Recipient name** | Customer or contact name | No |
| **Email** | Customer email | No |
| **Phone** | Customer phone | No |
| **Order number** | Invoice/order reference (e.g. `RefNumber`) | No |
| **Delivery date** | Due date or delivery date field | No |
| **Parcel count** | Number of items/packages | No |
| **Parcel weight** | Weight in kg | No |
| **Time window start** | Earliest delivery time | No |
| **Time window end** | Latest delivery time | No |
| **Notes** | Delivery instructions or notes | No |

> [!TIP]
>
> **Fallback fields:** You can map multiple fields separated by commas, and the first non-empty one wins. For example, map Address to `ShipAddressLine1,BillAddressLine1` — if the shipping address is empty, the billing address is used instead.

**6. Preview and confirm**

Click **Preview** to see what the first few records will look like as orders. Check that addresses, names, and details look correct. If something is wrong, adjust the mapping and preview again.

When you're happy, click **Save**. The first sync starts within the configured interval.

***

## Sync settings

| Setting | Default | Description |
| - | - | - |
| **Sync frequency** | 15 minutes | How often Bodha Route Planner polls Method for new and updated records. Range: 5 minutes to 24 hours. |
| **Auto-geocode** | On | Automatically geocode addresses when orders are ingested. |
| **Cutoff time** | None | After this time, new orders are flagged for the next day instead of today. |
| **Service area** | None | Only import orders within a radius of your depot. Orders outside are flagged "needs review" (not dropped). |

You can also trigger a sync manually at any time by clicking **Sync Now** on the integration page.

***

## Write-back (delivery status)

When write-back is enabled, Bodha Route Planner writes the delivery outcome back to the Method record after a driver completes or fails a stop.

### What gets written

| Field | Value written | When |
| - | - | - |
| **Status** | "Delivered" or "Not delivered" | After stop completion or failure |
| **Delivered at** | ISO timestamp | After successful delivery |
| **Tracking link** | Live tracking URL | When available |
| **Note** | Failure reason | After a failed delivery |

### Setting up write-back

1. In the integration settings, map your **write-back fields** — choose which Method field each value should be written to
2. Click **Verify Write-back** — Bodha Route Planner writes a test value to a real record, reads it back to confirm it landed, then restores the original value
3. If verification passes, write-back is enabled

> [!WARNING]
>
> **Why verification is required:** Method's API accepts field names it doesn't recognize and returns a success response — but writes nothing. A misspelled field name is silently ignored. The verification step catches this by actually checking the value landed. Without it, you could have write-back "working" for months while nothing is actually updated.

### Protected fields

Bodha Route Planner **refuses** to write to fields that belong to your accounting system. These include:

* Financial fields: Amount, Balance, SubTotal, TaxTotal, Total, Currency
* Reference fields: RefNumber, InvoiceNumber, DocNumber, DueDate, TxnDate
* Status fields: IsPending, IsDeleted, IsActive, Status
* Customer/entity references
* Ship-to and bill-to address blocks

This protection exists because Method is a two-way QuickBooks front-end. Writing to an accounting-owned field could propagate into your actual QuickBooks file.

***

## Customer enrichment

When a Method record has a `Customer_RecordID`, Bodha Route Planner looks up that customer's full contact details (name, phone, email) from Method's Customer table. This happens automatically during sync.

The enrichment fills in gaps — if the invoice itself carries a shipping name and phone, those take priority. The customer lookup only supplies what's missing.

This is batched efficiently: one request per page of records, not one per order — so it won't burn through your Method API budget.

***

## Rate limits and API budget

Method CRM has a **100 requests per minute** budget shared across your entire account — including Method's own UI, other integrations, and Bodha Route Planner.

Bodha Route Planner is designed to work within this:

* Records are fetched in pages of 100 (Method's maximum)
* Up to 2,000 records per sync cycle (20 pages)
* Customer enrichment is batched (one request per 40 customers)
* If rate limited, Bodha Route Planner waits and retries automatically
* Only one Method connection per organization (to prevent double-polling)

***

## Deletion detection

Method has no deletion webhook and no "IsDeleted" field on Invoice records. If someone deletes an invoice in Method, Bodha Route Planner has no way to know through normal polling.

To handle this, Bodha Route Planner runs a periodic **reconciliation sweep** — it reads all current record IDs from Method and compares them against what's in the inbox. Orders whose source record no longer exists are flagged.

> [!NOTE]
>
> The reconciliation sweep runs hourly, separate from the regular sync. If your table has more than 2,000 records matching the filter, narrow the filter to ensure the sweep can complete.

***

## Troubleshooting

> **'Method rejected the API key'**
>
> Your API key is invalid or has been regenerated.
>
> 1. Go to **Integrations → API** in Method CRM
> 2. Generate a new API key
> 3. In Bodha Route Planner, edit the Method integration and paste the new key
> 4. Click **Test Connection**

> **'That table could not be found'**
>
> The table name in your integration settings doesn't match any table in your Method account.
>
> * Table names are case-sensitive in Method
> * Check the exact spelling in Method CRM's admin panel
> * Common tables: `Invoice`, `SalesOrder`, `Estimate`

> **'Table is empty, no fields to map'**
>
> Bodha Route Planner discovers fields by reading a real record. If the table has zero records, there's nothing to read.
>
> * Create at least one record in Method CRM
> * Or choose a different table that already has records

> **Write-back verification fails**
>
> **All fields failed:** The field names don't match what exists in your Method account. Field names are case-sensitive — "deliverystatus" is not the same as "DeliveryStatus". Use the sample fields to check the exact names.
>
> **Some fields failed:** The ones that failed are misspelled or don't exist on the selected table. The ones that passed are working correctly.
>
> **"Fields belong to your accounting system":** You tried to write to a protected field (Amount, Balance, RefNumber, etc.). Choose a custom field for write-back instead.

> **Orders are stuck in 'Needs review'**
>
> The address couldn't be geocoded. Check:
>
> * Is the address field mapped correctly?
> * Does the record have an actual delivery address (not a billing address or P.O. box)?
> * Are address components (city, state, postcode) mapped?
>
> Open the order, fix the address, and save — it will be re-geocoded.

> **Sync stopped pulling new records**
>
> Check the integration status on the Integrations page:
>
> * **Error** state: Click **Test Connection** to see the error message. Usually an expired or regenerated API key.
> * **Connected** but no new orders: The filter may be too narrow, or there are no new/updated records since the last sync.
> * Click **Sync Now** to trigger an immediate pull and check the result count.

> **Duplicate orders appearing**
>
> Method records are deduplicated by their RecordID. Duplicates should not occur for the same table. If you see duplicates:
>
> * Check if you have orders from both Invoice and SalesOrder for the same customer (these are separate records with separate IDs)
> * Ensure you're not importing the same data through a second source (e.g. also importing via CSV)

***

## Limits

| Limit | Value |
| - | - |
| **Connections per org** | 1 |
| **Records per sync cycle** | 2,000 (20 pages × 100) |
| **Sync frequency range** | 5 minutes – 24 hours |
| **Write-back** | Delivery status only (read-only for financial fields) |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.