Growably CRM Workflows

Working Growably (LeadConnector) as the CRM — discovering the IDs the write tools need, upserting contacts, the tag-overwrite trap, opportunities, and the confirm-before-send rule for messages and workflows.

How to work Growably (a LeadConnector / GoHighLevel CRM) without the two traps that bite: clobbering a contact’s tags, and firing customer-facing messages or workflows without confirmation. The pattern is discover the IDs you need, make safe writes, and gate anything outbound.

Signatures are on growably; the broader integration plan is Growably Integration.

Discover IDs first

The write tools need IDs (pipeline, stage, workflow, custom-field) that you discover through growably_get with the right entity_type:

growably_get(entity_type="pipeline")       # pipeline_id + stage_id for opportunities
growably_get(entity_type="workflow")       # workflow_id for triggers
growably_get(entity_type="custom_field")   # field IDs for contact custom_fields

Do this up front — the create/trigger calls below fail without the right IDs, and they’re not guessable.

Upserting contacts

growably_upsert_contact matches on email/phone: if a contact with that email or phone exists it’s updated, otherwise created. Safe to call idempotently.

growably_upsert_contact(first_name="Jane", last_name="Doe",
                        email="jane@acme.com", phone="+15551234567",
                        tags=["lead"], source="referral",
                        custom_fields=[{"id": "<field_id>", "value": "..."}])

custom_fields is a list of {"id": ..., "value": ...} — IDs from the custom_field discovery above.

The tag-overwrite trap

This is the one that surprises people. Don’t change tags through growably_update’s data — it can overwrite the entire existing tag set. Use the dedicated tag tool, which adds/removes against the current set:

growably_manage_tags(contact_id="<id>", action="add", tags=["vip"])
growably_manage_tags(contact_id="<id>", action="remove", tags=["cold"])

Notes and opportunities

# A note on the contact's timeline
growably_add_note(contact_id="<id>", body="Called re: renewal, left VM.")

# An opportunity in a pipeline stage (IDs from the pipeline discovery)
growably_create_opportunity(name="Acme renewal", pipeline_id="<pid>",
                            stage_id="<sid>", contact_id="<id>",
                            monetary_value=4800, status="open")

status is one of open, won, lost, abandoned.

Outbound actions: confirm first

growably_send_message and growably_trigger_workflow reach real customers and cannot be recalled. Treat both as gated.

# SMS by default; subject required for Email
growably_send_message(contact_id="<id>", message="...", type="SMS")

# Enroll a contact in a workflow (which may itself send comms)
growably_trigger_workflow(contact_id="<id>", workflow_id="<wid>")

Reading conversations & engagement

growably_get(entity_type="conversation", contact_id="<id>")
growably_get(entity_type="conversation_messages", id="<conversation_id>")
growably_get(entity_type="contact_notes", id="<contact_id>")

Pagination is cursor-based — pass start_after / start_after_id from the previous response’s meta.

  • growably — the growably_* signatures and entity-type map
  • Growably Integration — the five-phase plan wiring Growably into Leif
  • Tools — catalog overview and routing rules