@mj-biz-apps/marketing-server 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/adConversionParity.test.d.ts +2 -0
- package/dist/__tests__/adConversionParity.test.d.ts.map +1 -0
- package/dist/__tests__/adConversionParity.test.js +165 -0
- package/dist/__tests__/adConversionParity.test.js.map +1 -0
- package/dist/__tests__/googleCreativeImage.test.d.ts +2 -0
- package/dist/__tests__/googleCreativeImage.test.d.ts.map +1 -0
- package/dist/__tests__/googleCreativeImage.test.js +53 -0
- package/dist/__tests__/googleCreativeImage.test.js.map +1 -0
- package/dist/programs/google/GoogleAdsClient.d.ts +38 -3
- package/dist/programs/google/GoogleAdsClient.d.ts.map +1 -1
- package/dist/programs/google/GoogleAdsClient.js +96 -14
- package/dist/programs/google/GoogleAdsClient.js.map +1 -1
- package/dist/programs/google/GoogleAdsProgramDriver.d.ts +19 -1
- package/dist/programs/google/GoogleAdsProgramDriver.d.ts.map +1 -1
- package/dist/programs/google/GoogleAdsProgramDriver.js +155 -15
- package/dist/programs/google/GoogleAdsProgramDriver.js.map +1 -1
- package/dist/programs/google/googleBrandAssets.d.ts +6 -2
- package/dist/programs/google/googleBrandAssets.d.ts.map +1 -1
- package/dist/programs/google/googleBrandAssets.js +12 -3
- package/dist/programs/google/googleBrandAssets.js.map +1 -1
- package/dist/programs/linkedin/LinkedInAdsProgramDriver.d.ts.map +1 -1
- package/dist/programs/linkedin/LinkedInAdsProgramDriver.js +4 -3
- package/dist/programs/linkedin/LinkedInAdsProgramDriver.js.map +1 -1
- package/dist/programs/meta/MetaAdsClient.d.ts +44 -1
- package/dist/programs/meta/MetaAdsClient.d.ts.map +1 -1
- package/dist/programs/meta/MetaAdsClient.js +64 -5
- package/dist/programs/meta/MetaAdsClient.js.map +1 -1
- package/dist/programs/meta/MetaAdsProgramDriver.d.ts +13 -1
- package/dist/programs/meta/MetaAdsProgramDriver.d.ts.map +1 -1
- package/dist/programs/meta/MetaAdsProgramDriver.js +128 -20
- package/dist/programs/meta/MetaAdsProgramDriver.js.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adConversionParity.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/adConversionParity.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { GoogleAdsClient } from '../programs/google/GoogleAdsClient.js';
|
|
3
|
+
import { MetaAdsClient, customConversionActionType, metaCallToActionFor, metaObjectiveFor } from '../programs/meta/MetaAdsClient.js';
|
|
4
|
+
import { MetaAdsProgramDriver } from '../programs/meta/MetaAdsProgramDriver.js';
|
|
5
|
+
function googleClient(answer) {
|
|
6
|
+
const calls = [];
|
|
7
|
+
const fetchImpl = (async (input, init) => {
|
|
8
|
+
const url = String(input);
|
|
9
|
+
calls.push({ url, init });
|
|
10
|
+
if (url.endsWith('/token'))
|
|
11
|
+
return new Response(JSON.stringify({ access_token: 't', expires_in: 3600 }), { status: 200 });
|
|
12
|
+
const body = init?.body ? JSON.parse(String(init.body)) : null;
|
|
13
|
+
return new Response(JSON.stringify(answer(url, body)), { status: 200 });
|
|
14
|
+
});
|
|
15
|
+
return { client: new GoogleAdsClient({ clientId: 'c', clientSecret: 's', refreshToken: 'r', customerId: '4684433735', fetchImpl }), calls };
|
|
16
|
+
}
|
|
17
|
+
const queryOf = (c) => JSON.parse(String(c.init?.body)).query ?? '';
|
|
18
|
+
describe('GoogleAdsClient — conversion actions (D-34 parity)', () => {
|
|
19
|
+
it('lists the customer\'s conversion actions by id, with whether the account counts them by default', async () => {
|
|
20
|
+
const { client, calls } = googleClient(() => [{ results: [
|
|
21
|
+
{ conversionAction: { resourceName: 'customers/4684433735/conversionActions/7845520214', id: '7845520214', name: 'Ascend Book Download - Google - Form Submission', status: 'ENABLED', category: 'SUBMIT_LEAD_FORM', origin: 'WEBSITE', primaryForGoal: false, includeInConversionsMetric: false } },
|
|
22
|
+
{ conversionAction: { resourceName: 'customers/4684433735/conversionActions/7217103107', id: '7217103107', name: 'SC | GA4 | Purchase', status: 'ENABLED', category: 'PURCHASE', origin: 'WEBSITE', primaryForGoal: true, includeInConversionsMetric: true } },
|
|
23
|
+
{ conversionAction: { resourceName: 'customers/4684433735/conversionActions/1', id: '1', name: 'Paused one', status: 'PAUSED', primaryForGoal: true } },
|
|
24
|
+
] }]);
|
|
25
|
+
const actions = await client.conversionActions();
|
|
26
|
+
expect(actions.map(a => [a.id, a.enabled, a.countsByDefault])).toEqual([['7845520214', true, false], ['7217103107', true, true], ['1', false, true]]);
|
|
27
|
+
expect(queryOf(calls[1])).toContain("FROM conversion_action WHERE conversion_action.status != 'REMOVED'");
|
|
28
|
+
expect(await client.findConversionActionById(' 7845520214 ')).toMatchObject({ name: 'Ascend Book Download - Google - Form Submission' });
|
|
29
|
+
expect(await client.findConversionActionById('999')).toBeNull();
|
|
30
|
+
});
|
|
31
|
+
it('creates a one-action custom goal named after the action and points the campaign at it with a CAMPAIGN-level goal config', async () => {
|
|
32
|
+
const { client, calls } = googleClient((url) => url.includes('customConversionGoals') ? { results: [{ resourceName: 'customers/4684433735/customConversionGoals/55' }] } : url.includes('searchStream') ? [] : { results: [{ resourceName: 'x' }] });
|
|
33
|
+
const goal = await client.ensureCustomConversionGoal('customers/4684433735/conversionActions/7845520214', 'Marketing: Ascend Book Download - Google - Form Submission');
|
|
34
|
+
expect(goal).toBe('customers/4684433735/customConversionGoals/55');
|
|
35
|
+
const lookup = calls.find(c => c.url.includes('searchStream'));
|
|
36
|
+
expect(queryOf(lookup)).toContain('FROM custom_conversion_goal');
|
|
37
|
+
const create = calls.find(c => c.url.includes('customConversionGoals:mutate'));
|
|
38
|
+
expect(JSON.parse(String(create.init?.body))).toEqual({ operations: [{ create: { name: 'Marketing: Ascend Book Download - Google - Form Submission', conversionActions: ['customers/4684433735/conversionActions/7845520214'], status: 'ENABLED' } }] });
|
|
39
|
+
await client.setCampaignConversionGoal('customers/4684433735/campaigns/24313683017', goal);
|
|
40
|
+
const point = calls.find(c => c.url.includes('conversionGoalCampaignConfigs:mutate'));
|
|
41
|
+
expect(JSON.parse(String(point.init?.body))).toEqual({ operations: [{
|
|
42
|
+
update: { resourceName: 'customers/4684433735/conversionGoalCampaignConfigs/24313683017', goalConfigLevel: 'CAMPAIGN', customConversionGoal: goal },
|
|
43
|
+
updateMask: 'goal_config_level,custom_conversion_goal',
|
|
44
|
+
}] });
|
|
45
|
+
// Google allows ONE goal per action list on the customer: an existing goal holding exactly this action is reused
|
|
46
|
+
// as is (whoever made it, whatever its name), a goal holding more actions is not a match.
|
|
47
|
+
const { client: adoptingClient, calls: adoptCalls } = googleClient(() => [{ results: [
|
|
48
|
+
{ customConversionGoal: { resourceName: 'customers/4684433735/customConversionGoals/9', name: 'Agency bundle', conversionActions: ['customers/4684433735/conversionActions/7845520214', 'customers/4684433735/conversionActions/7217103107'] } },
|
|
49
|
+
{ customConversionGoal: { resourceName: 'customers/4684433735/customConversionGoals/6459699002', name: 'CG-01 — conversion goal', conversionActions: ['customers/4684433735/conversionActions/7845520214'] } },
|
|
50
|
+
] }]);
|
|
51
|
+
expect(await adoptingClient.ensureCustomConversionGoal('customers/4684433735/conversionActions/7845520214', 'Marketing: whatever')).toBe('customers/4684433735/customConversionGoals/6459699002');
|
|
52
|
+
expect(adoptCalls.some(c => c.url.includes('customConversionGoals:mutate'))).toBe(false);
|
|
53
|
+
});
|
|
54
|
+
it('measures the named action alone (all_conversions segmented by it) and leaves impressions, clicks and cost unsegmented', async () => {
|
|
55
|
+
const { client, calls } = googleClient((_url, body) => {
|
|
56
|
+
const q = body.query;
|
|
57
|
+
return q.includes('segments.conversion_action')
|
|
58
|
+
? [{ results: [{ metrics: { allConversions: 3 } }] }]
|
|
59
|
+
: [{ results: [{ metrics: { impressions: 1000, clicks: 40, conversions: 0, costMicros: 12_500_000 } }] }];
|
|
60
|
+
});
|
|
61
|
+
const m = await client.campaignMetrics(['customers/4684433735/campaigns/1'], new Date('2026-10-01T00:00:00Z'), new Date('2026-10-14T00:00:00Z'), 'customers/4684433735/conversionActions/7845520214');
|
|
62
|
+
expect(m).toEqual({ impressions: 1000, clicks: 40, conversions: 3, spendUsd: 12.5 });
|
|
63
|
+
const queries = calls.filter(c => c.url.includes('searchStream')).map(queryOf);
|
|
64
|
+
expect(queries).toHaveLength(2);
|
|
65
|
+
expect(queries[0]).not.toContain('segments.conversion_action');
|
|
66
|
+
expect(queries[1]).toContain("SELECT metrics.all_conversions FROM campaign WHERE campaign.resource_name IN ('customers/4684433735/campaigns/1') AND segments.date BETWEEN '2026-10-01' AND '2026-10-14' AND segments.conversion_action = 'customers/4684433735/conversionActions/7845520214'");
|
|
67
|
+
const plain = await client.campaignMetrics(['customers/4684433735/campaigns/1'], new Date('2026-10-01T00:00:00Z'), new Date('2026-10-14T00:00:00Z'));
|
|
68
|
+
expect(plain.conversions).toBe(0);
|
|
69
|
+
expect(calls.filter(c => c.url.includes('searchStream'))).toHaveLength(3);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
function metaClient(answer) {
|
|
73
|
+
const calls = [];
|
|
74
|
+
const fetchImpl = (async (input, init) => {
|
|
75
|
+
const url = new URL(String(input));
|
|
76
|
+
const body = init?.body instanceof URLSearchParams ? init.body : null;
|
|
77
|
+
calls.push({ url, body });
|
|
78
|
+
return new Response(JSON.stringify(answer(url, body)), { status: 200 });
|
|
79
|
+
});
|
|
80
|
+
return { client: new MetaAdsClient({ appSecret: 's', accessToken: 't', adAccountId: 'act_2312673322359408', fetchImpl }), calls };
|
|
81
|
+
}
|
|
82
|
+
describe('MetaAdsClient — custom conversions (D-34 parity)', () => {
|
|
83
|
+
it('lists custom conversions by id with archived ones disabled, and finds one by id', async () => {
|
|
84
|
+
const { client, calls } = metaClient(() => ({ data: [
|
|
85
|
+
{ id: '795683087750734', name: 'SC | Ascend Download', custom_event_type: 'LEAD', is_archived: false, pixel: { id: '415938279713144' } },
|
|
86
|
+
{ id: '167817987988570', name: 'Newsletter Subscribe', custom_event_type: 'SUBSCRIBE', is_archived: true, pixel: { id: '415938279713144' } },
|
|
87
|
+
] }));
|
|
88
|
+
const list = await client.customConversions();
|
|
89
|
+
expect(list).toEqual([
|
|
90
|
+
{ id: '795683087750734', name: 'SC | Ascend Download', enabled: true, customEventType: 'LEAD', pixelId: '415938279713144' },
|
|
91
|
+
{ id: '167817987988570', name: 'Newsletter Subscribe', enabled: false, customEventType: 'SUBSCRIBE', pixelId: '415938279713144' },
|
|
92
|
+
]);
|
|
93
|
+
expect(calls[0].url.pathname).toBe('/v21.0/act_2312673322359408/customconversions');
|
|
94
|
+
expect(calls[0].url.searchParams.get('fields')).toBe('id,name,custom_event_type,is_archived,pixel{id}');
|
|
95
|
+
expect(await client.findCustomConversionById('795683087750734')).toMatchObject({ name: 'SC | Ascend Download' });
|
|
96
|
+
});
|
|
97
|
+
it('creates the ad set optimising for the custom conversion (custom_conversion_id only — Meta 400s 100/1885014 if pixel_id is included), and the campaign under the objective the conversion calls for', async () => {
|
|
98
|
+
const { client, calls } = metaClient(() => ({ id: '120' }));
|
|
99
|
+
await client.createCampaign({ name: 'CX-05 — campaign', status: 'PAUSED', objective: 'OUTCOME_LEADS' });
|
|
100
|
+
expect(calls[0].body?.get('objective')).toBe('OUTCOME_LEADS');
|
|
101
|
+
await client.createAdSet({ name: 'CX-05 — ad set', campaignId: '120', dailyBudgetUsd: 25, status: 'PAUSED', runSchedule: { start: 1_792_000_000_000 }, countries: ['US'], conversion: { customConversionId: '795683087750734', pixelId: '415938279713144' } });
|
|
102
|
+
const adSet = calls[1].body;
|
|
103
|
+
expect(adSet.get('optimization_goal')).toBe('OFFSITE_CONVERSIONS');
|
|
104
|
+
expect(JSON.parse(adSet.get('promoted_object'))).toEqual({ custom_conversion_id: '795683087750734' });
|
|
105
|
+
await client.createAdSet({ name: 'CX-06 — ad set', campaignId: '120', dailyBudgetUsd: 25, status: 'PAUSED', runSchedule: { start: 1_792_000_000_000 }, countries: ['US'] });
|
|
106
|
+
expect(calls[2].body?.get('optimization_goal')).toBe('LINK_CLICKS');
|
|
107
|
+
expect(calls[2].body?.has('promoted_object')).toBe(false);
|
|
108
|
+
});
|
|
109
|
+
it('counts only the named conversion\'s action when one is given, every offsite/lead action otherwise', async () => {
|
|
110
|
+
const rows = { data: [{ impressions: '500', clicks: '20', spend: '10.5', actions: [
|
|
111
|
+
{ action_type: 'offsite_conversion.custom.795683087750734', value: '2' },
|
|
112
|
+
{ action_type: 'offsite_conversion.fb_pixel_lead', value: '5' },
|
|
113
|
+
{ action_type: 'link_click', value: '20' },
|
|
114
|
+
] }] };
|
|
115
|
+
const { client } = metaClient(() => rows);
|
|
116
|
+
expect((await client.adSetMetrics(['1'], new Date('2026-10-01T00:00:00Z'), new Date('2026-10-14T00:00:00Z'), '795683087750734')).conversions).toBe(2);
|
|
117
|
+
expect((await client.adSetMetrics(['1'], new Date('2026-10-01T00:00:00Z'), new Date('2026-10-14T00:00:00Z'))).conversions).toBe(7);
|
|
118
|
+
expect(customConversionActionType('795683087750734')).toBe('offsite_conversion.custom.795683087750734');
|
|
119
|
+
});
|
|
120
|
+
it('serves the authored primary text and the lever\'s call to action on the link ad (KI-162)', async () => {
|
|
121
|
+
const { client, calls } = metaClient(() => ({ id: '2300' }));
|
|
122
|
+
await client.createCreative({ name: 'CX-07 — creative', pageId: '519210931614315', link: 'https://sidecar.ai/ai?utm_campaign=CX-07', message: 'Your board expects an AI plan. Ascend gives you the roadmap.', headline: 'Master AI Strategy', description: 'Download the free Ascend ebook.', imageHash: 'abc', callToAction: 'DOWNLOAD' });
|
|
123
|
+
const spec = JSON.parse(calls[0].body.get('object_story_spec'));
|
|
124
|
+
expect(spec.page_id).toBe('519210931614315');
|
|
125
|
+
expect(spec.link_data['message']).toBe('Your board expects an AI plan. Ascend gives you the roadmap.');
|
|
126
|
+
expect(spec.link_data['call_to_action']).toEqual({ type: 'DOWNLOAD', value: { link: 'https://sidecar.ai/ai?utm_campaign=CX-07' } });
|
|
127
|
+
await client.createCreative({ name: 'CX-08 — creative', pageId: '1', link: 'https://x', message: 'm', headline: 'h', description: null, imageHash: null });
|
|
128
|
+
expect(JSON.parse(calls[1].body.get('object_story_spec')).link_data.call_to_action.type).toBe('LEARN_MORE');
|
|
129
|
+
});
|
|
130
|
+
it('maps the shared call-to-action lever onto Meta\'s labels, LEARN_MORE when there is no counterpart', () => {
|
|
131
|
+
expect(metaCallToActionFor('DOWNLOAD')).toBe('DOWNLOAD');
|
|
132
|
+
expect(metaCallToActionFor('REGISTER')).toBe('SIGN_UP');
|
|
133
|
+
expect(metaCallToActionFor('APPLY')).toBe('APPLY_NOW');
|
|
134
|
+
expect(metaCallToActionFor('VIEW_QUOTE')).toBe('GET_QUOTE');
|
|
135
|
+
expect(metaCallToActionFor('REQUEST_DEMO')).toBe('CONTACT_US');
|
|
136
|
+
expect(metaCallToActionFor('LEARN_MORE')).toBe('LEARN_MORE');
|
|
137
|
+
expect(metaCallToActionFor(null)).toBe('LEARN_MORE');
|
|
138
|
+
});
|
|
139
|
+
it('picks the ODAX objective from the conversion\'s event class', () => {
|
|
140
|
+
expect(metaObjectiveFor(null)).toBe('OUTCOME_TRAFFIC');
|
|
141
|
+
expect(metaObjectiveFor({ id: '1', name: 'x', enabled: true, customEventType: 'LEAD', pixelId: null })).toBe('OUTCOME_LEADS');
|
|
142
|
+
expect(metaObjectiveFor({ id: '1', name: 'x', enabled: true, customEventType: 'complete_registration', pixelId: null })).toBe('OUTCOME_LEADS');
|
|
143
|
+
expect(metaObjectiveFor({ id: '1', name: 'x', enabled: true, customEventType: 'PURCHASE', pixelId: null })).toBe('OUTCOME_SALES');
|
|
144
|
+
expect(metaObjectiveFor({ id: '1', name: 'x', enabled: true, customEventType: 'OTHER', pixelId: null })).toBe('OUTCOME_SALES');
|
|
145
|
+
});
|
|
146
|
+
it('checks creativeIntroText against Meta\'s 125-character primary-text threshold at propose (MA_PRIMARY_TEXT_LONG)', async () => {
|
|
147
|
+
const driver = new MetaAdsProgramDriver();
|
|
148
|
+
const makeProgram = (creativeIntroText) => ({
|
|
149
|
+
id: 'P1', brandId: 'B1',
|
|
150
|
+
params: {
|
|
151
|
+
campaignCode: 'CX-07',
|
|
152
|
+
tacticConfigJSON: JSON.stringify({
|
|
153
|
+
audience: 'targeted', dailyBudgetUsd: 25, landingPageUrl: 'https://sidecar.ai/ai',
|
|
154
|
+
optimizeFor: 'clicks', creativeHeadlines: ['Master AI Strategy'], creativeDescriptions: ['Free Ascend ebook'],
|
|
155
|
+
creativeIntroText,
|
|
156
|
+
}),
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
const long = await driver.validateProposal(makeProgram('A'.repeat(140)));
|
|
160
|
+
expect(long.find(i => i.code === 'MA_PRIMARY_TEXT_LONG')).toMatchObject({ severity: 'notice', code: 'MA_PRIMARY_TEXT_LONG' });
|
|
161
|
+
const short = await driver.validateProposal(makeProgram('Your board expects an AI plan. Ascend gives you the roadmap.'));
|
|
162
|
+
expect(short.find(i => i.code === 'MA_PRIMARY_TEXT_LONG')).toBeUndefined();
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=adConversionParity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adConversionParity.test.js","sourceRoot":"","sources":["../../src/__tests__/adConversionParity.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"googleCreativeImage.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/googleCreativeImage.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { GoogleAdsProgramDriver } from '../programs/google/GoogleAdsProgramDriver.js';
|
|
3
|
+
/** A PNG whose IHDR says width×height — enough for the header-only dimension reader. */
|
|
4
|
+
function png(width, height) {
|
|
5
|
+
const b = new Uint8Array(33);
|
|
6
|
+
b.set([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a], 0);
|
|
7
|
+
const dv = new DataView(b.buffer);
|
|
8
|
+
dv.setUint32(8, 13);
|
|
9
|
+
b.set([0x49, 0x48, 0x44, 0x52], 12);
|
|
10
|
+
dv.setUint32(16, width);
|
|
11
|
+
dv.setUint32(20, height);
|
|
12
|
+
return b;
|
|
13
|
+
}
|
|
14
|
+
const user = { ID: 'U1', Email: 'harness@example.test' };
|
|
15
|
+
const ctx = async () => ({ ok: true, client: { conversionActions: async () => [], findConversionActionById: async () => null }, brandConnectionId: 'C1', customerId: '4684433735', brandAssets: null, launchState: 'Paused' });
|
|
16
|
+
const program = (levers) => ({ id: 'P1', brandId: 'B1', params: { tacticConfigJSON: JSON.stringify({ audience: 'targeted', dailyBudgetUsd: 25, landingPageUrl: 'https://sidecar.ai/ai', optimizeFor: 'clicks', creativeHeadlines: ['Free Ebook'], creativeDescriptions: ['Download it'], ...levers }) } });
|
|
17
|
+
describe('GoogleAdsProgramDriver — the program image is held to Google\'s landscape slot at propose (KI-156)', () => {
|
|
18
|
+
afterEach(() => vi.unstubAllGlobals());
|
|
19
|
+
it('refuses a 16:9 generator frame with GA_CREATIVE_IMAGE_RATIO naming the size', async () => {
|
|
20
|
+
vi.stubGlobal('fetch', async () => new Response(Buffer.from(png(1376, 768)), { status: 200, headers: { 'content-type': 'image/png' } }));
|
|
21
|
+
const issues = await new GoogleAdsProgramDriver(user, ctx).validateProposal(program({ creativeImageUrl: 'https://example.test/ad.png' }));
|
|
22
|
+
const hit = issues.find(i => i.code === 'GA_CREATIVE_IMAGE_RATIO');
|
|
23
|
+
expect(hit?.severity).toBe('error');
|
|
24
|
+
expect(hit?.message).toMatch(/1376×768/);
|
|
25
|
+
expect(hit?.message).toMatch(/1\.91:1/);
|
|
26
|
+
});
|
|
27
|
+
it('accepts a 1.91:1 image and says nothing', async () => {
|
|
28
|
+
vi.stubGlobal('fetch', async () => new Response(Buffer.from(png(1200, 628)), { status: 200, headers: { 'content-type': 'image/png' } }));
|
|
29
|
+
const issues = await new GoogleAdsProgramDriver(user, ctx).validateProposal(program({ creativeImageUrl: 'https://example.test/ad.png' }));
|
|
30
|
+
expect(issues.filter(i => i.code.startsWith('GA_CREATIVE_IMAGE'))).toEqual([]);
|
|
31
|
+
});
|
|
32
|
+
it('warns, never refuses, when the image cannot be fetched', async () => {
|
|
33
|
+
vi.stubGlobal('fetch', async () => { throw new Error('ECONNRESET'); });
|
|
34
|
+
const issues = await new GoogleAdsProgramDriver(user, ctx).validateProposal(program({ creativeImageUrl: 'https://example.test/ad.png' }));
|
|
35
|
+
const hit = issues.find(i => i.code === 'GA_CREATIVE_IMAGE_UNREACHABLE');
|
|
36
|
+
expect(hit?.severity).toBe('warning');
|
|
37
|
+
expect(hit?.message).not.toMatch(/fall back/);
|
|
38
|
+
});
|
|
39
|
+
it('reports GA_CREATIVE_IMAGE_INVALID when the URL serves a non-image content-type', async () => {
|
|
40
|
+
vi.stubGlobal('fetch', async () => new Response('<html>not an image</html>', { status: 200, headers: { 'content-type': 'text/html' } }));
|
|
41
|
+
const issues = await new GoogleAdsProgramDriver(user, ctx).validateProposal(program({ creativeImageUrl: 'https://example.test/page' }));
|
|
42
|
+
const hit = issues.find(i => i.code === 'GA_CREATIVE_IMAGE_INVALID');
|
|
43
|
+
expect(hit?.severity).toBe('error');
|
|
44
|
+
expect(hit?.message).toMatch(/PNG or JPEG required/);
|
|
45
|
+
});
|
|
46
|
+
it('does not fetch anything when no image lever is set', async () => {
|
|
47
|
+
const f = vi.fn();
|
|
48
|
+
vi.stubGlobal('fetch', f);
|
|
49
|
+
await new GoogleAdsProgramDriver(user, ctx).validateProposal(program({}));
|
|
50
|
+
expect(f).not.toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=googleCreativeImage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"googleCreativeImage.test.js","sourceRoot":"","sources":["../../src/__tests__/googleCreativeImage.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,21 @@ export interface GoogleCampaignMetrics {
|
|
|
26
26
|
conversions: number;
|
|
27
27
|
spendUsd: number;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* A conversion action the customer defines (a form submit, a download, a GA4 event) — the platform OBJECT a program's
|
|
31
|
+
* `conversionId` lever points at (D-34). `enabled` mirrors LinkedIn's flag: ENABLED status. `countsByDefault` says
|
|
32
|
+
* whether the account already counts it in `metrics.conversions` (primary + included); a secondary action counts
|
|
33
|
+
* only through the campaign's custom goal, which is why lock sets one and measurement filters by the action.
|
|
34
|
+
*/
|
|
35
|
+
export interface GoogleConversionAction {
|
|
36
|
+
id: string;
|
|
37
|
+
resourceName: string;
|
|
38
|
+
name: string;
|
|
39
|
+
enabled: boolean;
|
|
40
|
+
category: string | null;
|
|
41
|
+
origin: string | null;
|
|
42
|
+
countsByDefault: boolean;
|
|
43
|
+
}
|
|
29
44
|
export declare class GoogleAdsClient {
|
|
30
45
|
private readonly config;
|
|
31
46
|
private readonly fetchImpl;
|
|
@@ -43,6 +58,21 @@ export declare class GoogleAdsClient {
|
|
|
43
58
|
budgetResourceName: string;
|
|
44
59
|
status?: 'ENABLED' | 'PAUSED';
|
|
45
60
|
}): Promise<string>;
|
|
61
|
+
/** The customer's live conversion actions — what a program may name by id (R5, D-34). */
|
|
62
|
+
conversionActions(): Promise<GoogleConversionAction[]>;
|
|
63
|
+
/** The conversion action with this id, or null — the levers carry ids, never names (D-34). */
|
|
64
|
+
findConversionActionById(id: string): Promise<GoogleConversionAction | null>;
|
|
65
|
+
/**
|
|
66
|
+
* The custom conversion goal holding exactly this action — found by its ACTION LIST, created only when none exists;
|
|
67
|
+
* returns its resource name. Google optimises and counts a campaign against its GOALS, not against an action
|
|
68
|
+
* directly, and allows ONE goal per action list on the customer (`DUPLICATE_CONVERSION_ACTION_LIST`, live on
|
|
69
|
+
* Sidecar.ai 2026-10-28 when CG-02 tried to make its own after CG-01's): a goal belongs to the action, so every
|
|
70
|
+
* program naming the action shares it. A goal the customer made themselves is reused as is — never renamed.
|
|
71
|
+
* `name` is used only for a goal this call creates.
|
|
72
|
+
*/
|
|
73
|
+
ensureCustomConversionGoal(conversionActionResourceName: string, name: string): Promise<string>;
|
|
74
|
+
/** Points the campaign at a custom goal (CAMPAIGN-level goal config instead of the account default). */
|
|
75
|
+
setCampaignConversionGoal(campaignResourceName: string, customConversionGoalResourceName: string): Promise<void>;
|
|
46
76
|
/** Creates the Display ad group targeting lives on; returns its resource name. */
|
|
47
77
|
createAdGroup(name: string, campaignResourceName: string): Promise<string>;
|
|
48
78
|
/**
|
|
@@ -59,7 +89,7 @@ export declare class GoogleAdsClient {
|
|
|
59
89
|
* (creating blind 400s with NAME_ALREADY_USED / DUPLICATE_NAME).
|
|
60
90
|
* `campaignScope` narrows ad_group lookups, whose names are only unique per campaign.
|
|
61
91
|
*/
|
|
62
|
-
findByName(resource: 'user_list' | 'campaign_budget' | 'campaign' | 'ad_group', name: string, campaignScope?: string): Promise<string | null>;
|
|
92
|
+
findByName(resource: 'user_list' | 'campaign_budget' | 'campaign' | 'ad_group' | 'custom_conversion_goal', name: string, campaignScope?: string): Promise<string | null>;
|
|
63
93
|
/** Creates a website-visitor remarketing list (rule shape verified in the spike). */
|
|
64
94
|
createRemarketingList(name: string, membershipDays: number): Promise<string>;
|
|
65
95
|
/** Uploads an image asset (base64 PNG/JPEG); returns its resource name. */
|
|
@@ -82,8 +112,13 @@ export declare class GoogleAdsClient {
|
|
|
82
112
|
}): Promise<string>;
|
|
83
113
|
setCampaignStatus(campaignResourceName: string, status: 'ENABLED' | 'PAUSED'): Promise<void>;
|
|
84
114
|
setDailyBudget(budgetResourceName: string, dailyBudgetUsd: number): Promise<void>;
|
|
85
|
-
/**
|
|
86
|
-
|
|
115
|
+
/**
|
|
116
|
+
* Summed metrics for the campaigns over [from, to] — the Inferred input. With a conversion action named (D-34
|
|
117
|
+
* parity), `conversions` is THAT action's count only (`metrics.all_conversions` segmented by the action, so a
|
|
118
|
+
* secondary action the account does not count by default is still counted); without one it is the account's
|
|
119
|
+
* default conversions figure, as before.
|
|
120
|
+
*/
|
|
121
|
+
campaignMetrics(campaignResourceNames: string[], from: Date, to: Date, conversionActionResourceName?: string | null): Promise<GoogleCampaignMetrics>;
|
|
87
122
|
private mutate;
|
|
88
123
|
private firstResourceName;
|
|
89
124
|
private rawJson;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleAdsClient.d.ts","sourceRoot":"","sources":["../../../src/programs/google/GoogleAdsClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"GoogleAdsClient.d.ts","sourceRoot":"","sources":["../../../src/programs/google/GoogleAdsClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -30,6 +30,10 @@ const ENDPOINTS = {
|
|
|
30
30
|
search: (cid) => `/customers/${cid}/googleAds:searchStream`,
|
|
31
31
|
assets: (cid) => `/customers/${cid}/assets:mutate`,
|
|
32
32
|
adGroupAds: (cid) => `/customers/${cid}/adGroupAds:mutate`,
|
|
33
|
+
/** A named set of conversion actions a campaign can be told to optimise for and count (D-34 parity, 0.4.1). */
|
|
34
|
+
customConversionGoals: (cid) => `/customers/${cid}/customConversionGoals:mutate`,
|
|
35
|
+
/** One row per campaign: CUSTOMER-level goals (the account default) or CAMPAIGN-level with a custom goal. */
|
|
36
|
+
conversionGoalCampaignConfigs: (cid) => `/customers/${cid}/conversionGoalCampaignConfigs:mutate`,
|
|
33
37
|
};
|
|
34
38
|
export class GoogleAdsApiError extends Error {
|
|
35
39
|
constructor(status, message,
|
|
@@ -80,6 +84,72 @@ export class GoogleAdsClient {
|
|
|
80
84
|
}]);
|
|
81
85
|
return this.firstResourceName(res, 'campaign');
|
|
82
86
|
}
|
|
87
|
+
/** The customer's live conversion actions — what a program may name by id (R5, D-34). */
|
|
88
|
+
async conversionActions() {
|
|
89
|
+
const query = 'SELECT conversion_action.id, conversion_action.resource_name, conversion_action.name, conversion_action.status, '
|
|
90
|
+
+ 'conversion_action.category, conversion_action.origin, conversion_action.primary_for_goal, conversion_action.include_in_conversions_metric '
|
|
91
|
+
+ "FROM conversion_action WHERE conversion_action.status != 'REMOVED' ORDER BY conversion_action.name";
|
|
92
|
+
const body = await this.rawJson('POST', ENDPOINTS.search(this.config.customerId), { query });
|
|
93
|
+
const chunks = Array.isArray(body) ? body : [];
|
|
94
|
+
const out = [];
|
|
95
|
+
for (const row of chunks.flatMap(c => c.results ?? [])) {
|
|
96
|
+
const a = row.conversionAction;
|
|
97
|
+
if (!a || a['id'] == null || typeof a['name'] !== 'string' || typeof a['resourceName'] !== 'string')
|
|
98
|
+
continue;
|
|
99
|
+
out.push({
|
|
100
|
+
id: String(a['id']),
|
|
101
|
+
resourceName: a['resourceName'],
|
|
102
|
+
name: a['name'],
|
|
103
|
+
enabled: a['status'] === 'ENABLED',
|
|
104
|
+
category: typeof a['category'] === 'string' ? a['category'] : null,
|
|
105
|
+
origin: typeof a['origin'] === 'string' ? a['origin'] : null,
|
|
106
|
+
countsByDefault: a['primaryForGoal'] === true && a['includeInConversionsMetric'] !== false,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
return out;
|
|
110
|
+
}
|
|
111
|
+
/** The conversion action with this id, or null — the levers carry ids, never names (D-34). */
|
|
112
|
+
async findConversionActionById(id) {
|
|
113
|
+
const want = id.trim();
|
|
114
|
+
return (await this.conversionActions()).find(c => c.id === want) ?? null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The custom conversion goal holding exactly this action — found by its ACTION LIST, created only when none exists;
|
|
118
|
+
* returns its resource name. Google optimises and counts a campaign against its GOALS, not against an action
|
|
119
|
+
* directly, and allows ONE goal per action list on the customer (`DUPLICATE_CONVERSION_ACTION_LIST`, live on
|
|
120
|
+
* Sidecar.ai 2026-10-28 when CG-02 tried to make its own after CG-01's): a goal belongs to the action, so every
|
|
121
|
+
* program naming the action shares it. A goal the customer made themselves is reused as is — never renamed.
|
|
122
|
+
* `name` is used only for a goal this call creates.
|
|
123
|
+
*/
|
|
124
|
+
async ensureCustomConversionGoal(conversionActionResourceName, name) {
|
|
125
|
+
const want = conversionActionResourceName.trim();
|
|
126
|
+
const body = await this.rawJson('POST', ENDPOINTS.search(this.config.customerId), {
|
|
127
|
+
query: "SELECT custom_conversion_goal.resource_name, custom_conversion_goal.conversion_actions FROM custom_conversion_goal WHERE custom_conversion_goal.status != 'REMOVED'",
|
|
128
|
+
});
|
|
129
|
+
const chunks = Array.isArray(body) ? body : [];
|
|
130
|
+
for (const row of chunks.flatMap(c => c.results ?? [])) {
|
|
131
|
+
const g = row.customConversionGoal;
|
|
132
|
+
const actions = (g?.conversionActions ?? []).map(a => a.trim());
|
|
133
|
+
if (g?.resourceName && actions.length === 1 && actions[0] === want)
|
|
134
|
+
return g.resourceName;
|
|
135
|
+
}
|
|
136
|
+
const res = await this.mutate(ENDPOINTS.customConversionGoals(this.config.customerId), [{
|
|
137
|
+
create: { name, conversionActions: [want], status: 'ENABLED' },
|
|
138
|
+
}]);
|
|
139
|
+
return this.firstResourceName(res, 'customConversionGoal');
|
|
140
|
+
}
|
|
141
|
+
/** Points the campaign at a custom goal (CAMPAIGN-level goal config instead of the account default). */
|
|
142
|
+
async setCampaignConversionGoal(campaignResourceName, customConversionGoalResourceName) {
|
|
143
|
+
const campaignId = campaignResourceName.split('/').pop() ?? '';
|
|
144
|
+
await this.mutate(ENDPOINTS.conversionGoalCampaignConfigs(this.config.customerId), [{
|
|
145
|
+
update: {
|
|
146
|
+
resourceName: `customers/${this.config.customerId}/conversionGoalCampaignConfigs/${campaignId}`,
|
|
147
|
+
goalConfigLevel: 'CAMPAIGN',
|
|
148
|
+
customConversionGoal: customConversionGoalResourceName,
|
|
149
|
+
},
|
|
150
|
+
updateMask: 'goal_config_level,custom_conversion_goal',
|
|
151
|
+
}]);
|
|
152
|
+
}
|
|
83
153
|
/** Creates the Display ad group targeting lives on; returns its resource name. */
|
|
84
154
|
async createAdGroup(name, campaignResourceName) {
|
|
85
155
|
const res = await this.mutate(ENDPOINTS.adGroups(this.config.customerId), [{
|
|
@@ -191,23 +261,35 @@ export class GoogleAdsClient {
|
|
|
191
261
|
updateMask: 'amount_micros',
|
|
192
262
|
}]);
|
|
193
263
|
}
|
|
194
|
-
/**
|
|
195
|
-
|
|
264
|
+
/**
|
|
265
|
+
* Summed metrics for the campaigns over [from, to] — the Inferred input. With a conversion action named (D-34
|
|
266
|
+
* parity), `conversions` is THAT action's count only (`metrics.all_conversions` segmented by the action, so a
|
|
267
|
+
* secondary action the account does not count by default is still counted); without one it is the account's
|
|
268
|
+
* default conversions figure, as before.
|
|
269
|
+
*/
|
|
270
|
+
async campaignMetrics(campaignResourceNames, from, to, conversionActionResourceName) {
|
|
196
271
|
const day = (d) => d.toISOString().slice(0, 10);
|
|
197
272
|
const names = campaignResourceNames.map(n => `'${n.replace(/'/g, '')}'`).join(', ');
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
const
|
|
273
|
+
const scope = `FROM campaign WHERE campaign.resource_name IN (${names}) AND segments.date BETWEEN '${day(from)}' AND '${day(to)}'`;
|
|
274
|
+
const rowsOf = async (query) => {
|
|
275
|
+
const body = await this.rawJson('POST', ENDPOINTS.search(this.config.customerId), { query });
|
|
276
|
+
// searchStream returns an ARRAY of chunks, each with results[].
|
|
277
|
+
const chunks = Array.isArray(body) ? body : [];
|
|
278
|
+
return chunks.flatMap(c => c.results ?? []);
|
|
279
|
+
};
|
|
280
|
+
const sumOf = (rows, k) => rows.reduce((a, r) => a + (Number(r.metrics?.[k]) || 0), 0);
|
|
281
|
+
const rows = await rowsOf(`SELECT metrics.impressions, metrics.clicks, metrics.conversions, metrics.cost_micros ${scope}`);
|
|
282
|
+
let conversions = sumOf(rows, 'conversions');
|
|
283
|
+
if (conversionActionResourceName) {
|
|
284
|
+
// Segmenting by conversion_action leaves only conversion metrics meaningful, hence the second query.
|
|
285
|
+
const scoped = await rowsOf(`SELECT metrics.all_conversions ${scope} AND segments.conversion_action = '${conversionActionResourceName.replace(/'/g, '')}'`);
|
|
286
|
+
conversions = sumOf(scoped, 'allConversions');
|
|
287
|
+
}
|
|
206
288
|
return {
|
|
207
|
-
impressions:
|
|
208
|
-
clicks:
|
|
209
|
-
conversions
|
|
210
|
-
spendUsd:
|
|
289
|
+
impressions: sumOf(rows, 'impressions'),
|
|
290
|
+
clicks: sumOf(rows, 'clicks'),
|
|
291
|
+
conversions,
|
|
292
|
+
spendUsd: sumOf(rows, 'costMicros') / 1_000_000,
|
|
211
293
|
};
|
|
212
294
|
}
|
|
213
295
|
// ── envelope ────────────────────────────────────────────────────────────
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoogleAdsClient.js","sourceRoot":"","sources":["../../../src/programs/google/GoogleAdsClient.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GoogleAdsClient.js","sourceRoot":"","sources":["../../../src/programs/google/GoogleAdsClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* approval gate (V3-12) BEFORE onLock — by the time this runs, a human approved the spend.
|
|
16
16
|
*/
|
|
17
17
|
import { type UserInfo } from '@memberjunction/core';
|
|
18
|
-
import { BaseProgramTypeDriver, type DriverRetirementReason, type DriverValidationIssue, type MetricCollectionWindow, type MetricObservation, type ProgramForDriver, type ProgramTypeParamSpec, type RefreshStatusResult, type RetireStatusResult } from '@mj-biz-apps/marketing-core';
|
|
18
|
+
import { BaseProgramTypeDriver, type DriverRetirementReason, type DriverValidationIssue, type MetricCollectionWindow, type MetricObservation, type PlatformAudienceOptions, type ProgramForDriver, type ProgramTypeParamSpec, type RefreshStatusResult, type RetireStatusResult } from '@mj-biz-apps/marketing-core';
|
|
19
19
|
import { type GoogleContextResolver } from './googleAdsExecutionContext.js';
|
|
20
20
|
export declare class GoogleAdsProgramDriver extends BaseProgramTypeDriver {
|
|
21
21
|
private readonly contextUser?;
|
|
@@ -25,12 +25,25 @@ export declare class GoogleAdsProgramDriver extends BaseProgramTypeDriver {
|
|
|
25
25
|
readonly paramSpecs: ReadonlyArray<ProgramTypeParamSpec>;
|
|
26
26
|
constructor(contextUser?: UserInfo, resolveContext?: GoogleContextResolver);
|
|
27
27
|
validateProposal(program: ProgramForDriver): Promise<DriverValidationIssue[]>;
|
|
28
|
+
/**
|
|
29
|
+
* The conversion is a platform OBJECT the levers point at by id (R5, D-34 — the same rule as LinkedIn's): a
|
|
30
|
+
* named action must exist on the customer, a disabled one is a warning, and a program that names none must say
|
|
31
|
+
* `optimizeFor: "clicks"` (D-31) — otherwise it would be measured by a number Google reports as whatever the
|
|
32
|
+
* account counts by default, which for a secondary action such as HubSpot's form-submit action is nothing.
|
|
33
|
+
*/
|
|
34
|
+
private validateConversionChoice;
|
|
28
35
|
/**
|
|
29
36
|
* Google's Responsive Display Ad limits — enforced at PROPOSE so the agent's copy is
|
|
30
37
|
* refused with field-level messages instead of dying at lock: headlines ≤ 30 chars,
|
|
31
38
|
* long headline and descriptions ≤ 90 (platform constants, not house style).
|
|
32
39
|
*/
|
|
33
40
|
private validateGoogleCreative;
|
|
41
|
+
/**
|
|
42
|
+
* The program's own image is held to Google's landscape slot at PROPOSE (KI-156): Google crops nothing and refuses a
|
|
43
|
+
* non-1.91:1 image at ad creation — after the campaign, budget, ad group and goal exist. The same check Settings
|
|
44
|
+
* runs on the brand's landscape image, so the refusal names the size and the requirement while the proposal is a draft.
|
|
45
|
+
*/
|
|
46
|
+
private validateCreativeImage;
|
|
34
47
|
onLock(program: ProgramForDriver): Promise<void>;
|
|
35
48
|
collectMetrics(program: ProgramForDriver, window: MetricCollectionWindow): Promise<MetricObservation[] | null>;
|
|
36
49
|
/**
|
|
@@ -41,6 +54,11 @@ export declare class GoogleAdsProgramDriver extends BaseProgramTypeDriver {
|
|
|
41
54
|
*/
|
|
42
55
|
refreshStatus(program: ProgramForDriver, window: MetricCollectionWindow): Promise<RefreshStatusResult>;
|
|
43
56
|
onRetire(program: ProgramForDriver, reason: DriverRetirementReason): Promise<RetireStatusResult>;
|
|
57
|
+
/** The conversion actions a brand's customer can point at by id (R5, D-34); Google offers no saved audiences here yet. */
|
|
58
|
+
listAudienceOptions(brandId: string): Promise<PlatformAudienceOptions | null>;
|
|
59
|
+
/** Lock's answer to D-31: the named action, or null when the levers chose clicks; anything else is refused. */
|
|
60
|
+
private resolveConversionForLock;
|
|
61
|
+
private stateOf;
|
|
44
62
|
private loadRefs;
|
|
45
63
|
private saveRef;
|
|
46
64
|
private updateRefState;
|