Connected tools · Manual setup

Phone intelligence for HighLevel contacts.

Choose phone data, messaging apps, or both. Keep control of spending and recover a saved result when a contact update fails.

HighLevel: Select a contact → Run phone or app checks → Write contact insights

Bring phone intelligence into contact workflows with fields ready for your next decision.

Set up the workflow See lookup pricing

Manual recipes; not a Marketplace app. HighLevel fees are separate.

Choose your checks

These are instructions and code helpers to configure in HighLevel. They are not an importable snapshot or a Marketplace app. Start with one manual journey per contact.

JourneyWhat it checksCurrent QuietPass package price
Phone dataLine type, carrier, number portability, live status and SMS capability where available£0.02 / US$0.02 / €0.02
Messaging appsWhatsApp and Telegram registration£0.03 / US$0.03 / €0.03
BothPhone data and messaging apps£0.05 / US$0.05 / €0.05

Your workspace has one fixed currency. Review the quote and available checks before authorizing a lookup. Formatting and quote previews do not use QuietPass credit.

HighLevel charges separately. Custom Webhook and Custom Code actions can incur premium execution fees. HighLevel currently documents 100 lifetime premium executions per eligible sub-account and a standard US$0.01 per execution afterward. A contact can run several premium actions. Your QuietPass limit does not cap HighLevel fees. Check your agency’s entitlement, wallet and rebilling settings before testing; no paid HighLevel upgrade is required by these instructions. HighLevel premium pricing.

Phone recipe · Messaging recipe · Combined recipe · Recovery recipe · Fictional test contact

Connect your own workspace

  1. Create a server key.

    Open QuietPass → API keys & usage. Save your key in HighLevel’s protected Bearer credential store. Select that connection on every QuietPass Custom Webhook. Each customer uses their own workspace, credit and key.

  2. Keep the destination fixed.

    Send requests only to https://quietpass.com. Keep the key out of Custom Code inputs, contact fields, custom values, notes, URLs, snapshots and exported workflow files.

  3. Create an unpublished draft.

    Leave triggers, re-entry and multiple opportunity enrollment off. Use fictional contacts in a developer sandbox. Real customer pilots belong in the customer’s production location; HighLevel’s sandbox policy prohibits real customer data.

If protected credential storage is unavailable, use the Make connector instead of embedding a key in a workflow.

Build and preview the draft

Open a helper text file, copy its contents, and paste the code into the named HighLevel Custom Code action.

Create text custom fields for qp_phone_source_country, qp_phone_source_revision, qp_phone_source_receipt, qp_phone_operation_id and the result fields below. Store a known two-letter country, such as GB or US, when the source number is in national format. International + or 00 input can omit it. Never infer country from the agency’s address.

  1. Build a safe request.

    Paste build-mapped-request.js.txt into Custom Code. Use the recipe’s configuration with your permanent location and workflow IDs and workspace currency. Keep allowPaid:false and maximumMicros:0.

  2. Map native contact inputs.

    Use the native picker for each contact value. Keep the literal prefixes shown below; HighLevel can otherwise convert phone numbers and empty fields into numeric values.

    Input nameMapped value
    locationIdYour fixed location ID
    contactId{{contact.id}}
    sourcePhonephone:{{contact.phone}}
    sourceCountrycountry:{{contact.qp_phone_source_country}}
    sourceRevision{{contact.qp_phone_source_revision}}

    Start with a deliberate source revision such as phone-v1. Preserve it on retries. Change it only for a real phone change or a deliberately authorized new lookup. Never generate it from a timestamp, execution ID or a result-field update.

  3. Keep the original request output.

    Retain the builder’s source receipt in the execution. Do not overwrite a contact’s previous recovery receipt before obtaining and validating a new operation.

  4. Send a preview.

    Add Custom Webhook with Event POST, URL https://quietpass.com/v1/automation/highlevel, and the protected Bearer connection. Under Body (Key and Value), add one item: key payload, value the builder’s Output → Body token. Insert the token alone. Do not interpolate the serialized body into CUSTOM/Raw Body. Enable Save response.

  5. Qualify response capture.

    HighLevel’s standalone Send test request does not run the preceding Custom Code step. If that editor test cannot resolve the Body token, temporarily paste the fictional request body from the builder’s successful test into payload. Keep allowPaid:false and maximumMicros:0, then send this free preview to establish response capture.

    Afterward, select the entire payload value and replace it with the builder’s Output → Body token. Save and reopen the action: it must contain one token, with no example JSON beside it. Test the complete unpublished workflow with a fictional contact to verify the native mapping. Do not leave a fixed test body or test IDs in the workflow.

  6. Stop the preview branch.

    Require state=preview and readyToWrite=false. Review the price. Do not replace saved operation references or result fields. A preview creates no purchase or supplier request.

Authorize and pause spending

In QuietPass → Connected tools → Workflow spending limits, the workspace owner sets a per-lookup maximum and shared daily maximum, authorizes credit use, and enables new saved lookups. New workspaces start paused at zero. A server API key cannot change these settings.

For one reviewed contact, set the draft’s allowPaid:true and integer maximumMicros: 20000 for phone, 30000 for messaging, or 50000 for both. One million micros equals one unit of the workspace currency. These values are ceilings, not a spending authorization; a smaller workspace or remaining daily limit still applies. Shared limits cover other saved workflows in the same workspace.

After the request, use retain-operation.js.txt with the original receipt and response Workflow Payload. Branch on retain=true before saving the bound receipt and original operation ID to the contact. Save both before writing result fields. If response or reference storage fails, preserve the original execution and exact request; do not create a new source revision.

To pause, disable future saved lookups in QuietPass and turn off workflow enrollment. Return the draft to allowPaid:false and maximumMicros:0. Pausing new purchases does not prevent reading an already saved result.

Write only current, settled results

Continue only when state=settled, resultState=settled and readyToWrite=true. Use guard-mapped-write.js.txt to compare the result with the saved receipt, original operation and current contact inputs. Map lastRequestId as request:{{contact.qp_phone_request_id}}. Map outcome from Custom Webhook → Response → Workflow Payload, not the parent Response object. Require write=true before Update Contact Field.

Resolve current phone, country and revision immediately before the guard. HighLevel skips Find Contact when a contact is already enrolled, so that action alone does not prove a fresh read. Before launching, pause a test execution, change the source externally, and confirm the guard blocks the old result.

JourneyOwned result fields (prefix each with qp_phone_)
Phonee164, country, type, carrier, ported, sms, sms_basis, reachable, checked_at, request_id
Messaginge164, country, whatsapp, telegram, checked_at, request_id
BothAll 12 fields listed above

Read back the contact after an update. HighLevel can report Success while skipping an invalid field. Confirm every expected field, the original request ID and the checked time; a success label alone is insufficient. If the request ID is present but fields are incomplete, keep purchases paused and review the original execution rather than automatically clearing references.

Copy the guard’s returned text values. false means a definite negative; unknown means no definite answer. Preserve both. Do not change the original phone, consent, owner, lifecycle or unrelated fields. One profile must not clear another profile’s fields.

For the first manual pilot, use one selected journey and one in-flight execution per contact. The starter shares result and recovery fields across profiles. The source read and CRM update are separate steps, so atomic protection against a simultaneous contact edit is not claimed.

Recover without buying the lookup again

  1. Keep the original references.

    Use the saved bound receipt and operation ID. Retained results expire after 24 hours. A timeout or failed contact update is not a reason to buy a replacement.

  2. Validate the saved operation.

    Install recover-saved-operation.js.txt. Map receipt from qp_phone_source_receipt and originalOperationId as operation:{{contact.qp_phone_operation_id}}.

  3. Read the result.

    Use a protected Custom Webhook GET to the first code step’s output.url. Enable Save response. This reads /v1/automation/highlevel/<original-operation-id>; it has no purchase step. Restore the dynamic URL after any editor test with a fixed example.

  4. Check the current source again.

    Install guard-recovered-write.js.txt. Supply the GET’s Workflow Payload, the validated original receipt/operation and the current native contact fields with the same prefixes. Route only when write=true and the returned profile matches the selected branch. Copy only that profile’s owned fields.

  5. Stop duplicate or unsafe writes.

    already_written ends without another update. A changed contact, location, phone, country or revision stops for review. A missing or expired result stops; never turn it into a negative answer. Recovery must contain no POST, prepare or run action.

A failed Custom Webhook does not necessarily stop later HighLevel actions. Keep the explicit receipt, settled-result and current-source guards before every result update. Do not rely on the action’s success/failure label alone.

If a contact update times out, read the contact first. If the original request ID and all expected fields are already present, do not write again. If the request ID is present but other fields are incomplete, stop for manual review; do not clear it automatically or create a new lookup.

Run a small manual pilot

Before automatic use, verify your own location’s field mappings, premium execution entitlement, spending rejection, changed-source guard, duplicate suppression and recovery after a failed destination update. Start with free previews, then explicitly authorize one capped lookup. Check both platform charges and leave enrollment off until you choose to automate.

Use one contact at a time for your initial manual setup. Confirm the expected result fields and actual charges in your own location before deciding whether to automate. This page does not enable your workflows.

For help, contact QuietPass with the error code and request/operation ID. Keep API keys and contact exports out of support messages.