HighLevel contacts now sync from every proposal — phone-only included
If you're connected to HighLevel, sending a proposal from BidCraft now pushes the contact, custom field, note, and opportunity into your HighLevel pipeline — regardless of which provider sends the actual email, and even when the project has only a phone number on file.
What changed
Two gaps got closed in one pass.
Gap 1 — CRM sync was gated by the proposal provider toggle. If you'd left the toggle on BidCraft (default) — which most contractors do, since BidCraft's native email path is simpler — new clients quietly stopped landing in HighLevel. CRM sync silently skipped. Now every Send Proposal click syncs the following to HighLevel whenever the integration is connected:
- Contact — created if it doesn't exist, otherwise reused
- Custom field — the proposal link, written to the field key you configured
- Note — a "Proposal sent" note with the link and total, attached to the contact
- Opportunity — added to your first pipeline at the first stage, with the proposal total as the monetary value
Gap 2 — phone-only contacts were skipped. A common pattern: capture a lead at a job site, get their phone but not their email. If your GHL workflow has an SMS branch ("text the link when no email is on file"), BidCraft needed to push the contact for that branch to fire. Before, BidCraft would only push if the project had an email. Now BidCraft matches by email when one's present, falls back to matching by phone (digits-only, exact match) when it isn't, and creates the HighLevel contact with whichever channel you have.
So a phone-only contact + provider set to HighLevel now works end to end: BidCraft pushes the contact by phone, drops the link in your custom field, fires the Action: send app proposal tag, and your SMS workflow takes over from there.
A new heads-up before you click Send
If you click Send Proposal on a project that genuinely has no way to deliver anything — no email and no phone — you used to get nothing but a shareable link with no warning. Now an inline banner above the Send button tells you what's about to happen:
- No email or phone → "Send Proposal will create a shareable link but won't deliver anything automatically." Add a phone or email if you want it to ship, or copy the link manually.
- Phone only + provider = BidCraft (native) → "BidCraft's native email path needs an email to send. Add an email, or switch your provider to HighLevel so your GHL workflow can text the link instead."
- Phone only + provider = HighLevel → "BidCraft will push this contact to HighLevel by phone so your GHL workflow can SMS the proposal link." (Informational — everything will work.)
What still depends on the provider toggle
The workflow-trigger tag Action: send app proposal — the one that fires your existing GHL email or SMS workflow — only fires when you've explicitly set your provider to HighLevel. That's on purpose: if BidCraft just sent the proposal email natively, firing the HighLevel workflow would send the homeowner a second copy.
So the rule is:
- Contact data → HighLevel: whenever HL is connected and the project has email or phone
- HighLevel workflow trigger: only when you've picked HL as your provider
If sync fails
If something goes wrong on the HighLevel side (expired token, missing scope, contact write rejected), the proposal itself still ships — your client still gets the email or share link. The send response now also includes the HighLevel error so you can see what HighLevel rejected, even though the email succeeded. Check your token scopes if it keeps happening.
[!tip] Phone-based dedup is less precise than email — same number can legitimately belong to spouses, business lines, or be reassigned over time. BidCraft only falls back to phone when no email is on the project. If a contact later gains an email, that becomes the dedup key going forward.
More detail at Connecting HighLevel CRM.