social ads engine module screens

This commit is contained in:
Mayur Shinde
2026-06-12 13:22:03 +05:30
parent ed87e097f1
commit e53c38ce59
31 changed files with 5406 additions and 2 deletions
+67
View File
@@ -0,0 +1,67 @@
/**
* utm.js — trackable campaign links (spec §7 `utm_links` entity).
*
* Mints a UTM-tagged URL to the public landing page so every ad click is attributable
* end-to-end (source / medium / campaign / content / term → destination). Front-end
* demo: pure string building, no shortener or backend.
*/
// Use the running app's origin so the copied link opens the demo landing page; in a
// real deployment this resolves to your public site (swap to your domain when hosting).
const ORIGIN = (typeof window !== 'undefined' && window.location?.origin) || 'https://lynkeduppro.com';
const BASE = `${ORIGIN}/ads/lp`;
// Ad medium by platform (search vs paid social vs messaging).
const MEDIUM = {
google: 'paid_search',
meta: 'paid_social',
linkedin: 'paid_social',
reddit: 'paid_social',
nextdoor: 'paid_social',
whatsapp: 'messaging',
};
const slug = (s) => (s || '')
.toLowerCase()
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '')
.slice(0, 60);
/**
* Build the tracked link + its utm_links field breakdown for a campaign.
* Returns { url, fields }.
*/
export function buildUtm(campaign, { creative } = {}) {
const source = campaign.platform;
const medium = MEDIUM[source] || 'paid';
const name = slug(campaign.name) || campaign.blueprintId || 'campaign';
const content = creative ? (slug(creative.headline) || creative.id) : (campaign.creativeId || 'default');
const term = campaign.serviceType || '';
const params = {
c: campaign.blueprintId,
src: source,
utm_source: source,
utm_medium: medium,
utm_campaign: name,
utm_content: content,
utm_term: term,
};
const qs = Object.entries(params)
.filter(([, v]) => v)
.map(([k, v]) => `${k}=${encodeURIComponent(v)}`)
.join('&');
return {
url: `${BASE}?${qs}`,
fields: {
campaignId: campaign.id || null,
source,
medium,
campaign: name,
content,
term,
destinationUrl: BASE,
},
};
}