#3ddc84Benji
INTEGRATIONS

Plays nice with your stack.

Meta Lead Ads → Benji in 5 minutes. Native Arive LOS sync. Open API with signed outgoing webhooks for every event. Most LOs are wired up before lunch.

Connect your stack →Meta Lead AdsArive setupRead the guide →
INTEGRATIONS

Plays nice with your stack.

From your LOS to your phone, your inbox, your calendar — Benji connects to the tools loan officers actually use.

A
Arive
C
Calendly
T
Twilio
A
Aloware
B
Blooio
G
Google
S
Stripe
Z
Zapier
Works standalone · Native Arive sync (optional) · Open API · Incoming + outgoing webhooks · BYO SMS
ARIVE LOS ↔ BENJI · LIVE
SOURCE
Arive LOS
LOS_PROD
SYNCED
Benji CRM
benji.biz
// FIELDS_SYNCING
loan.stageUnderwriting → Approved
borrower.emailmartinez@example.com
key_dates.lock_expiry2026-05-14
amount.principal$485,000
OPTIONAL — ARIVE LOS SYNC

Use Arive? Your LOS and CRM,
finally talking.

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.

Two-way sync — changes propagate either direction
Stage changes trigger AI nurture sequences
Audit trail for every synced field
Compliance-aware — TILA/RESPA timestamps preserved
ARIVE SETUP

Connect Arive in five steps.

Native Integration

Connect Arive LOS to Benji

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.

  1. STEP 01

    Generate your Zapier credentials inside Arive

    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 ID
    • Secret Key
    • API Key

    Available on Broker Pro and Non-Del plans.

  2. STEP 02

    Accept Arive's private Zapier invite

    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.

  3. STEP 03

    Get your Benji webhook URL

    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.

  4. STEP 04

    Build the 5 canonical Zaps (templates below)

    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:

    • URL: your Benji webhook URL (copy from Step 3)
    • Method: POST
    • Payload type: JSON
    • Data: the JSON body shown in the template

    You don't have to build all 5 — start with #1 (New Loan) and add the others as you need them.

  5. STEP 05

    Test each Zap with Arive's sample data

    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.

  6. STEP 06

    (Optional) Add HMAC signature verification

    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.

  7. STEP 07

    You're live — every Arive event now flows into Benji

    Subsequent loan/lead events upsert by sysGUID — Benji finds the matching row and updates it. No manual linking.

    • • Pipeline stage auto-advances on every stage change
    • • 30+ key dates flow into the loan timeline
    • • Business contacts (agents, title, insurance) auto-create as referral partners
    • • DNC / email / SMS opt-out flags from Arive prevent cadence sends
    • • Click Open in Arive on any loan to jump back via deep link

Zap library — every Zap, every step

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.

Field reference — Arive → Benji

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 keyLabelLands in BenjiCategoryEntityNotes
ARIVE System GUIDLoan.ariveSysGUID / Client.ariveLeadSysGUIDIdentifierBothStable join key. Same value across every trigger for the same record — drives idempotent upsert.
ARIVE Display Loan IDLoan.ariveLoanIdIdentifierLoanHuman-readable. Shown next to loan number on pipeline cards + /loans table.
ARIVE Display Lead IDClient.ariveLeadIdIdentifierLead
CRM Reference IdLoan.ariveExtras.crmReferenceId / Client.ariveExtras.crmReferenceIdIdentifierBothRound-trip key — if you set Benji's id back in Arive, we preserve it on subsequent syncs.
Deep Link URLLoan.ariveDeepLink / Client.ariveLeadDeepLinkIdentifierBothPowers the ↗ icon that opens the record back in Arive.
Lead Id (if loan was converted from a lead)Used to match existing Client by leadIdentifierLoanWhen 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 / statusLoan15 Arive stages map to Benji's PipelineStage enum. Fuzzy matcher handles UPPER_CASE, Title Case, and hyphenated variants.
Status DateLoan.stageUpdatedAtStage / statusLoanWhen Arive recorded the stage move. Drives the 'days in stage' display.
Adverse ReasonLoan.adverseReasonStage / statusLoanRequired when stage is ADVERSE / SUSPENDED. Surfaces as a red banner on the loan detail page.
Loan Archive IndicatorLoan.archived (boolean)Stage / statusLoan
Loan Archive DateLoan.archivedAtStage / statusLoan
Lead StatusClient.ariveExtras.leadStatusStage / statusLeadSurfaced in the Arive details panel; not yet mapped to a typed Benji disposition.
Base Loan AmountLoan.loanAmount (fallback if totalLoanAmount missing)MoneyBoth
Total Loan AmountLoan.loanAmountMoneyLoan
Property Value / Sales PriceLoan.purchasePrice (fallback if subjectProperty_salesContractAmt missing)MoneyBoth
Purchase PriceLoan.purchasePriceMoneyLoan
Down PaymentLoan.downPaymentMoneyLoan
Note RateLoan.interestRateMoneyBothStored as percent (e.g. 6.875).
LTV RatioLoan.ltvMoneyLoan
Combined LTV RatioLoan.cltvMoneyLoan
HCLTV RatioLoan.ariveExtras.hcltvMoneyLoan
FrontEnd DTILoan.frontEndDTIMoneyLoan
BackEnd DTILoan.backEndDTIMoneyLoan
Estimated Cash To CloseLoan.ariveExtras.estCashToCloseMoneyLoan
Discount PointsLoan.discountPointsMoneyLoan
Earnest Money DepositLoan.earnestMoneyDepositMoneyLoan
Seller CreditLoan.sellerCreditMoneyLoan
Total Concession AmountLoan.totalConcessionAmtMoneyLoan
Financed FeesLoan.ariveExtras.financedFeesMoneyLoan
Broker FeesLoan.ariveExtras.brokerFeeMoneyLoan
Credit Report FeeLoan.ariveExtras.CreditReportFeeMoneyLoan
ReimbursementsLoan.ariveExtras.reimbursementsMoneyLoan
Tolerance CuresLoan.ariveExtras.toleranceCuresMoneyLoan
Total PITILoan.monthlyPITIMoneyLoan
Principal, Interest and MILoan.ariveExtras.principalInterestAndPMIMoneyLoan
Monthly P&ILoan.monthlyPIMoneyLoan
Monthly Homeowners InsuranceLoan.monthlyHOIMoneyLoan
Monthly Real Estate TaxLoan.monthlyPropertyTaxMoneyLoan
Monthly MI PremiumLoan.monthlyMIMoneyLoan
Monthly HOA DuesLoan.monthlyHOAMoneyLoan
Monthly Flood InsuranceLoan.monthlyFloodInsMoneyLoan
Loan PurposeLoan.loanPurpose (mapped)TermsBothPURCHASE / REFINANCE_RATE_TERM / REFINANCE_CASH_OUT.
Refinance TypeLoan.ariveExtras.refinanceTypeTermsLoan
Cashout PurposeLoan.ariveExtras.cashoutPurposeTermsLoan
Mortgage TypeLoan.loanType (mapped)TermsBothFHA / VA / DSCR / NON_QM / etc. — mapped to Benji's LoanType enum.
Amortization TypeLoan.amortizationTypeTermsLoan
Amortization TermLoan.amortizationTermTermsLoan
Loan TermLoan.loanTermMonthsTermsLoan
Lien Priority TypeLoan.lienPositionTermsLoan
Interest Only IndicatorLoan.ariveExtras.interestOnlyIndTermsLoan
Interest Only Term MonthsLoan.ariveExtras.interestOnlyTermMonthsCountTermsLoan
Initial Fixed PeriodLoan.ariveExtras.initialFixedPeriodEffectiveMonthsCountTermsLoan
Normal Rate Adjustment PeriodLoan.ariveExtras.normalRateAdjustmentPeriodTermsLoan
Alternate Doc LoanLoan.documentationTypeTermsLoan
BuydownLoan.ariveExtras.buyDownTermsLoan
Escrow Impound TypeLoan.ariveExtras.impoundWaiverTermsLoan
Pre-Pay PenaltyLoan.prepayPenaltyTermsLoanNONE / SOFT / HARD / OTHER. Shown in the loan detail Prepayment Penalty section when not NONE.
Pre-Pay Penalty TermLoan.prepayPenaltyTermTermsLoan
Pre-Pay Penalty AmountLoan.prepayPenaltyAmountTermsLoan
Rate Lock StatusLoan.rateLockStatusLockLoanLOCKED / FLOAT / EXPIRED / EXTENDED — normalized.
Rate Lock DateLoan.rateLockDateLockLoan
Lock Expiry DateLoan.rateLockExpiryLockLoan
Subject Property Street AddressLoan.propertyAddress (composed)PropertyLoanAll subject property address fields concatenate into a single propertyAddress string for display.
Subject Property UnitLoan.propertyAddress (composed)PropertyLoan
Subject Property CityLoan.propertyAddress (composed)PropertyLoan
Subject Property CountyLoan.ariveExtras.subjectProperty_countyPropertyLoan
Subject Property StateLoan.propertyAddress (composed)PropertyBoth
Subject Property Postal CodeLoan.propertyAddress (composed)PropertyBoth
Property TypeLoan.ariveExtras.subjectProperty_housingTypePropertyLoan
OccupancyLoan.occupancyType (mapped)PropertyBothPRIMARY_RESIDENCE / SECOND_HOME / INVESTMENT_PROPERTY.
Number of UnitsLoan.ariveExtras.subjectProperty_financedUnitCountPropertyLoan
Attachment TypeLoan.ariveExtras.subjectProperty_attachmentTypePropertyLoan
TBD IndicatorLoan.ariveExtras.subjectTBDIndicatorPropertyBothTrue when subject property is To Be Determined (pre-qualification shopping).
Lender NameLoan.lenderLenderLoan
Lender NMLSLoan.lenderNMLSLenderLoan
Lender Loan NumberLoan.loanNumberLenderLoanTreated as the canonical loan #. Surfaces on pipeline cards + /loans table.
Lender Product NameLoan.lenderProductNameLenderLoan
MERS Number For Non DelLoan.mersNumberLenderLoan
First NameClient.firstNameBorrowerLoanPRIMARY borrower from Arive's flattened Zapier output. loanBorrower2_* for co-borrower. Plural loanBorrowers_firstName also accepted (legacy).
Last NameClient.lastNameBorrowerLoan
Nick NameClient.nickNameBorrowerLoan
EmailClient.emailBorrowerLoan
PhoneClient.phone (E.164 normalized)BorrowerLoan
Work PhoneClient.workPhoneBorrowerLoan
Home PhoneClient.homePhoneBorrowerLoan
Applicant TypeUsed to pick primary borrowerBorrowerLoanBORROWER vs CO_BORROWER — we pick BORROWER with sequence 1 as primary.
Borrower Pair App SequenceUsed to pick primary borrowerBorrowerLoan
Marital StatusClient.maritalStatusBorrowerLoan
Day of BirthClient.dobDayBorrowerLoan
Month of BirthClient.dobMonthBorrowerLoanYear intentionally not captured.
Preferred LanguagesClient.preferredLanguageBorrowerLoan
First Time Home Buyer IndicatorClient.firstTimeHomeBuyerBorrowerBothDrives FTHB cadence segmentation.
Street AddressClient.addressBorrowerLoan
Address CityClient.cityBorrowerLoan
Address StateClient.stateBorrowerLoan
Address Postal CodeClient.zipBorrowerLoan
POS Application Submission DateLoan.ariveExtras.loanBorrowers_posAppSubmissionDateBorrowerLoan
Lead borrower first nameClient.firstNameBorrowerLead
Lead borrower last nameClient.lastNameBorrowerLead
Lead borrower emailClient.emailBorrowerLead
Lead borrower mobileClient.phone (E.164)BorrowerLead
Lead borrower DOB dayClient.dobDayBorrowerLead
Lead borrower DOB monthClient.dobMonthBorrowerLead
Lead borrower streetClient.addressBorrowerLead
Lead borrower cityClient.cityBorrowerLead
Lead borrower stateClient.stateBorrowerLead
Lead borrower zipClient.zipBorrowerLead
Employment typeClient.ariveExtras.borrower_employmentTypeBorrowerLead
Has co-borrowerClient.hasCoBorrowerBorrowerLead
Has real estateClient.ariveExtras.borrower_hasRealEstateBorrowerLead
Annual incomeClient.annualIncomeBorrowerLead
Military serviceClient.militaryServiceTypeBorrowerLeadVA loan eligibility.
Total monthly incomeClient.ariveExtras.borrower_totalMonthlyIncomeBorrowerLead
First-time homebuyerClient.firstTimeHomeBuyerBorrowerLead
Years since foreclosureClient.ariveExtras.borrower_yearsSinceForeclosureBorrowerLead
Years since bankruptcyClient.ariveExtras.borrower_yearsSinceBankruptcyBorrowerLead
Currently owns homeClient.ariveExtras.borrower_currentlyOwningAHomeBorrowerLead
Selling before buyingClient.ariveExtras.borrower_planningToSellItBeforeBuyingBorrowerLead
Total monthly liabilityClient.monthlyDebtsBorrowerLead
Residency basis typeClient.ariveExtras.borrower_occupancyBorrowerLead
Address duration monthsClient.ariveExtras.borrower_durationMonthsCountBorrowerLead
Co-borrower first nameClient.coBorrowerFirstNameCo-borrowerLead
Co-borrower last nameClient.coBorrowerLastNameCo-borrowerLead
Co-borrower emailClient.coBorrowerEmailCo-borrowerLead
Co-borrower DOB dayClient.ariveExtras.coBorrower_dayOfBirthCo-borrowerLead
Co-borrower DOB monthClient.ariveExtras.coBorrower_monthOfBirthCo-borrowerLead
Co-borrower cellClient.coBorrowerPhoneCo-borrowerLead
Co-borrower militaryClient.ariveExtras.coBorrower_militaryServiceTypeCo-borrowerLead
Employer NameClient.employer (when primary)EmploymentLoan
Position DescriptionLoan.ariveExtras.employment_positionDescEmploymentLoan
Monthly IncomeLoan.ariveExtras.employment_monthlyIncomeEmploymentLoan
Employer PhoneLoan.ariveExtras.employment_employerPhoneEmploymentLoan
Classification TypeLoan.ariveExtras.employment_classificationTypeEmploymentLoan
Start DateLoan.ariveExtras.employment_startDateEmploymentLoan
End DateLoan.ariveExtras.employment_endDateEmploymentLoan
Self-Employed IndicatorLoan.ariveExtras.employment_selfEmployedIndEmploymentLoan
Is Primary BorrowerLoan.ariveExtras.employment_isPrimaryBorrowerEmploymentLoan
Appraisal Contingency DateLoan.keyDates.appraisalContingencyKey datesLoan
Appraisal Delivery DateLoan.keyDates.appraisalDeliveryDateKey datesLoan
Appraisal Ordered DateLoan.keyDates.appraisalOrderedDateKey datesLoan
Closing Contingency / Est. ClosingLoan.keyDates.closingContingencyKey datesLoan
Date To Avoid EPOLoan.keyDates.dateToAvoidEPOKey datesLoan
Est. First Payment DateLoan.keyDates.estFirstPaymentDateKey datesLoan
First Payment DateLoan.keyDates.firstPaymentDateKey datesLoan
HOI Ordered DateLoan.keyDates.hoiOrderedDateKey datesLoan
HOI Received DateLoan.keyDates.hoiReceivedDateKey datesLoan
Initial CD Sent DateLoan.keyDates.initialCDSentDateKey datesLoan
Initial CD Signed DateLoan.keyDates.initialCDSignedDateKey datesLoan
Initial LE Sent DateLoan.keyDates.initialLESentDateKey datesLoan
Initial LE Signed DateLoan.keyDates.initialLESignedDateKey datesLoan
Intent To Proceed DateLoan.keyDates.intentToProceedDateKey datesLoan
Loan Contingency DateLoan.keyDates.loanContingencyKey datesLoan
Most Recent CD Sent DateLoan.keyDates.mostRecentCDSentDateKey datesLoan
Most Recent CD Signed DateLoan.keyDates.mostRecentCDSignedDateKey datesLoan
Most Recent LE Sent DateLoan.keyDates.mostRecentLESentDateKey datesLoan
Most Recent LE Signed DateLoan.keyDates.mostRecentLESignedDateKey datesLoan
Pre-Qualification Expiry DateLoan.keyDates.preApprovalExpiryDateKey datesLoan
Tax Transcript Ordered DateLoan.keyDates.taxTranscriptOrderedDateKey datesLoan
Tax Transcript Received DateLoan.keyDates.taxTranscriptReceivedDateKey datesLoan
Title Ordered DateLoan.keyDates.titleOrderedDateKey datesLoan
Title Received DateLoan.keyDates.titleReceivedDateKey datesLoan
TRID DateLoan.keyDates.tridDateKey datesLoan
Credit Order DateLoan.keyDates.creditOrderDateKey datesLoan
Credit Import DateLoan.keyDates.creditImportDateKey datesLoan
Credit Expiration DateLoan.keyDates.creditExpirationDateKey datesLoan
Estimated Funding DateLoan.keyDates.estimatedFundingDateKey datesLoan
Sales Contract DateLoan.keyDates.salesContractDateKey datesLoan
Contact First NameReferralPartner.name (composed)Business contactLoan
Contact Last NameReferralPartner.name (composed)Business contactLoan
Contact EmailReferralPartner.emailBusiness contactLoanUsed to dedupe — existing partner with same email gets updated, otherwise created.
Contact PhoneReferralPartner.phoneBusiness contactLoan
Contact RoleReferralPartner.type (mapped)Business contactLoanLISTING_AGENT / BUYERS_AGENT / TITLE / INSURANCE etc. mapped to Benji's ReferralPartnerType.
Company NameReferralPartner.companyBusiness contactLoan
Company StreetReferralPartner.officeAddress (composed)Business contactLoan
Company CityReferralPartner.officeAddress (composed)Business contactLoan
Company StateReferralPartner.officeAddress (composed)Business contactLoan
Company ZipReferralPartner.officeAddress (composed)Business contactLoan
Disposition Status TypeLoan.ariveExtras.reoInfo (full object)REOLoanAll REO_Info fields preserved in ariveExtras as a sub-object.
REO Current Market ValueLoan.ariveExtras.reoInfo.currentMarketValueREOLoan
REO Net Rental IncomeLoan.ariveExtras.reoInfo.netRentalIncomeREOLoan
REO Property TypeLoan.ariveExtras.reoInfo.propertyTypeREOLoan
REO Street AddressLoan.ariveExtras.reoInfo.streetAddressREOLoan
REO OwnersLoan.ariveExtras.reoInfo.ownersREOLoan
DNC RequestClient.ariveDoNotContactComplianceLeadHARD-ENFORCED on every outbound: cadence cron, manual SMS, milestone emails.
Email Opt-outClient.ariveEmailOptOutComplianceLeadBlocks cadence emails + manual prequal email + rate sheet email.
SMS Opt-outClient.ariveSmsOptOutComplianceLeadBlocks cadence SMS + manual SMS.
CompensationLoan.compensationAmountCompensationLoan
Compensation TypeLoan.compensationTypeCompensationLoanBORROWER_PAID / LENDER_PAID.
Gross Loan RevenueLoan.grossLoanRevenueCompensationLoan
Net Loan RevenueLoan.netLoanRevenueCompensationLoan
Industry ChannelLoan.industryChannelBranch / channelLoan
Branch Display NameLoan.branchNameBranch / channelLoan
Loan Branch UUIDLoan.ariveExtras.orgUnitIdBranch / channelLoan
Loan Origination SourceLoan.ariveExtras.loanCreatedFromBranch / channelLoan
Lead SourceClient.sourceLead-onlyLeadFree-text. Used by lead segmentation + cadence triggers.
Lead Provided ByClient.ariveExtras.leadProvidedByLead-onlyLead
Other Lead Source DescriptionClient.ariveExtras.otherSourceDescLead-onlyLead
Buying StageClient.ariveExtras.homebuyingStageLead-onlyLead
Email of Primary Lead OwnerClient.ariveExtras.assigneeEmailLead-onlyLeadFuture: auto-route to matching Benji user by email.
Qualifying RateClient.ariveExtras.qualifyingRateLead-onlyLead
Desired Monthly PaymentClient.ariveExtras.desiredMonthlyPaymentLead-onlyLead
Estimated Monthly HOIClient.ariveExtras.estimatedHOIMonthlyLead-onlyLead
Estimated Monthly Property TaxesClient.ariveExtras.estimatedPropertyTaxesMonthlyLead-onlyLead
Estimated Monthly HOAClient.ariveExtras.estimatedAssociationDuesMonthlyLead-onlyLead
Estimated Loan FICOClient.ariveExtras.estimatedFICOLead-onlyLead
Current Interest Rate (Refi)Client.ariveExtras.currentInterestRateRefiLead-onlyLead
Lead Property TypeClient.ariveExtras.propertyTypeLead-onlyLead
Lead Property UsageClient.ariveExtras.propertyUsageTypeLead-onlyLead
Loan Created At (in Arive)Loan.ariveCreatedAtSystemLoan
Loan Updated At (in Arive)Loan.ariveUpdatedAtSystemLoanDrives the freshness monitor cron — when this is >24h old we alert the LO.

All 15 loan stages

APPLICATION_INTAKE → LOAN_FUNDED auto-mapped to Benji pipeline.

30+ key dates

Appraisal, CD sent/signed, intent to proceed, estimated funding, and more.

Borrowers + partners

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 Benji
META LEAD ADS

Facebook lead form → Benji in 5 min.

Every lead from your Facebook + Instagram lead ads lands in your Benji pipeline within seconds of submission. If AI SMS nurturing is on, Benji texts the lead first — typically before competitors' rate-shop platforms have even noticed.

  1. In Benji Settings → Integrations, generate an API key labeled "Zapier".
  2. In Zapier, pick the Facebook Lead Ads trigger, connect your ad account, choose your Page + Lead Form.
  3. Add a Webhooks by Zapier — POST action. URL is your Benji webhook endpoint; payload is JSON with the field mapping below. Bearer auth in the headers.
  4. Test, then publish. New leads flow in immediately.
Full step-by-step →Sign up to connect
META → BENJI · FIELD MAP
{
  "firstName": "{{First Name}}",
  "lastName":  "{{Last Name}}",
  "email":     "{{Email}}",
  "phone":     "{{Phone Number}}",
  "source":    "Facebook Lead Ads — {{Ad Name}}",
  "notes":     "{{Comments}}",
  "metadata": {
    "fb_lead_id":     "{{Lead ID}}",
    "fb_form_id":     "{{Form ID}}",
    "fb_campaign_id": "{{Campaign ID}}"
  }
}
SMS PROVIDERS — CHOOSE ONE

Pick your SMS backbone.

You can only choose ONE provider at a time. Benji sends every text through the one rail you pick. Switching is one click — message history is preserved.
iMessage-first

Blooio

Blue-bubble delivery for higher reply rates. Default for new accounts.

Industry standard

Twilio

Bring your own Twilio number. Cheap, reliable, full deliverability controls.

Dialer + SMS

Aloware

One platform for SMS and the Power Dialer. Best for high-volume callers.

Compare providers & setup guides →
RECIPES

Common workflows, pre-built.

Setup Guides

Step-by-Step Recipe Guides

Follow these guides to connect BENJI with your favorite tools. Most integrations take under 10 minutes to set up.

Arive LOS → BENJI

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

1

Generate API credentials in your Arive dashboard

Company Settings > Integrations > Generate. You'll get a Client ID, Secret Key, and API Key.

2

Accept Arive's private Zapier invite

Click "Copy Zapier Link" in Arive, open it in a new tab, and click "Accept Invite & Build Zap".

3

Enable Arive in BENJI and generate an API key

Settings > Integrations > Enable Arive, then Settings > API Keys > Create new key.

4

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.

5

Set the action: Webhooks by Zapier > POST

URL: https://www.benji.biz/api/integrations/arive/sync — Header: Authorization: Bearer benji_your_api_key

6

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.

Typeform → BENJI

Turn Typeform submissions into leads in your BENJI pipeline

Trigger

Typeform → New Entry

Action

Webhooks by Zapier → POST to BENJI leads endpoint

1

Create your lead capture form in Typeform

Include fields for first name, last name, email, and phone at minimum.

2

Generate a BENJI API key

In BENJI, go to Settings > API Keys and create a new webhook key.

3

Create a Zap with Typeform as the trigger

Trigger event: "New Entry". Connect your Typeform account and select the form.

4

Add Webhooks by Zapier as the action

Choose "POST" request. URL: https://www.benji.biz/api/webhooks/leads

5

Map Typeform fields to BENJI fields

Map: firstName, lastName, email, phone, source (set to "Typeform"). Add Authorization: Bearer benji_your_key as a header.

6

Test the Zap and turn it on

Submit a test response in Typeform and verify the lead appears in BENJI.

BENJI → Slack

Get Slack notifications when key events happen in BENJI

Trigger

BENJI Outgoing Webhook → LOAN_FUNDED or LOAN_STAGE_CHANGED

Action

Slack → Send Channel Message

1

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.

2

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.

3

Paste the Zapier URL into BENJI's outgoing webhook settings

BENJI will send event payloads to this URL whenever the subscribed events fire.

4

Add Slack as the action

Choose "Send Channel Message". Connect your Slack workspace and pick the channel (e.g., #loan-updates).

5

Format the Slack message

Use the BENJI payload fields: e.g., "🏠 Loan Funded! {{data.firstName}} {{data.lastName}} — ${{data.loanAmount}}"

6

Test and enable the Zap

Trigger a test event in BENJI and verify the message appears in Slack.

BENJI → Google Sheets

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

1

Create a Google Sheet with column headers

Example columns: Date, First Name, Last Name, Email, Phone, Source, Loan Amount, Stage.

2

Set up a BENJI outgoing webhook

Go to Settings > Outgoing Webhooks. Subscribe to CLIENT_CREATED (for new leads) or LOAN_FUNDED (for closings).

3

Create a Zap: Webhooks by Zapier > Catch Hook

Copy the Zapier webhook URL and paste it as your BENJI outgoing webhook endpoint.

4

Add Google Sheets as the action

Choose "Create Spreadsheet Row". Connect your Google account and select the sheet.

5

Map BENJI fields to spreadsheet columns

Map data.firstName → First Name, data.lastName → Last Name, data.email → Email, etc.

6

Test and enable

Send a test event and verify a new row appears in your sheet.

Jotform → BENJI

Convert Jotform submissions into BENJI leads automatically

Trigger

Jotform → New Submission

Action

Webhooks by Zapier → POST to BENJI leads endpoint

1

Create your lead capture form in Jotform

Add fields for name, email, phone, and any mortgage-specific questions (loan purpose, property type, etc.).

2

Generate a BENJI API key

In BENJI, go to Settings > API Keys and create a new webhook key.

3

Create a Zap with Jotform as the trigger

Trigger event: "New Submission". Connect your Jotform account and select the form.

4

Add Webhooks by Zapier as the action

Choose "POST" request. URL: https://www.benji.biz/api/webhooks/leads

5

Map Jotform fields to BENJI fields

Map firstName, lastName, email, phone. Set source to "Jotform". Add Authorization: Bearer benji_your_key header.

6

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.

BENJI → Email

Send automated emails when loan stages change

Trigger

BENJI Outgoing Webhook → LOAN_STAGE_CHANGED

Action

Gmail / Outlook / SMTP → Send Email

1

Set up a BENJI outgoing webhook for stage changes

Go to Settings > Outgoing Webhooks. Subscribe to the LOAN_STAGE_CHANGED event.

2

Create a Zap: Webhooks by Zapier > Catch Hook

Copy the Zapier webhook URL and add it as your BENJI outgoing webhook endpoint.

3

Add a Filter step (optional)

Filter to only trigger on specific stages, e.g., when stage equals "CLEAR_TO_CLOSE" or "FUNDED".

4

Add your email service as the action

Choose Gmail, Outlook, or SMTP by Zapier. Connect your email account.

5

Compose the email template

Use BENJI payload data: To: {{data.email}}, Subject: "Loan Update — {{data.newStage}}", Body: personalized message with loan details.

6

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.

INCOMING WEBHOOKS

Push leads in from anywhere.

Incoming Webhooks

Push leads to BENJI from any source

Endpoint

POSThttps://www.benji.biz/api/webhooks/leads

Authentication

Authorization: Bearer benji_xxxxxxxxxxxx

If 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

FieldTypeRequiredDescription
firstNamestringRequiredLead's first name
lastNamestringRequiredLead's last name
emailstringOptionalEmail address
phonestringOptionalPhone number
addressstringOptionalStreet address
citystringOptionalCity
statestringOptionalState (e.g., CA, TX)
zipstringOptionalZIP code
sourcestringOptionalLead source (e.g., "Zillow", "Realtor.com")
annualIncomenumberOptionalGross annual income
monthlyDebtsnumberOptionalTotal monthly debt payments
totalAssetsnumberOptionalTotal liquid assets
creditScoreRangestringOptional"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"
employmentTypestringOptional"W2_EMPLOYEE", "SELF_EMPLOYED", "RETIRED", "OTHER"
loanobjectOptionalOptional 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.
notesstringOptionalFree-text note attached to the lead on creation. `message` and `comments` accepted as aliases.
tcpaConsentbooleanOptionalSend `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).
consentTextstringOptionalThe exact disclosure wording the lead agreed to. Stored as the proof for express consent. Aliases: consent_text, tcpa_disclosure, disclosure.
metadataobjectOptionalCustom key-value pairs for extra data

Landing Page Integration Guide

Live docs covering Meta Lead Ads, Zapier, Make, custom forms, and outgoing webhooks.

Read the guide

Success Response

201Created
{
  "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

POST/api/webhooks/clients/:id/status

Update the legacy client-level pipeline stage. Fires cadence + AI-SMS exit checks.

POST/api/webhooks/clients/:id/disposition

Set a lead disposition. Body: { systemKey: 'NOT_INTERESTED' } for built-ins OR { dispositionId: 'ldo_…' } for team customs. Optional `note`.

POST/api/webhooks/stripe

Inbound 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.

OUTGOING WEBHOOKS

Subscribe to every event.

Outgoing Webhooks

Get real-time events pushed to your endpoints

Available Events

EventDescription
CLIENT_CREATEDFired 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_CHANGEDFired when a loan moves to a new pipeline stage
LOAN_FUNDEDFired when a loan is marked as funded
CLIENT_UPDATEDFired 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_UPLOADEDFired when a document is uploaded for a client
DISPOSITION_CHANGEDFired 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.

CODE

Copy-paste examples.

Developer Friendly

Quick Start Examples

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"
  }'

A best friend that helps you
close more loans.

Join 3,800+ loan officers who trust Benji to manage clients, track the market, and grow their business — like a best friend who never sleeps.

Start free — no card →Book a demo
14-day free trial · Cancel anytime · NMLS-compliant