GoHighLevel
Connect GoHighLevel (HighLevel) once and it does two jobs. Affiliates, referred customers and leads land in your sub-account as contacts with the referring affiliate on the record, and sales are credited to the affiliate whose link brought the contact, with a workflow webhook for one-time order forms and non-Stripe gateways.
Rekomi's GoHighLevel connection does two jobs, and each has its own switch on the integration page. Sync affiliates into GoHighLevel pushes affiliates (and, if you turn it on, referred customers and leads) into a HighLevel sub-account as contacts with Rekomi custom fields and tags. Credit sales through GoHighLevel credits sales to the affiliate whose link brought the contact, using the attribution HighLevel itself records on every contact. Both switches are on by default. HighLevel workflows can also post form submissions and payments back to Rekomi through a webhook, which is how one-time order forms and non-Stripe gateways reach Rekomi at all.
What this connection does and does not do. It moves contacts between Rekomi and GoHighLevel, and it names the affiliate on your sales. Where the sale itself comes from depends on how you bill: recurring products on a Stripe account connected under Setup > Connect payment gateway arrive through Stripe; one-time order forms and any non-Stripe gateway (Authorize.net, NMI, PayPal, Square) reach Rekomi only through the workflow webhook described below. It reads HighLevel's attribution and never writes it.
Credit sales through GoHighLevel
How it works
- Every affiliate link Rekomi hands out for your campaign carries two extra parameters:
utm_source=rekomiandutm_campaignset to that affiliate's link slug. For example:https://newsletter.example.com?via=jane&utm_source=rekomi&utm_campaign=jane. Slugs are lowercase, and HighLevel compares UTM values exactly, so do not retype them by hand. - When a visitor lands from that link on a HighLevel-hosted funnel or website page (or an external page running HighLevel's tracking script) and submits a form, survey, calendar booking, chat, or a one- or two-step order form, HighLevel stores the arrival on the contact. It keeps the first arrival and the latest one. Rekomi reads the tagged fields first and, when they are missing, the landing page address itself, so a plain affiliate link (
?via=slug) handed out before tagging was turned on still names its affiliate. - When a sale reaches Rekomi, whether through your connected Stripe account or through the workflow webhook, and nothing else names an affiliate (a coupon, checkout metadata, the customer's history, an email lead Rekomi recorded itself), Rekomi looks the contact up by email in your location, reads the stored attribution, and credits the affiliate it names. The first arrival is checked first, then the latest one.
What you need
- The GoHighLevel connection on this page with Credit sales through GoHighLevel on. It is on from the moment you connect. The private integration token you already created covers the contact read.
- For recurring products billed through Stripe: that Stripe account connected under Setup > Connect payment gateway.
- For one-time order forms and non-Stripe gateways: the workflow webhook in the next section.
Sending purchases from HighLevel to Rekomi
Use this for any sale that does not run as a Stripe subscription on the connected account: one-time order forms, and every gateway that is not Stripe.
- Copy the Inbound webhook URL shown on the GoHighLevel integration page in Rekomi. Treat it like a password: anyone who has it can post to your account.
- In HighLevel, create a workflow with the trigger Payment Received (or Order Form Submission for order forms). Add a Webhook action: method
POST, URL = your inbound URL. - In the Webhook action's Custom Data section, add four fields from the trigger's merge fields:
email,amount,currencyandorder_id. If your checkout applies discount codes through HighLevel's own coupons, add a fifth,coupon_code, set to the order's coupon merge field: a code Rekomi minted for an affiliate credits that affiliate even when the buyer never clicked a link or submitted a form. If you want the affiliate's slug in the payload, add two more:utm_sourcewith the literal valuerekomi, andutm_campaignset to the contact's attribution merge field for the UTM campaign (a single field namedrekomi_campaignset to that merge field also works). Rekomi ignoresutm_campaignwhenutm_sourceis notrekomibeside it. Without these fields Rekomi reads the contact's attribution itself. (totalworks in place ofamount, andtransaction_idorpayment_idin place oforder_id.)
Rekomi records the purchase once per order id, so a workflow that fires twice never creates two sales, and credits it only when the contact's own HighLevel attribution confirms the slug in the payload. A coupon_code is checked against your own affiliate codes instead: an active code names its affiliate, an unknown or retired one is ignored. When the payload carries no slug, Rekomi credits a prior lead by email or the contact's own Rekomi tag. A payload slug the contact does not carry is not recorded, and neither is a purchase for an email HighLevel has no contact for. Purchases are recorded only while Credit sales through GoHighLevel is on. If both a Payment Received trigger and an Order Form Submission trigger post the same order, Rekomi still records it once, because the order id is the key; send the same order_id value from both. If the same purchase also arrives through your connected Stripe account, Rekomi folds the two together: the Stripe payment attaches to the sale the webhook already recorded (same buyer email, amount and currency within 90 days) instead of counting again, so the coupon credit survives and refunds still match. Refunds on these sales do not reach Rekomi from HighLevel; invalidate the sale from the Conversions page when you refund an order.
The switch and the status line
Credit sales through GoHighLevel sits on the integration page next to Sync affiliates into GoHighLevel. Under it the page shows one plain sentence of status: whether Rekomi's last check of your location succeeded and when it ran, and how many sales have been credited through GoHighLevel so far. Rekomi runs that check when you connect. A contact is credited only when they were created within the window shown on the page (365 days by default).
Turning the switch off stops the lookups and removes the two tags from your affiliates' links. Your workflows keep posting to the inbound URL and leads keep recording; only the crediting of sales through attribution stops.
Check a subscriber's email
Under the sales block, Check a subscriber's email takes one address and tells you what HighLevel has stored for it: whether the contact exists in your location, whether its attribution names one of your affiliates, and whether a sale from that email would be credited. Use it to test: open an affiliate link, submit a form with a fresh address, then check that address here.
Limits, stated plainly
- The link has to land on a page HighLevel tracks. A link to a page that is neither HighLevel-hosted nor running HighLevel's tracking script records nothing. A form embedded in an iframe on another site records the iframe's page, not the visitor's arrival.
- UTM values are case-sensitive in HighLevel. Rekomi's tags are lowercase; a link edited by hand with different casing does not match.
- Your own campaigns overwrite the latest arrival. A contact who clicks one of your own tagged emails before buying carries your campaign as the latest arrival. Rekomi checks the first arrival first for that reason.
- HighLevel allows duplicate contacts. When two contacts share an email, Rekomi reads the one HighLevel returns for that email.
- HighLevel's rate limit is shared. 100 requests per 10 seconds per location. Rekomi makes a read or two per sale, keeps a short per-email cache so the same buyer is not read twice in a burst, and tries a sales read again after two minutes if HighLevel answers 429. The affiliate sync honors
Retry-After.
Sync affiliates into GoHighLevel
Affiliates (always on while the switch is on)
When an affiliate is approved (or, optionally, when they apply), Rekomi calls POST /contacts/upsert with:
locationId, your sub-accountemail,firstName,lastNamesource: "Rekomi"customFields:Rekomi referral link,Rekomi referral slug,Rekomi campaign,Rekomi affiliate status
Then it adds tags with POST /contacts/{id}/tags: Rekomi affiliate plus any default tags you set. Tags are added, never replaced, so the tags your own workflows applied stay in place. The referral link written to the contact carries the same two tags as the links Rekomi shows affiliates.
Referred customers and leads (optional)
Under Sync affiliates into GoHighLevel, turn on Sync referred customers and leads. Every sale or lead Rekomi attributes to an affiliate, including sales credited through GoHighLevel by the job above, is upserted as a contact (matched on email) with:
Rekomi referring affiliate,Rekomi referring affiliate slug,Rekomi referring affiliate email,Rekomi referring affiliate codeRekomi last event(saleorlead) andRekomi last sale amount(for sales)Rekomi campaign- Tag
Rekomi customer(sale) orRekomi lead(lead-only signup), plus your default tags
Refunded, denied and fraud-quarantined conversions are never pushed. Imported historical conversions are not pushed either.
Custom fields
Rekomi creates any missing Rekomi ... field on first use (text fields on the contact model). HighLevel derives the merge key from the name, so in emails, SMS and workflows you can use for example:
{{contact.rekomi_referral_link}}{{contact.rekomi_referring_affiliate}}{{contact.rekomi_last_event}}
If you prefer to create the fields yourself first, use the exact names above and Rekomi reuses them.
Finding your credentials
In your HighLevel sub-account (not the agency view):
- Settings, then Business Profile. Copy the Location ID (about 20 letters and digits).
- Settings, then Private Integrations, then Create new integration. Name it "Rekomi".
- Scopes: Contacts (view and edit) and Custom Fields (view and edit). Nothing else is needed; the contact scope also covers the attribution read.
- Copy the token. It starts with
pit-.
Agency API keys and legacy v1 keys do not work with this integration; the connect form rejects them before making any call.
Connecting GoHighLevel in Rekomi
- Go to Integrations in the dashboard sidebar.
- Click the GoHighLevel card.
- Paste the Location ID and the private integration token. Click Connect.
- Rekomi runs a test call against
GET /locations/{locationId}/customFields, which also proves the custom-fields scope, then checks that it can read contacts so the sales status line is filled in immediately. - Once connected, add default tags if you want them, and turn on Sync referred customers and leads if you want customers in HighLevel too.
There is no list picker: in HighLevel the location itself is the audience. Use tags and your own smart lists to segment.
Sending leads from HighLevel to Rekomi
Use this when the signup happens inside a HighLevel form or funnel and you want the lead credited to the affiliate whose link brought the visitor, before any sale.
- On the landing page, HighLevel already records the arrival from the affiliate link (the
utm_campaignvalue is the affiliate's slug), so no hidden field is needed on HighLevel-hosted pages. If your form runs on a page HighLevel does not track, add a hidden field namedvia(orrekomi_via) that is filled from the URL parameter; HighLevel forms can read URL parameters into fields when the field's name matches the parameter. - Copy the Inbound webhook URL shown on the GoHighLevel integration page in Rekomi. Treat it like a password: anyone who has it can post leads to your account.
- In HighLevel, open the workflow that runs on that form submission and add a Webhook action. Method
POST, URL = your inbound URL. The default payload includesemail,first_name,last_nameand your form's custom fields at the root. In the Custom Data section add two fields so the affiliate's slug travels with the submission:utm_sourcewith the literal valuerekomi, andutm_campaignset to the contact's attribution merge field for the UTM campaign. Rekomi readsutm_campaignonly whenutm_sourceisrekomibeside it. A single field namedrekomi_campaignset to the same merge field works on its own. If you used a hidden field on an untracked page, sendviainstead.
Rekomi reads email, the name fields, and the affiliate slug from rekomi_campaign, from utm_campaign when utm_source is rekomi beside it, from HighLevel's own attribution objects when the workflow forwards them (attributionSource first, then lastAttributionSource, each read only when its utmSource is rekomi), or from one of rekomi_via, via, rekomi_affiliate, referring_affiliate, affiliate, ref, referral. Field names are matched without regard to case, at the root of the payload or inside its customData object. A submission without an affiliate slug is acknowledged and ignored. Leads recorded this way behave exactly like leads from the tracking script: they show under the affiliate, and if that person later buys, Rekomi's email-match attribution credits the sale.
The inbound URL only resolves slugs that belong to your account, and every response is a plain 200 so it cannot be used to probe for slugs.
Tags
Enter default tags on the integration page (up to 8, 64 characters each). Rekomi always adds the system tag (Rekomi affiliate, Rekomi customer or Rekomi lead) so you can build smart lists and workflow triggers on it.
When sync fires
- Default: only
Approvedaffiliates sync. - Optional: turn on "Include applicants before approval" to also sync
Pendingaffiliates. - Customers and leads: when the conversion is recorded (Stripe or any other billing source, the purchase or lead webhook above, S2S postback, tracking-script signup, or a sale credited through GoHighLevel's attribution).
Per-campaign overrides
Each campaign can override the account-level configuration. From a campaign's detail page, open the Settings tab and scroll to the CRM sync for this campaign section. Turning a campaign off there stops both affiliate and customer syncs for that campaign.
Per-affiliate sync visibility
Open any affiliate's detail page. The CRM sync panel shows the per-CRM status. Resync clears prior jobs and re-fires the sync.
Troubleshooting
- Connection test fails with 401, The token is not a Private Integration token, was revoked, or belongs to a different sub-account than the Location ID. Re-create the token inside the same sub-account.
- Connection test fails with 403, The token is missing the Custom Fields scope. Edit the integration in HighLevel and add it.
- Contacts arrive without Rekomi fields, The token cannot create custom fields (scope) or the location hit its custom-field limit. Rekomi still syncs the contact; create the fields manually with the exact names and resync.
- Tags missing on a contact, Check the contact was not merged in HighLevel after the sync; merging keeps the tags of the surviving record only.
- HTTP 429, HighLevel allows 100 requests per 10 seconds per location. Rekomi paces syncs and honors
Retry-After; a large bulk approval simply takes a few minutes. - Webhook leads not appearing, Confirm the payload carries
emailand a slug field, that the slug belongs to an approved affiliate on your account, and that the affiliate is not submitting their own email (self-leads are dropped and recorded as a fraud signal). - A purchase shows as a purchase but not as a credited sale. Use Check a subscriber's email with the buyer's address. No contact means the buyer never submitted a tracked HighLevel form; a contact with no Rekomi attribution means the link landed on an untracked page or the casing was changed. A one-time order that does not appear as a purchase at all is missing the workflow webhook above.
- Sync fails with 401/403 after working before, The token was revoked. Rekomi marks the integration "action needed" and emails you a reconnect prompt once per breakage. Create a new token, reconnect, then use Resync all on the Failed tile.
Disconnecting
From the GoHighLevel connect page, click Disconnect. The integration row, its inbound webhook URL and per-campaign overrides are deleted (the old URL stops working immediately, so remove the Webhook actions from your workflows too). Historical sync rows are preserved for audit.
See the GoHighLevel integration overview on the marketing site for use-cases, persona fit, and unique automation patterns.
GetResponse
Connect GetResponse so approved affiliates land in a campaign (mailing list) automatically.
ConvertKit (Kit)
Connect Kit once and it does two jobs. Approved affiliates land in a Kit form with tags, and sales, including Kit Commerce purchases, are credited to the affiliate whose link brought the subscriber.