From your LOS to your phone, your inbox, your calendar — Benji connects to the tools loan officers actually use.
Benji is a full mortgage CRM on its own — Arive is not required. But if you do run Arive, you get native two-way sync via Zapier. Stages, key dates, borrower info, and loan numbers flow in automatically. Most Arive users are connected in under 5 minutes.
Sync Arive loans and leads to Benji via Zapier. Follow these 7 steps to get set up in under 20 minutes.
Arive is a private Zapier app — invite-only
Don't search for Arive in Zapier — you won't find it. You must use the invite link from Arive's own dashboard (Company Settings → Integrations → Copy Zapier Link). Arive doesn't expose a direct API, so this is the only supported path.
Log into Arive → Company Settings → Integrations (or User Settings → Integrationsif you're on the Self Paid plan). Click Generate.
You'll get three values:
Client IDSecret KeyAPI KeyAvailable on Broker Pro and Non-Del plans.
Still on the Arive Integrations page, click Copy Zapier Link. Paste it into a new tab and click Accept Invite & Build Zap.
This grants your Zapier account access to ARIVE API triggers. You only do this once.
In Benji, open Settings → Integrations → Arive. You'll see your unique webhook URL (one per account). Toggle the integration on.
Format: https://benji.biz/api/integrations/arive/zapier/<your_token>
The URL is the only auth you need — no API keys, no Bearer tokens. Each token is unique to your account and can be rotated if leaked.
In Zapier, create a new Zap. Pick ARIVE API as the trigger app, sign in with the credentials from Step 1, then select one of the 5 triggers below. For the action, choose Webhooks by Zapier → POST.
Configure each Zap with:
POSTJSONYou don't have to build all 5 — start with #1 (New Loan) and add the others as you need them.
In the Zapier editor, every step has a Test button. Use it. Arive sends a real sample payload from your account; Benji writes a row in the sync log.
Watch events land in Benji → Integrations → Arive → Sync log with the raw payload + a Replay button.
In Benji, click Generate next to HMAC signature verification. Copy the secret once — it's only shown that one time.
In each Zap, add a Code by Zapier step BEFORE the Webhooks step:
// Node.js — Code by Zapier
const crypto = require('crypto');
const body = JSON.stringify(inputData);
const sig = 'sha256=' + crypto
.createHmac('sha256', 'YOUR_BENJI_SECRET')
.update(body)
.digest('hex');
return { signature: sig, body };Then in the Webhooks step: set body to {{body}} and add header X-Benji-Signature: {{signature}}.
Most LOs skip this. The webhook token in your URL already authenticates the request — HMAC is belt-and-suspenders for compliance-sensitive accounts.
Subsequent loan/lead events upsert by sysGUID — Benji finds the matching row and updates it. No manual linking.
Self-contained tutorial for each Zap. Build steps, JSON body, field-by-field mapping, what Benji does server-side, and common pitfalls. Required Zaps are marked ⭐ — without those two, the integration won't feel right.
Troubleshooting
Every symptom we've seen in production, with the actual fix.
Zapier shows 200 OK but I don't see the loan in Benji
Most common: borrower fields landed empty so a placeholder client was created. Check the Arive sync log → most recent event → expand the raw payload. Look for loanBorrower1_firstName (Arive's canonical field name) — if blank, your Zap is mapping the wrong field. Use {{loanBorrower1_firstName}} (singular, numbered) per Arive's actual Zapier schema, NOT {{loanBorrowers_firstName}} (plural) which earlier docs incorrectly suggested. Benji accepts both shapes for backward compat. Fix the Zap body, then click Repair names on the integration card.
Zapier shows 401 Unauthorized
Either your Benji webhook URL is wrong, or you have HMAC enabled and the X-Benji-Signature header is missing/wrong. Verify the URL matches the one at the top of this page. If HMAC, recheck the Code-by-Zapier step from Setup Step 6.
Zapier shows 410 Gone
Your Arive integration toggle is OFF in Benji. Open Settings → Integrations → Arive and flip Enabled on.
Zapier shows 422 Unprocessable Entity
The payload is missing both ariveLoanId and ariveLeadId — Benji can't tell if it's a loan or a lead. Make sure your Zap body includes one of those identifiers.
Stage changes don't sync even though Zap #3 is built
Arive may be sending a stage label we don't recognize. Check the sync log → eye icon to view raw payload → confirm currentLoanStatus_status value. The matcher handles UPPERCASE_WITH_UNDERSCORES, 'Title Case', and 'hyphen-case' but exotic strings need a code update — flag it to support with the value you see.
Records sync but don't appear in /pipeline or /loans
Team admin scope filter is hiding clients with no teamId. Click Repair scoping on the Arive integration card. This was an old ingest bug; new syncs stamp teamId correctly.
Borrower opt-out from Arive doesn't stop cadences
Build Zap #5 (Lead Updated) — that's the one that propagates opt-out flag changes. Without it, the flag set in Arive stays at whatever value was captured at lead creation.
Zapier says 'task limit exceeded'
Loan Updated (Zap #2) is high-volume. On Zapier free tier you may exhaust 100 tasks/month. Either upgrade Zapier, or skip Zap #2 — Zaps #1 + #3 alone keep stage + creation in sync, just not field-level edits.
I see an amber 'Arive sync quiet for 26h' alert
Either your Zaps stopped firing (most common — check Zapier dashboard for paused Zaps), or you genuinely haven't touched loans in Arive for 24h+. Refire any test trigger in Zapier to confirm the path is still working end-to-end.
Every Arive Zapier field with its Benji destination. Search by Arive key, label, Benji field name, or note. Typed columns show the exact model + field; long-tail data lands in ariveExtras JSON for full round-trip preservation. 210 fields documented.
| Arive key | Label | Lands in Benji | Category | Entity | Notes |
|---|---|---|---|---|---|
| ARIVE System GUID | Loan.ariveSysGUID / Client.ariveLeadSysGUID | Identifier | Both | Stable join key. Same value across every trigger for the same record — drives idempotent upsert. | |
| ARIVE Display Loan ID | Loan.ariveLoanId | Identifier | Loan | Human-readable. Shown next to loan number on pipeline cards + /loans table. | |
| ARIVE Display Lead ID | Client.ariveLeadId | Identifier | Lead | — | |
| CRM Reference Id | Loan.ariveExtras.crmReferenceId / Client.ariveExtras.crmReferenceId | Identifier | Both | Round-trip key — if you set Benji's id back in Arive, we preserve it on subsequent syncs. | |
| Deep Link URL | Loan.ariveDeepLink / Client.ariveLeadDeepLink | Identifier | Both | Powers the ↗ icon that opens the record back in Arive. | |
| Lead Id (if loan was converted from a lead) | Used to match existing Client by lead | Identifier | Loan | When a loan was promoted from an Arive lead, this lets us attach the loan to the same Benji Client created by the lead Zap. | |
| Status Name (stage) | Loan.pipelineStage (mapped) | Stage / status | Loan | 15 Arive stages map to Benji's PipelineStage enum. Fuzzy matcher handles UPPER_CASE, Title Case, and hyphenated variants. | |
| Status Date | Loan.stageUpdatedAt | Stage / status | Loan | When Arive recorded the stage move. Drives the 'days in stage' display. | |
| Adverse Reason | Loan.adverseReason | Stage / status | Loan | Required when stage is ADVERSE / SUSPENDED. Surfaces as a red banner on the loan detail page. | |
| Loan Archive Indicator | Loan.archived (boolean) | Stage / status | Loan | — | |
| Loan Archive Date | Loan.archivedAt | Stage / status | Loan | — | |
| Lead Status | Client.ariveExtras.leadStatus | Stage / status | Lead | Surfaced in the Arive details panel; not yet mapped to a typed Benji disposition. | |
| Base Loan Amount | Loan.loanAmount (fallback if totalLoanAmount missing) | Money | Both | — | |
| Total Loan Amount | Loan.loanAmount | Money | Loan | — | |
| Property Value / Sales Price | Loan.purchasePrice (fallback if subjectProperty_salesContractAmt missing) | Money | Both | — | |
| Purchase Price | Loan.purchasePrice | Money | Loan | — | |
| Down Payment | Loan.downPayment | Money | Loan | — | |
| Note Rate | Loan.interestRate | Money | Both | Stored as percent (e.g. 6.875). | |
| LTV Ratio | Loan.ltv | Money | Loan | — | |
| Combined LTV Ratio | Loan.cltv | Money | Loan | — | |
| HCLTV Ratio | Loan.ariveExtras.hcltv | Money | Loan | — | |
| FrontEnd DTI | Loan.frontEndDTI | Money | Loan | — | |
| BackEnd DTI | Loan.backEndDTI | Money | Loan | — | |
| Estimated Cash To Close | Loan.ariveExtras.estCashToClose | Money | Loan | — | |
| Discount Points | Loan.discountPoints | Money | Loan | — | |
| Earnest Money Deposit | Loan.earnestMoneyDeposit | Money | Loan | — | |
| Seller Credit | Loan.sellerCredit | Money | Loan | — | |
| Total Concession Amount | Loan.totalConcessionAmt | Money | Loan | — | |
| Financed Fees | Loan.ariveExtras.financedFees | Money | Loan | — | |
| Broker Fees | Loan.ariveExtras.brokerFee | Money | Loan | — | |
| Credit Report Fee | Loan.ariveExtras.CreditReportFee | Money | Loan | — | |
| Reimbursements | Loan.ariveExtras.reimbursements | Money | Loan | — | |
| Tolerance Cures | Loan.ariveExtras.toleranceCures | Money | Loan | — | |
| Total PITI | Loan.monthlyPITI | Money | Loan | — | |
| Principal, Interest and MI | Loan.ariveExtras.principalInterestAndPMI | Money | Loan | — | |
| Monthly P&I | Loan.monthlyPI | Money | Loan | — | |
| Monthly Homeowners Insurance | Loan.monthlyHOI | Money | Loan | — | |
| Monthly Real Estate Tax | Loan.monthlyPropertyTax | Money | Loan | — | |
| Monthly MI Premium | Loan.monthlyMI | Money | Loan | — | |
| Monthly HOA Dues | Loan.monthlyHOA | Money | Loan | — | |
| Monthly Flood Insurance | Loan.monthlyFloodIns | Money | Loan | — | |
| Loan Purpose | Loan.loanPurpose (mapped) | Terms | Both | PURCHASE / REFINANCE_RATE_TERM / REFINANCE_CASH_OUT. | |
| Refinance Type | Loan.ariveExtras.refinanceType | Terms | Loan | — | |
| Cashout Purpose | Loan.ariveExtras.cashoutPurpose | Terms | Loan | — | |
| Mortgage Type | Loan.loanType (mapped) | Terms | Both | FHA / VA / DSCR / NON_QM / etc. — mapped to Benji's LoanType enum. | |
| Amortization Type | Loan.amortizationType | Terms | Loan | — | |
| Amortization Term | Loan.amortizationTerm | Terms | Loan | — | |
| Loan Term | Loan.loanTermMonths | Terms | Loan | — | |
| Lien Priority Type | Loan.lienPosition | Terms | Loan | — | |
| Interest Only Indicator | Loan.ariveExtras.interestOnlyInd | Terms | Loan | — | |
| Interest Only Term Months | Loan.ariveExtras.interestOnlyTermMonthsCount | Terms | Loan | — | |
| Initial Fixed Period | Loan.ariveExtras.initialFixedPeriodEffectiveMonthsCount | Terms | Loan | — | |
| Normal Rate Adjustment Period | Loan.ariveExtras.normalRateAdjustmentPeriod | Terms | Loan | — | |
| Alternate Doc Loan | Loan.documentationType | Terms | Loan | — | |
| Buydown | Loan.ariveExtras.buyDown | Terms | Loan | — | |
| Escrow Impound Type | Loan.ariveExtras.impoundWaiver | Terms | Loan | — | |
| Pre-Pay Penalty | Loan.prepayPenalty | Terms | Loan | NONE / SOFT / HARD / OTHER. Shown in the loan detail Prepayment Penalty section when not NONE. | |
| Pre-Pay Penalty Term | Loan.prepayPenaltyTerm | Terms | Loan | — | |
| Pre-Pay Penalty Amount | Loan.prepayPenaltyAmount | Terms | Loan | — | |
| Rate Lock Status | Loan.rateLockStatus | Lock | Loan | LOCKED / FLOAT / EXPIRED / EXTENDED — normalized. | |
| Rate Lock Date | Loan.rateLockDate | Lock | Loan | — | |
| Lock Expiry Date | Loan.rateLockExpiry | Lock | Loan | — | |
| Subject Property Street Address | Loan.propertyAddress (composed) | Property | Loan | All subject property address fields concatenate into a single propertyAddress string for display. | |
| Subject Property Unit | Loan.propertyAddress (composed) | Property | Loan | — | |
| Subject Property City | Loan.propertyAddress (composed) | Property | Loan | — | |
| Subject Property County | Loan.ariveExtras.subjectProperty_county | Property | Loan | — | |
| Subject Property State | Loan.propertyAddress (composed) | Property | Both | — | |
| Subject Property Postal Code | Loan.propertyAddress (composed) | Property | Both | — | |
| Property Type | Loan.ariveExtras.subjectProperty_housingType | Property | Loan | — | |
| Occupancy | Loan.occupancyType (mapped) | Property | Both | PRIMARY_RESIDENCE / SECOND_HOME / INVESTMENT_PROPERTY. | |
| Number of Units | Loan.ariveExtras.subjectProperty_financedUnitCount | Property | Loan | — | |
| Attachment Type | Loan.ariveExtras.subjectProperty_attachmentType | Property | Loan | — | |
| TBD Indicator | Loan.ariveExtras.subjectTBDIndicator | Property | Both | True when subject property is To Be Determined (pre-qualification shopping). | |
| Lender Name | Loan.lender | Lender | Loan | — | |
| Lender NMLS | Loan.lenderNMLS | Lender | Loan | — | |
| Lender Loan Number | Loan.loanNumber | Lender | Loan | Treated as the canonical loan #. Surfaces on pipeline cards + /loans table. | |
| Lender Product Name | Loan.lenderProductName | Lender | Loan | — | |
| MERS Number For Non Del | Loan.mersNumber | Lender | Loan | — | |
| First Name | Client.firstName | Borrower | Loan | PRIMARY borrower from Arive's flattened Zapier output. loanBorrower2_* for co-borrower. Plural loanBorrowers_firstName also accepted (legacy). | |
| Last Name | Client.lastName | Borrower | Loan | — | |
| Nick Name | Client.nickName | Borrower | Loan | — | |
Client.email | Borrower | Loan | — | ||
| Phone | Client.phone (E.164 normalized) | Borrower | Loan | — | |
| Work Phone | Client.workPhone | Borrower | Loan | — | |
| Home Phone | Client.homePhone | Borrower | Loan | — | |
| Applicant Type | Used to pick primary borrower | Borrower | Loan | BORROWER vs CO_BORROWER — we pick BORROWER with sequence 1 as primary. | |
| Borrower Pair App Sequence | Used to pick primary borrower | Borrower | Loan | — | |
| Marital Status | Client.maritalStatus | Borrower | Loan | — | |
| Day of Birth | Client.dobDay | Borrower | Loan | — | |
| Month of Birth | Client.dobMonth | Borrower | Loan | Year intentionally not captured. | |
| Preferred Languages | Client.preferredLanguage | Borrower | Loan | — | |
| First Time Home Buyer Indicator | Client.firstTimeHomeBuyer | Borrower | Both | Drives FTHB cadence segmentation. | |
| Street Address | Client.address | Borrower | Loan | — | |
| Address City | Client.city | Borrower | Loan | — | |
| Address State | Client.state | Borrower | Loan | — | |
| Address Postal Code | Client.zip | Borrower | Loan | — | |
| POS Application Submission Date | Loan.ariveExtras.loanBorrowers_posAppSubmissionDate | Borrower | Loan | — | |
| Lead borrower first name | Client.firstName | Borrower | Lead | — | |
| Lead borrower last name | Client.lastName | Borrower | Lead | — | |
| Lead borrower email | Client.email | Borrower | Lead | — | |
| Lead borrower mobile | Client.phone (E.164) | Borrower | Lead | — | |
| Lead borrower DOB day | Client.dobDay | Borrower | Lead | — | |
| Lead borrower DOB month | Client.dobMonth | Borrower | Lead | — | |
| Lead borrower street | Client.address | Borrower | Lead | — | |
| Lead borrower city | Client.city | Borrower | Lead | — | |
| Lead borrower state | Client.state | Borrower | Lead | — | |
| Lead borrower zip | Client.zip | Borrower | Lead | — | |
| Employment type | Client.ariveExtras.borrower_employmentType | Borrower | Lead | — | |
| Has co-borrower | Client.hasCoBorrower | Borrower | Lead | — | |
| Has real estate | Client.ariveExtras.borrower_hasRealEstate | Borrower | Lead | — | |
| Annual income | Client.annualIncome | Borrower | Lead | — | |
| Military service | Client.militaryServiceType | Borrower | Lead | VA loan eligibility. | |
| Total monthly income | Client.ariveExtras.borrower_totalMonthlyIncome | Borrower | Lead | — | |
| First-time homebuyer | Client.firstTimeHomeBuyer | Borrower | Lead | — | |
| Years since foreclosure | Client.ariveExtras.borrower_yearsSinceForeclosure | Borrower | Lead | — | |
| Years since bankruptcy | Client.ariveExtras.borrower_yearsSinceBankruptcy | Borrower | Lead | — | |
| Currently owns home | Client.ariveExtras.borrower_currentlyOwningAHome | Borrower | Lead | — | |
| Selling before buying | Client.ariveExtras.borrower_planningToSellItBeforeBuying | Borrower | Lead | — | |
| Total monthly liability | Client.monthlyDebts | Borrower | Lead | — | |
| Residency basis type | Client.ariveExtras.borrower_occupancy | Borrower | Lead | — | |
| Address duration months | Client.ariveExtras.borrower_durationMonthsCount | Borrower | Lead | — | |
| Co-borrower first name | Client.coBorrowerFirstName | Co-borrower | Lead | — | |
| Co-borrower last name | Client.coBorrowerLastName | Co-borrower | Lead | — | |
| Co-borrower email | Client.coBorrowerEmail | Co-borrower | Lead | — | |
| Co-borrower DOB day | Client.ariveExtras.coBorrower_dayOfBirth | Co-borrower | Lead | — | |
| Co-borrower DOB month | Client.ariveExtras.coBorrower_monthOfBirth | Co-borrower | Lead | — | |
| Co-borrower cell | Client.coBorrowerPhone | Co-borrower | Lead | — | |
| Co-borrower military | Client.ariveExtras.coBorrower_militaryServiceType | Co-borrower | Lead | — | |
| Employer Name | Client.employer (when primary) | Employment | Loan | — | |
| Position Description | Loan.ariveExtras.employment_positionDesc | Employment | Loan | — | |
| Monthly Income | Loan.ariveExtras.employment_monthlyIncome | Employment | Loan | — | |
| Employer Phone | Loan.ariveExtras.employment_employerPhone | Employment | Loan | — | |
| Classification Type | Loan.ariveExtras.employment_classificationType | Employment | Loan | — | |
| Start Date | Loan.ariveExtras.employment_startDate | Employment | Loan | — | |
| End Date | Loan.ariveExtras.employment_endDate | Employment | Loan | — | |
| Self-Employed Indicator | Loan.ariveExtras.employment_selfEmployedInd | Employment | Loan | — | |
| Is Primary Borrower | Loan.ariveExtras.employment_isPrimaryBorrower | Employment | Loan | — | |
| Appraisal Contingency Date | Loan.keyDates.appraisalContingency | Key dates | Loan | — | |
| Appraisal Delivery Date | Loan.keyDates.appraisalDeliveryDate | Key dates | Loan | — | |
| Appraisal Ordered Date | Loan.keyDates.appraisalOrderedDate | Key dates | Loan | — | |
| Closing Contingency / Est. Closing | Loan.keyDates.closingContingency | Key dates | Loan | — | |
| Date To Avoid EPO | Loan.keyDates.dateToAvoidEPO | Key dates | Loan | — | |
| Est. First Payment Date | Loan.keyDates.estFirstPaymentDate | Key dates | Loan | — | |
| First Payment Date | Loan.keyDates.firstPaymentDate | Key dates | Loan | — | |
| HOI Ordered Date | Loan.keyDates.hoiOrderedDate | Key dates | Loan | — | |
| HOI Received Date | Loan.keyDates.hoiReceivedDate | Key dates | Loan | — | |
| Initial CD Sent Date | Loan.keyDates.initialCDSentDate | Key dates | Loan | — | |
| Initial CD Signed Date | Loan.keyDates.initialCDSignedDate | Key dates | Loan | — | |
| Initial LE Sent Date | Loan.keyDates.initialLESentDate | Key dates | Loan | — | |
| Initial LE Signed Date | Loan.keyDates.initialLESignedDate | Key dates | Loan | — | |
| Intent To Proceed Date | Loan.keyDates.intentToProceedDate | Key dates | Loan | — | |
| Loan Contingency Date | Loan.keyDates.loanContingency | Key dates | Loan | — | |
| Most Recent CD Sent Date | Loan.keyDates.mostRecentCDSentDate | Key dates | Loan | — | |
| Most Recent CD Signed Date | Loan.keyDates.mostRecentCDSignedDate | Key dates | Loan | — | |
| Most Recent LE Sent Date | Loan.keyDates.mostRecentLESentDate | Key dates | Loan | — | |
| Most Recent LE Signed Date | Loan.keyDates.mostRecentLESignedDate | Key dates | Loan | — | |
| Pre-Qualification Expiry Date | Loan.keyDates.preApprovalExpiryDate | Key dates | Loan | — | |
| Tax Transcript Ordered Date | Loan.keyDates.taxTranscriptOrderedDate | Key dates | Loan | — | |
| Tax Transcript Received Date | Loan.keyDates.taxTranscriptReceivedDate | Key dates | Loan | — | |
| Title Ordered Date | Loan.keyDates.titleOrderedDate | Key dates | Loan | — | |
| Title Received Date | Loan.keyDates.titleReceivedDate | Key dates | Loan | — | |
| TRID Date | Loan.keyDates.tridDate | Key dates | Loan | — | |
| Credit Order Date | Loan.keyDates.creditOrderDate | Key dates | Loan | — | |
| Credit Import Date | Loan.keyDates.creditImportDate | Key dates | Loan | — | |
| Credit Expiration Date | Loan.keyDates.creditExpirationDate | Key dates | Loan | — | |
| Estimated Funding Date | Loan.keyDates.estimatedFundingDate | Key dates | Loan | — | |
| Sales Contract Date | Loan.keyDates.salesContractDate | Key dates | Loan | — | |
| Contact First Name | ReferralPartner.name (composed) | Business contact | Loan | — | |
| Contact Last Name | ReferralPartner.name (composed) | Business contact | Loan | — | |
| Contact Email | ReferralPartner.email | Business contact | Loan | Used to dedupe — existing partner with same email gets updated, otherwise created. | |
| Contact Phone | ReferralPartner.phone | Business contact | Loan | — | |
| Contact Role | ReferralPartner.type (mapped) | Business contact | Loan | LISTING_AGENT / BUYERS_AGENT / TITLE / INSURANCE etc. mapped to Benji's ReferralPartnerType. | |
| Company Name | ReferralPartner.company | Business contact | Loan | — | |
| Company Street | ReferralPartner.officeAddress (composed) | Business contact | Loan | — | |
| Company City | ReferralPartner.officeAddress (composed) | Business contact | Loan | — | |
| Company State | ReferralPartner.officeAddress (composed) | Business contact | Loan | — | |
| Company Zip | ReferralPartner.officeAddress (composed) | Business contact | Loan | — | |
| Disposition Status Type | Loan.ariveExtras.reoInfo (full object) | REO | Loan | All REO_Info fields preserved in ariveExtras as a sub-object. | |
| REO Current Market Value | Loan.ariveExtras.reoInfo.currentMarketValue | REO | Loan | — | |
| REO Net Rental Income | Loan.ariveExtras.reoInfo.netRentalIncome | REO | Loan | — | |
| REO Property Type | Loan.ariveExtras.reoInfo.propertyType | REO | Loan | — | |
| REO Street Address | Loan.ariveExtras.reoInfo.streetAddress | REO | Loan | — | |
| REO Owners | Loan.ariveExtras.reoInfo.owners | REO | Loan | — | |
| DNC Request | Client.ariveDoNotContact | Compliance | Lead | HARD-ENFORCED on every outbound: cadence cron, manual SMS, milestone emails. | |
| Email Opt-out | Client.ariveEmailOptOut | Compliance | Lead | Blocks cadence emails + manual prequal email + rate sheet email. | |
| SMS Opt-out | Client.ariveSmsOptOut | Compliance | Lead | Blocks cadence SMS + manual SMS. | |
| Compensation | Loan.compensationAmount | Compensation | Loan | — | |
| Compensation Type | Loan.compensationType | Compensation | Loan | BORROWER_PAID / LENDER_PAID. | |
| Gross Loan Revenue | Loan.grossLoanRevenue | Compensation | Loan | — | |
| Net Loan Revenue | Loan.netLoanRevenue | Compensation | Loan | — | |
| Industry Channel | Loan.industryChannel | Branch / channel | Loan | — | |
| Branch Display Name | Loan.branchName | Branch / channel | Loan | — | |
| Loan Branch UUID | Loan.ariveExtras.orgUnitId | Branch / channel | Loan | — | |
| Loan Origination Source | Loan.ariveExtras.loanCreatedFrom | Branch / channel | Loan | — | |
| Lead Source | Client.source | Lead-only | Lead | Free-text. Used by lead segmentation + cadence triggers. | |
| Lead Provided By | Client.ariveExtras.leadProvidedBy | Lead-only | Lead | — | |
| Other Lead Source Description | Client.ariveExtras.otherSourceDesc | Lead-only | Lead | — | |
| Buying Stage | Client.ariveExtras.homebuyingStage | Lead-only | Lead | — | |
| Email of Primary Lead Owner | Client.ariveExtras.assigneeEmail | Lead-only | Lead | Future: auto-route to matching Benji user by email. | |
| Qualifying Rate | Client.ariveExtras.qualifyingRate | Lead-only | Lead | — | |
| Desired Monthly Payment | Client.ariveExtras.desiredMonthlyPayment | Lead-only | Lead | — | |
| Estimated Monthly HOI | Client.ariveExtras.estimatedHOIMonthly | Lead-only | Lead | — | |
| Estimated Monthly Property Taxes | Client.ariveExtras.estimatedPropertyTaxesMonthly | Lead-only | Lead | — | |
| Estimated Monthly HOA | Client.ariveExtras.estimatedAssociationDuesMonthly | Lead-only | Lead | — | |
| Estimated Loan FICO | Client.ariveExtras.estimatedFICO | Lead-only | Lead | — | |
| Current Interest Rate (Refi) | Client.ariveExtras.currentInterestRateRefi | Lead-only | Lead | — | |
| Lead Property Type | Client.ariveExtras.propertyType | Lead-only | Lead | — | |
| Lead Property Usage | Client.ariveExtras.propertyUsageType | Lead-only | Lead | — | |
| Loan Created At (in Arive) | Loan.ariveCreatedAt | System | Loan | — | |
| Loan Updated At (in Arive) | Loan.ariveUpdatedAt | System | Loan | Drives the freshness monitor cron — when this is >24h old we alert the LO. |
APPLICATION_INTAKE → LOAN_FUNDED auto-mapped to Benji pipeline.
Appraisal, CD sent/signed, intent to proceed, estimated funding, and more.
Primary, co-borrower, listing agents, title, insurance, builders — all linked.
Still stuck?
Sign up to Benji and your Arive integration page will show a live sync log with raw payload inspection + replay — so any field-mapping question is one click from being answered.
Get started with BenjiBlue-bubble delivery for higher reply rates. Default for new accounts.
Bring your own Twilio number. Cheap, reliable, full deliverability controls.
One platform for SMS and the Power Dialer. Best for high-volume callers.
Recipes
Get started quickly with these popular automation recipes. Connect BENJI to the tools you already use.
Loan updates in Arive sync stages, dates, and borrower data to BENJI
View Setup GuideNew form submission creates a lead in BENJI automatically
View Setup GuideGet notified in Slack when a loan is funded or stage changes
View Setup GuideLog every new client or funded loan to a spreadsheet
View Setup GuideTurn Jotform submissions into BENJI leads via webhook
View Setup GuideSend custom emails on stage changes via Zapier or Make
View Setup GuideSetup Guides
Follow these guides to connect BENJI with your favorite tools. Most integrations take under 10 minutes to set up.
Sync loan data from Arive to your BENJI pipeline automatically
Trigger
ARIVE API → Get Loan Details
Action
Webhooks by Zapier → POST to BENJI sync endpoint
Generate API credentials in your Arive dashboard
Company Settings > Integrations > Generate. You'll get a Client ID, Secret Key, and API Key.
Accept Arive's private Zapier invite
Click "Copy Zapier Link" in Arive, open it in a new tab, and click "Accept Invite & Build Zap".
Enable Arive in BENJI and generate an API key
Settings > Integrations > Enable Arive, then Settings > API Keys > Create new key.
Create a Zap: trigger = ARIVE API > Get Loan Details
Search for "ARIVE API" in Zapier (it appears after accepting the invite). Authenticate with your Arive credentials.
Set the action: Webhooks by Zapier > POST
URL: https://www.benji.biz/api/integrations/arive/sync — Header: Authorization: Bearer benji_your_api_key
Test and turn on your Zap
Zapier will send a test payload. Verify it appears in BENJI, then enable the Zap.
Arive is a private Zapier app — you must use their invite link to access it.
See the full step-by-step guide with field mappings in the Arive section above.
Turn Typeform submissions into leads in your BENJI pipeline
Trigger
Typeform → New Entry
Action
Webhooks by Zapier → POST to BENJI leads endpoint
Create your lead capture form in Typeform
Include fields for first name, last name, email, and phone at minimum.
Generate a BENJI API key
In BENJI, go to Settings > API Keys and create a new webhook key.
Create a Zap with Typeform as the trigger
Trigger event: "New Entry". Connect your Typeform account and select the form.
Add Webhooks by Zapier as the action
Choose "POST" request. URL: https://www.benji.biz/api/webhooks/leads
Map Typeform fields to BENJI fields
Map: firstName, lastName, email, phone, source (set to "Typeform"). Add Authorization: Bearer benji_your_key as a header.
Test the Zap and turn it on
Submit a test response in Typeform and verify the lead appears in BENJI.
Get Slack notifications when key events happen in BENJI
Trigger
BENJI Outgoing Webhook → LOAN_FUNDED or LOAN_STAGE_CHANGED
Action
Slack → Send Channel Message
Set up an outgoing webhook in BENJI
Go to Settings > Outgoing Webhooks. Add your Zapier catch hook URL and subscribe to LOAN_FUNDED and/or LOAN_STAGE_CHANGED events.
Create a Zap with Webhooks by Zapier as the trigger
Choose "Catch Hook" to receive events from BENJI. Copy the webhook URL Zapier gives you.
Paste the Zapier URL into BENJI's outgoing webhook settings
BENJI will send event payloads to this URL whenever the subscribed events fire.
Add Slack as the action
Choose "Send Channel Message". Connect your Slack workspace and pick the channel (e.g., #loan-updates).
Format the Slack message
Use the BENJI payload fields: e.g., "🏠 Loan Funded! {{data.firstName}} {{data.lastName}} — ${{data.loanAmount}}"
Test and enable the Zap
Trigger a test event in BENJI and verify the message appears in Slack.
Automatically log new clients or funded loans to a spreadsheet
Trigger
BENJI Outgoing Webhook → CLIENT_CREATED or LOAN_FUNDED
Action
Google Sheets → Create Spreadsheet Row
Create a Google Sheet with column headers
Example columns: Date, First Name, Last Name, Email, Phone, Source, Loan Amount, Stage.
Set up a BENJI outgoing webhook
Go to Settings > Outgoing Webhooks. Subscribe to CLIENT_CREATED (for new leads) or LOAN_FUNDED (for closings).
Create a Zap: Webhooks by Zapier > Catch Hook
Copy the Zapier webhook URL and paste it as your BENJI outgoing webhook endpoint.
Add Google Sheets as the action
Choose "Create Spreadsheet Row". Connect your Google account and select the sheet.
Map BENJI fields to spreadsheet columns
Map data.firstName → First Name, data.lastName → Last Name, data.email → Email, etc.
Test and enable
Send a test event and verify a new row appears in your sheet.
Convert Jotform submissions into BENJI leads automatically
Trigger
Jotform → New Submission
Action
Webhooks by Zapier → POST to BENJI leads endpoint
Create your lead capture form in Jotform
Add fields for name, email, phone, and any mortgage-specific questions (loan purpose, property type, etc.).
Generate a BENJI API key
In BENJI, go to Settings > API Keys and create a new webhook key.
Create a Zap with Jotform as the trigger
Trigger event: "New Submission". Connect your Jotform account and select the form.
Add Webhooks by Zapier as the action
Choose "POST" request. URL: https://www.benji.biz/api/webhooks/leads
Map Jotform fields to BENJI fields
Map firstName, lastName, email, phone. Set source to "Jotform". Add Authorization: Bearer benji_your_key header.
Test and turn on
Submit a test entry in Jotform and verify the lead is created in BENJI.
You can also use Jotform's native webhook feature to POST directly to BENJI without Zapier.
Send automated emails when loan stages change
Trigger
BENJI Outgoing Webhook → LOAN_STAGE_CHANGED
Action
Gmail / Outlook / SMTP → Send Email
Set up a BENJI outgoing webhook for stage changes
Go to Settings > Outgoing Webhooks. Subscribe to the LOAN_STAGE_CHANGED event.
Create a Zap: Webhooks by Zapier > Catch Hook
Copy the Zapier webhook URL and add it as your BENJI outgoing webhook endpoint.
Add a Filter step (optional)
Filter to only trigger on specific stages, e.g., when stage equals "CLEAR_TO_CLOSE" or "FUNDED".
Add your email service as the action
Choose Gmail, Outlook, or SMTP by Zapier. Connect your email account.
Compose the email template
Use BENJI payload data: To: {{data.email}}, Subject: "Loan Update — {{data.newStage}}", Body: personalized message with loan details.
Test and enable
Trigger a stage change in BENJI and verify the email is sent correctly.
For high volume, consider using a transactional email service like SendGrid or Postmark instead of Gmail.
BENJI also has built-in marketing email templates under the Marketing tab.
Push leads to BENJI from any source
Endpoint
https://www.benji.biz/api/webhooks/leadsAuthentication
Authorization: Bearer benji_xxxxxxxxxxxxIf your platform cannot send headers, append ?key=benji_xxxxxxxxxxxx to the lead URL instead. The header wins when both are present.
A key in a URL is weaker than a key in a header — it can appear in proxy and referrer logs. Use a dedicated key for that integration so it can be revoked on its own.
Rate Limit
30 requests per minute per API key
Request Body Fields
| Field | Type | Required | Description |
|---|---|---|---|
firstName | string | Required | Lead's first name |
lastName | string | Required | Lead's last name |
email | string | Optional | Email address |
phone | string | Optional | Phone number |
address | string | Optional | Street address |
city | string | Optional | City |
state | string | Optional | State (e.g., CA, TX) |
zip | string | Optional | ZIP code |
source | string | Optional | Lead source (e.g., "Zillow", "Realtor.com") |
annualIncome | number | Optional | Gross annual income |
monthlyDebts | number | Optional | Total monthly debt payments |
totalAssets | number | Optional | Total liquid assets |
creditScoreRange | string | Optional | "SCORE_760_PLUS", "SCORE_740_759", "SCORE_720_739", "SCORE_700_719", "SCORE_680_699", "SCORE_660_679", "SCORE_640_659", "SCORE_620_639", "SCORE_600_619", "BELOW_600", "UNKNOWN" |
employmentType | string | Optional | "W2_EMPLOYEE", "SELF_EMPLOYED", "RETIRED", "OTHER" |
loan | object | Optional | Optional nested Loan block — include to create a Client + Loan in one call. The record is then a CLIENT (not a lead) with the loan defaulting to APPLICATION stage. See Settings → Field reference for the full Loan field list. |
notes | string | Optional | Free-text note attached to the lead on creation. `message` and `comments` accepted as aliases. |
tcpaConsent | boolean | Optional | Send `true` when the lead affirmatively agreed to a texting disclosure on your form (a TCPA checkbox). Recorded as EXPRESS_WRITTEN consent. Aliases accepted: tcpa_consent, sms_consent, consent, opt_in. Omit it and the lead is recorded as IMPLIED_INQUIRY (established business relationship). |
consentText | string | Optional | The exact disclosure wording the lead agreed to. Stored as the proof for express consent. Aliases: consent_text, tcpa_disclosure, disclosure. |
metadata | object | Optional | Custom key-value pairs for extra data |
Landing Page Integration Guide
Live docs covering Meta Lead Ads, Zapier, Make, custom forms, and outgoing webhooks.
Success Response
{
"success": true,
"clientId": "clxxxxxxxxxxxxxxxxx",
"message": "Lead \"Jane Doe\" created successfully",
"pipelineStage": "LEAD",
"leadDisposition": "NEW"
}When you include a loan block, loanIdreturns the new loan's id and the record is treated as a client (pipelineStage defaults to APPLICATION).
Related endpoints
/api/webhooks/clients/:id/statusUpdate the legacy client-level pipeline stage. Fires cadence + AI-SMS exit checks.
/api/webhooks/clients/:id/dispositionSet a lead disposition. Body: { systemKey: 'NOT_INTERESTED' } for built-ins OR { dispositionId: 'ldo_…' } for team customs. Optional `note`.
/api/webhooks/stripeInbound from Stripe. Verifies the stripe-signature header against STRIPE_WEBHOOK_SECRET, syncs the user's subscriptionTier + subscriptionStatus on customer.subscription.* and invoice.payment_* events. Configure in Stripe Dashboard → Developers → Webhooks.
Get real-time events pushed to your endpoints
Available Events
| Event | Description |
|---|---|
CLIENT_CREATED | Fired when a new client/lead is added — in-app, via funnel, OR via the incoming leads API (POST /api/webhooks/leads, any API key on the account). API-sourced leads include `origin: "api_webhook"` + `apiKeyLabel` so you can tell them apart. Team-scoped webhooks fire for every lead that lands on the team regardless of which key created it. |
LOAN_STAGE_CHANGED | Fired when a loan moves to a new pipeline stage |
LOAN_FUNDED | Fired when a loan is marked as funded |
CLIENT_UPDATED | Fired when client details are modified. Payload includes a `change` field — "status_changed" for /status updates, "disposition_changed" for /disposition updates, or omitted for generic edits. |
DOCUMENT_UPLOADED | Fired when a document is uploaded for a client |
DISPOSITION_CHANGED | Fired when a lead's disposition changes (in-app or via POST /disposition). Payload: clientId, phone, email, dispositionSystemKey (null for custom dispositions — use label/dispositionId to identify those), label, dispositionId, optedOut (true when the borrower is opted out of calls/texts — DNC or SMS/voice opt-out), plus the top-level timestamp. |
Payload Format
{
"event": "CLIENT_CREATED",
"timestamp": "2025-06-15T14:30:00.000Z",
"data": {
"clientId": "clxxxxxxxxxxxxxxxxx",
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@example.com",
"phone": "+15551234567",
"status": "LEAD",
"source": "Website Form",
"leadDisposition": "NEW",
// Present only for leads created via POST /api/webhooks/leads:
"origin": "api_webhook",
"apiKeyLabel": "Partner — Acme Leads"
}
}HMAC Signature Verification
Every outgoing webhook request includes an X-Benji-Signature header. Verify it to ensure the request came from BENJI.
How to verify
// 1. Compute the HMAC-SHA256 of the raw request body
signature = HMAC-SHA256(your_webhook_secret, rawRequestBody)
// 2. Compare with the header value (strip the "sha256=" prefix)
headerSignature = request.headers["X-Benji-Signature"]
expected = headerSignature.replace("sha256=", "")
// 3. Use a timing-safe comparison
isValid = timingSafeEqual(signature, expected)Auto-Disable
Webhooks are automatically disabled after 10 consecutive delivery failures. You can re-enable them in your settings after fixing the endpoint issue.
Setup
Configure your outgoing webhook URL and secret in Settings → Outgoing Webhooks. Select which events to subscribe to and BENJI will send events in real time.
Developer Friendly
Start sending leads to BENJI in minutes. Pick your language and paste the code.
curl -X POST https://www.benji.biz/api/webhooks/leads \
-H "Authorization: Bearer benji_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@example.com",
"phone": "555-0123",
"source": "Website Form"
}'