Campaigns & campaign links
Create a campaign, add its MTL and VTL links, then attach tracking once for the whole campaign.
Every MTL and VTL link below uses the same saved click-ID mapping and event destinations.
Your campaigns
Select a campaign to manage its links and conversion tracking.
| Campaign | Traffic source | Country | Campaign links | Tracking | |
|---|---|---|---|---|---|
| ExoClick · UK Golden GlamDR-EXO-UK-001 | ExoClick | United Kingdom | 1 MTL · 3 VTL | 2 events active | |
| EvaDav · AU ModelsDR-BEMOB-AU-002 | EvaDav, tracked through BeMob | Australia | 1 MTL · 4 VTL | 3 events active | |
| Google Search · UKDR-GADS-UK-003 | Google Ads | United Kingdom | 1 MTL | Draft |
ExoClick · UK Golden Glam
Campaign ID: DR-EXO-UK-001 · DarkRoseDating · United Kingdom
cidReceives ExoClick’s {conversions_tracking}external_click_idKept 30 days · last click wins · locked at signupCampaign links
These links can point to different models. Tracking does not need to be configured again for each link.
| Type | Link name | DarkRoseDating campaign URL | Uses campaign tracking |
|---|---|---|---|
| MTL | Main UK landing pageDefault campaign entry | https://www.darkrosedating.com/lp005/?ref_ids=lpWWpJalmqacmpeon6CSlKeiYZJk&cid={conversions_tracking} | ✓ Inherited |
| VTL | Golden GlamModel route: gg | https://www.darkrosedating.com/lp005/?ref_ids=lpWWpJalmqacmpeon6CSlKeiYZJk&srcm=gg&cid={conversions_tracking} | ✓ Inherited |
| VTL | LilithModel route: lilith | https://www.darkrosedating.com/lp005/?ref_ids=lpWWpJalmqacmpeon6CSlKeiYZJk&srcm=lilith&cid={conversions_tracking} | ✓ Inherited |
| VTL | Golden Glam profileDirect model page | https://www.darkrosedating.com/profile/Golden-Glam50s?cid={conversions_tracking} | ✓ Inherited |
Redsoft adds cid={conversions_tracking} to every link automatically, based on the platform preset of the assigned tracking setup. The affiliate never types it.
Assigned tracking setup
This campaign uses the tracking setup below. Its saved event rules apply to every campaign link.
Fires once, when the signup is completed.
http://s.magsrv.com/tag.php?goal=e43b3ba9187ce9d08b25f2a51f33b876&tag={external_click_id}Fires once per user, on their first successful payment.
http://s.magsrv.com/tag.php?goal=10151cea167cf2cc1156ca7a033a9fa7&tag={external_click_id}Tracking setups
Manage the click-ID mapping and conversion rules attached to each DarkRoseDating campaign.
The click ID identifies the external click. The assigned tracking setup tells Redsoft which registration, purchase or package rule to use. Campaign names are labels only.
ExoClick · UK Golden Glam
Custom S2S · DR-EXO-UK-001
- Campaign links
- 4
- Events
- Registration, First purchase
BeMob tracker · AU Models
Custom S2S · DR-BEMOB-AU-002
- Campaign links
- 5
- Events
- Registration, First + Every purchase
Google Search · UK
Google Ads browser event · DR-GADS-UK-003
- Campaign links
- 1
- Events
- First purchase
ExoClick · UK Golden Glam
Direct ExoClick S2S goals for every link in campaign DR-EXO-UK-001.
Where does your traffic come from?
Choose a platform preset. Redsoft fills in the click-ID parameter, the platform’s click macro and a postback template for each event.
Example campaign link
Redsoft adds the parameter automatically to every MTL and VTL link.
https://www.darkrosedating.com/lp005/?ref_ids=lpWWpJalmqacmpeon6CSlKeiYZJk&srcm=gg&cid={conversions_tracking}Attribution rules
The same for every affiliate and campaign. Shown here so the affiliate knows exactly how conversions are credited.
A click can earn a signup for 30 days after it happened. Older clicks are ignored.
If a visitor clicked several affiliate links before signing up, the most recent click gets the credit.
At signup the winning click is saved on the user. Every later purchase of that user belongs to that click, for life. New clicks don’t change it.
Conversion events
Turn on only what you need and paste a postback URL for each. Each event fires at an exact, verified moment, for every link in this campaign.
Buyers are rare at first. Signups give your network enough data to find which zones work.
Move bidding to zones that produce real buyers.
Bid more on zones that bring repeat or high-value buyers.
Package events AdvancedFor affiliates who bid on bigger buyers. Off by default.
Using a tracker (BeMob, Voluum, RedTrack…)? You often don’t need package events at all. Add
{package_tier} to your purchase postback and split the report by package inside your tracker. No extra conversions are counted.Google Ads browser event
This is browser-based tracking, not S2S. Paste Google’s generated event snippet and Redsoft extracts the send_to value.
Google Ads server-side integration
A separate advanced integration requiring Google account authorization through OAuth.
- Google Ads API access and developer credentials
- The advertiser’s account and conversion-action IDs
- Capturing identifiers such as
gclid,gbraid, orwbraidfrom the campaign link - Storing that identifier with the visitor
- Uploading conversions through Google’s API
- Correct timestamps, consent data and transaction IDs
- Handling API errors, retries, duplicate uploads and attribution windows
Postback log
Every postback Redsoft sent, skipped or retried, with the exact URL and the platform’s answer.
If ExoClick shows 40 conversions and Redsoft shows 52, this log shows which postbacks failed, were skipped or never had a click ID. No developer ticket is needed.
Deliveries
Click a row to see the full request and response.
| Time | Event | Campaign · link | Click ID | Status | Answer | Tries |
|---|
What each status means
Plain-language explanation shown to affiliates.
The platform answered with a success code (2xx). The conversion should appear in its report.
The platform didn’t answer or had a temporary error. Redsoft tries again automatically after 1 min, 5 min, 30 min, 2 h and 6 h.
All retries used, or the platform rejected the URL (4xx). Usually a wrong goal ID or key. Fix the setup and press Retry.
The user signed up without a tracked click (for example, typed the site directly). The event is recorded in Redsoft, but nothing is sent. No IDs are ever invented.
The same conversion was already delivered, for example after a page reload or a repeated payment notice. Sending it again would double-count.
Sent with the “Send test” button using a test click ID. Not a real conversion.
Life of one visitor
One example visitor, from the ad click to the last purchase. Press play, or step through it at your own pace.
Redsoft values & naming
A single internal language that works with ExoClick, BeMob, Voluum, RedTrack and custom postbacks.
For example, ExoClick’s {conversions_tracking} and PropellerAds’ ${SUBID} both become external_click_id inside Redsoft.
Available postback placeholders
Affiliates use these controlled names inside saved postback URLs. Anything else in curly brackets is rejected when saving.
| Redsoft placeholder | What Redsoft inserts | Example value | Typical use |
|---|---|---|---|
{external_click_id}Required | The complete click identifier captured from the campaign link | EXAMPLE_CLICK_IDReal IDs are longer. Always send the full value. | ExoClick tag, BeMob cid, PropellerAds visitor_id |
{event_id} | Unique Redsoft ID for this conversion | EVT-501 | Tracker transaction ID / deduplication |
{order_id} | Unique DarkRoseDating payment order ID (purchase events only) | ORDER-1001 | Purchase transaction ID |
{event_name} | The Redsoft event that occurred | registration, first_purchase, purchase, package_3 | Trackers that take an event-type parameter |
{package_tier} | The purchased coin package (purchase events only) | package_3 | Split purchases by package in a tracker without extra goals |
{payout}Later | Conversion value | — | Not part of version 1 |
{currency}Later | Three-letter currency code | — | Not part of version 1 (only needed with payout) |
Event names
The fixed list of moments Redsoft can report. One payment can trigger more than one event (see the ⚠ notes).
| Event | Fires when | How often per user | Fires together with |
|---|---|---|---|
registration | Signup completed | Once | — |
first_purchase | First successful payment | Once | ⚠ purchase and the matching package event |
purchase (Every purchase) | Any successful payment | Every payment | ⚠ first_purchase (on the first one) and the package event |
package_1 … package_4 | That coin package was bought | Every time it is bought | ⚠ purchase, and first_purchase if it was the first |
ExoClick registration example
...?cid={conversions_tracking}external_click_id = EXAMPLE_CLICK_ID...&tag=EXAMPLE_CLICK_IDEXAMPLE_CLICK_ID is a stand-in, not a real ExoClick ID. Production must store and return the complete value supplied by the platform, unchanged.
Suggested implementation guide
One possible way to build the concept shown in this prototype. Technical details are in the .
The developers can adapt the data model, naming, queues and frontend integration to Redsoft’s existing architecture. What matters is keeping the relationships, the attribution rules and the verified-event flow.
1Separate campaigns from tracking setupsWhat these two records mean and why they are separate
What to do
Store campaign details separately from tracking instructions. The campaign contains its name, country and MTL/VTL links. The tracking setup contains the platform preset, the incoming click parameter and the postback for each conversion event.
How it works
Assign one saved tracking setup to the campaign. Redsoft gives that setup a neutral internal ID, such as TRACKING-SETUP-1. This ID points to the saved set of event rules. It is never sent to the external platform. One setup can be reused by several campaigns. Each campaign has exactly one setup.
Why this is needed
The campaign name is only descriptive. The assigned setup, not a name such as “ExoClick”, tells Redsoft how to capture the click ID and where to deliver conversions.
campaigncampaign_linktracking_setupevent_rule2Create a campaign and its linksCampaign ID, link ID, destination and model selection
What to do
Let the affiliate create a campaign, then add every MTL or VTL link that belongs to it. Give the campaign a unique campaign ID and each link a unique link ID.
How it works
Each link sends visitors to a chosen place on DarkRoseDating, such as a model page, a profile or a landing page. A routing value such as srcm=gg selects that experience. Routing is separate from S2S tracking. When a tracking setup is assigned, Redsoft automatically adds its click-ID parameter (e.g. cid={conversions_tracking}) to every link in the campaign.
* Testing option: different links could be compared in an A/B test to see which page produces more registrations or purchases.
Why this is needed
The campaign ID groups the activity. The link ID shows which exact link produced the visit. The affiliate sets up tracking once per campaign, not once per model link.
3Capture the incoming click ID with platform presetsHow differently named platform macros become one Redsoft field
What to do
Offer a list of platform presets (ExoClick, TrafficStars, PropellerAds, EvaDav, BeMob, Voluum, RedTrack, Binom, Keitaro) plus “Custom”. Each preset fills in the URL parameter, the platform’s click macro and a postback template. Custom lets the affiliate type both.
How it works
ExoClick replaces {conversions_tracking} with the real click value before sending the visitor. Redsoft reads the configured cid parameter and stores that value as external_click_id. PropellerAds uses ${SUBID}, RedTrack uses {clickid}, and so on. All of them end up in the same internal field.
Why this is needed
Most setup mistakes are a wrong macro name. Presets remove that risk. A consistent internal field lets the delivery process work the same way for every platform. Preset values must be verified against each platform’s documentation before release.
ExoClick: cid={conversions_tracking} → external_click_idPropellerAds: cid=${SUBID} → external_click_idCustom: chosen parameter → external_click_id4Store the click and apply attribution rules30-day window, last click, locked to the user at signup
What to do
On the first request, save a click record: the full external click ID, campaign, exact link, tracking-setup ID and time. Keep it connected to the visitor (first-party cookie + server-side record). At signup, find the winning click and save it on the new user permanently.
How it works
30 days: only clicks from the last 30 days count. Last click: if there are several, the newest wins. Locked at signup: once the user exists, every future conversion uses the click saved on the user, even if they later click another affiliate’s link. This also works when they buy later on another device, because the click is on the account, not in the browser.
Why this is needed
A click ID identifies the visit, not the platform or setup. Saving the setup ID with the click means Redsoft never guesses. Locking at signup means purchases days or weeks later still reach the right affiliate.
user_id = 5531 · external_click_id = EXAMPLE_CLICK_ID · tracking_setup_id = TRACKING-SETUP-1 · campaign_link_id = LINK-GG-01 · clicked_at = day 0 10:025Use verified Redsoft eventsThe trigger everything else depends on, and how events overlap
What to do
Define a fixed list of events: registration (signup completed), first_purchase, purchase (every purchase) and package_1…package_4. Connect each to the backend action that confirms it. For purchases, that is the confirmed payment, not the button click.
How it works
One confirmed payment can produce several events. A user’s first payment for Package 3 produces first_purchase, purchase and package_3. Redsoft records all of them internally, then sends a postback only for those the affiliate turned on. Each event uses its own postback URL.
Why this is needed
Affiliates optimise in stages: signups first, then first purchases, then repeat or high-value buyers. Giving them separate events supports every stage. The ⚠ notes in the editor, and a warning when two events share the same goal URL, protect them from counting one payment twice.
registrationfirst_purchasepurchasepackage_1 … package_46Deliver a Custom S2S postbackHow this replaces the current one-off custom-code approach
What the affiliate does once
Picks a preset, turns on an event such as Registration and pastes the postback URL from the platform (or fills in the goal ID in the template). The URL marks where Redsoft inserts the click ID with {external_click_id}.
What the backend does later
After Redsoft confirms the registration, it takes the saved URL, replaces {external_click_id} with the complete stored value (URL-encoded), sends the request, and writes the result to the postback log. Purchase events work the same way with their own URLs.
Why this is needed
Redsoft needs to know when to send (the event), where to send (the saved URL) and which click it belongs to (the stored click ID).
Campaign click: ExoClick replaces {conversions_tracking} | Conversion delivery: Redsoft replaces {external_click_id} with the complete stored click ID7Trigger a Google Ads browser eventHow several package conversions can work on the same page
What to do
Load the main Google tag once. Save the relevant Google Ads send_to value against each Redsoft event, for example one for registration and separate values for Package 1 and Package 2.
How it works
After the application receives the verified Redsoft result, browser code selects only that event’s send_to value and runs one gtag('event', 'conversion', ...) command with the correct transaction ID. If the payment is confirmed after the visitor left the page, the event fires on their next page load.
Why this is needed
If every snippet ran from the header, Google would receive conversions that did not happen. Only the confirmed event may fire. This is a browser event, not S2S.
Package 2 confirmed → select Package 2 send_to → fire one Google conversion event8Handle missing IDs, failures and duplicatesIdempotency keys and automatic retries
What to do
Always record the event internally. Before sending, check that the user has a click ID and that this exact conversion was not already delivered. If the platform fails, retry automatically.
How it works
Build an idempotency key such as TRACKING-SETUP-1 + first_purchase + USER-5531 (or + ORDER-1001 for purchases). If a delivered row with that key exists, skip it. On a timeout or 5xx answer, retry after 1 min, 5 min, 30 min, 2 h and 6 h. A 4xx answer means a wrong URL, so mark it Failed straight away.
Why this is needed
Networks must not receive invented IDs. Payment providers often send the same notice twice, and visitors reload pages. Without these checks, purchases would be counted twice.
record internal eventskip missing click IDskip duplicatesretry temporary failures9Show every delivery in the postback logSelf-service troubleshooting for affiliates
What to do
Write one log row per delivery attempt group: time, event, campaign, link, click ID, final URL, HTTP status, response body (first 500 characters), attempts and status. Show it to the affiliate, filtered to their own campaigns.
How it works
Statuses: Delivered, Retrying, Failed, Skipped · no click ID, Skipped · duplicate, Test. A failed row has a Retry button after the affiliate fixes the setup.
Why this is needed
When an affiliate says “ExoClick shows fewer conversions than you”, the log answers it in seconds. Without it, every question becomes a developer ticket.
10Send test postbacks before going liveA safe rollout
What to do
Check that every URL is valid and contains {external_click_id}. Then let the affiliate press “Send test” for each event. Redsoft sends a real request with a test click ID and shows the answer.
How it works
The test is logged with the status Test and never counts as a conversion in Redsoft. Most platforms show the test conversion in their own tracking or debug page, which proves the goal ID is correct.
Why this is needed
A valid-looking URL can still have the wrong goal. Testing catches that before real money is spent. Roll out on one campaign first, compare numbers, then expand.
check URLs → send test → see it arrive in the platform → enable one campaign → compare results → expandDeveloper spec
Tables, processing steps and delivery rules behind the screens in this prototype. A starting point, to be adapted to Redsoft’s architecture.
1. Data model
Suggested tables and the fields that matter. Names are suggestions.
campaign
id· e.g. DR-EXO-UK-001affiliate_idname,countrytracking_setup_id(nullable)statusdraft / active / paused
campaign_link
id· e.g. LINK-GG-01campaign_idtypeMTL / VTLdestination,route(e.g. srcm=gg)- generated URL (with click parameter)
tracking_setup
id· e.g. TRACKING-SETUP-1affiliate_id,nameintegration_typecustom_s2s / google_browserplatform_presetclick_param(cid),click_macro
event_rule
tracking_setup_idevent_nameregistration / first_purchase / purchase / package_1…4enabledpostback_urlorgoogle_send_to
click
idexternal_click_id(full value, unchanged)campaign_id,campaign_link_idtracking_setup_id(snapshot at click time)visitor_id(cookie),clicked_at
user (new fields)
attributed_click_idattributed_at- set once at signup, never overwritten
conversion_event
id(used as{event_id})user_id,event_nameorder_id,package_tieroccurred_at
postback_delivery
conversion_event_id,event_rule_ididempotency_key(unique)final_url,status,attemptshttp_status,response_snippetnext_retry_at,is_test
2. Processing steps
What happens on each trigger.
When a setup is assigned to a campaign
- Read the setup’s
click_paramandclick_macro(from the preset or typed by the affiliate). - Add
click_param=click_macroto every MTL/VTL link of the campaign (e.g.cid={conversions_tracking}). - Regenerate the links when the setup or its preset changes, and when a new link is added.
On landing (any campaign link)
- Read the setup’s
click_paramfrom the URL. - If present: insert a
clickrow and set a first-party cookie with the visitor ID (30 days). - Do this before any redirect, and keep the value exactly as received.
On signup
- Find the visitor’s clicks from the last 30 days.
- Pick the newest (last click).
- Save it on the user as
attributed_click_id. Never change it later. - Raise
registration.
On confirmed payment
- Raise
purchaseandpackage_N. - If it is the user’s first successful payment, also raise
first_purchase. - Only from the verified payment result, never from the browser.
For each raised event
- Store
conversion_event. - No attributed click → log “Skipped · no click ID”.
- Load the setup’s rule for this event. Not enabled → stop.
- Build the key. Already delivered → log “Skipped · duplicate”.
- Fill the placeholders (URL-encoded), queue the request.
3. Delivery & security rules
| Sending | Background queue, not inside the signup/payment request. HTTP GET, 10-second timeout, follow at most 3 redirects. |
|---|---|
| Success | Any 2xx answer. |
| Retries | Timeout or 5xx → retry after 1 min, 5 min, 30 min, 2 h, 6 h, then Failed. 4xx → Failed immediately. |
| Duplicates | Unique idempotency_key = setup + event + (user ID for once-only events, order ID for purchases). |
| Placeholders | Only the listed Redsoft placeholders are allowed. Unknown {…} tokens are rejected on save. Values are URL-encoded when filled in. |
| URL safety | Allow only http/https to public hosts. Block localhost, private IP ranges and internal hostnames (protects against SSRF). Prefer https and warn on http. |
| Privacy | Never put e-mail, username or other personal data into postbacks. Only the IDs listed on the Redsoft values page. |
| Log retention | Suggest 90 days visible to affiliates. |
| Tests | Use click ID REDSOFT_TEST_<random>, mark is_test, never count as a conversion internally. |
4. Platform presets
Starting values. Each one must be checked against the platform’s current documentation, or with a test conversion, before release. Words in CAPITALS are filled in by the affiliate.
| Platform | Type | Click macro on the link | Postback template (Redsoft side) |
|---|
5. Open questions for the developers
To agree in the kickoff meeting.
- How is a payment confirmed today (payment-provider callback, polling)? How quickly? This decides when purchase postbacks and Google events fire.
- Where can the landing request reliably capture the click parameter, before any redirects or caching?
- Is there an existing queue/worker system to use for sending and retries?
- How do we identify a visitor before signup (cookie name, lifetime, consent rules)?
- Where should the Google browser event fire when the visitor has already left the payment page?
- Who verifies the platform presets, and how often are they reviewed?