Skip to content

Commit

Permalink
🪟 🔧 Add Cross domain tracking for segment (#16268)
Browse files Browse the repository at this point in the history
* Add Cross domain tracking for segment

* add email in identify call to test with Hubspot

* save cookie on local storage, create hook to override Segment cookie

* PR comments
  • Loading branch information
letiescanciano authored Sep 28, 2022
1 parent 3f99a22 commit a43d2ed
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 10 deletions.
20 changes: 10 additions & 10 deletions airbyte-webapp/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions airbyte-webapp/src/core/analytics/AnalyticsService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,5 @@ export class AnalyticsService {

group = (organisationId: string, traits: Record<string, unknown> = {}): void =>
this.getSegmentAnalytics()?.group?.(organisationId, traits);
setAnonymousId = (anonymousId: string) => this.getSegmentAnalytics()?.setAnonymousId(anonymousId);
}
3 changes: 3 additions & 0 deletions airbyte-webapp/src/packages/cloud/cloudRoutes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import DestinationPage from "pages/DestinationPage";
import OnboardingPage from "pages/OnboardingPage";
import SourcesPage from "pages/SourcesPage";
import { useCurrentWorkspace, WorkspaceServiceProvider } from "services/workspaces/WorkspacesService";
import { setSegmentAnonymousId, useGetSegmentAnonymousId } from "utils/crossDomainUtils";
import { storeUtmFromQuery } from "utils/utmStorage";
import { CompleteOauthRequest } from "views/CompleteOauthRequest";

Expand Down Expand Up @@ -139,6 +140,7 @@ export const Routing: React.FC = () => {

useEffectOnce(() => {
storeUtmFromQuery(search);
setSegmentAnonymousId(search);
});

const analyticsContext = useMemo(
Expand All @@ -150,6 +152,7 @@ export const Routing: React.FC = () => {
: null,
[user]
);
useGetSegmentAnonymousId();
useAnalyticsRegisterValues(analyticsContext);
useAnalyticsIdentifyUser(user?.userId, { providers, email: user?.email });

Expand Down
19 changes: 19 additions & 0 deletions airbyte-webapp/src/utils/crossDomainUtils.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { clearSegmentCookie, setSegmentAnonymousId } from "./crossDomainUtils";

describe("Tracking utils", () => {
beforeEach(() => {
clearSegmentCookie();
});

it("correctly creates the cookie", () => {
const anonymousId = "anonymousId";
setSegmentAnonymousId("?ajs_anonymous_id=anonymousId");

expect(localStorage.getItem("ajs_anonymous_id")).toEqual(JSON.stringify(anonymousId));
});

it("only creates the cookie if the param is present", () => {
setSegmentAnonymousId("?utm_source=twitter&utm_campaign=spring2022");
expect(localStorage.getItem("ajs_anonymous_id")).toBeNull();
});
});
27 changes: 27 additions & 0 deletions airbyte-webapp/src/utils/crossDomainUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { useEffect } from "react";

import { useAnalyticsService } from "hooks/services/Analytics";

export const setSegmentAnonymousId = (queryString?: string): void => {
const queryParams = new URLSearchParams(queryString);
const ajs_anonymous_id = queryParams.get("ajs_anonymous_id");

if (ajs_anonymous_id) {
localStorage.setItem("ajs_anonymous_id", JSON.stringify(ajs_anonymous_id));
}
};

export const useGetSegmentAnonymousId = (): void => {
const analyticsService = useAnalyticsService();
const anonymousId = localStorage.getItem("ajs_anonymous_id");

useEffect(() => {
if (anonymousId) {
analyticsService.setAnonymousId(JSON.parse(anonymousId));
}
}, [anonymousId, analyticsService]);
};

export const clearSegmentCookie = () => {
localStorage.removeItem("ajs_anonymous_id");
};

0 comments on commit a43d2ed

Please sign in to comment.