diff --git a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml index 13fa8406dcd3..929ba7ef8dbe 100644 --- a/airbyte-config/init/src/main/resources/seed/source_definitions.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_definitions.yaml @@ -773,7 +773,7 @@ - name: Google Analytics 4 (GA4) sourceDefinitionId: 3cc2eafd-84aa-4dca-93af-322d9dfeec1a dockerRepository: airbyte/source-google-analytics-data-api - dockerImageTag: 0.1.2 + dockerImageTag: 0.1.3 documentationUrl: https://docs.airbyte.com/integrations/sources/google-analytics-data-api/ icon: google-analytics.svg sourceType: api diff --git a/airbyte-config/init/src/main/resources/seed/source_specs.yaml b/airbyte-config/init/src/main/resources/seed/source_specs.yaml index cfd67ef8328c..8363305b72ec 100644 --- a/airbyte-config/init/src/main/resources/seed/source_specs.yaml +++ b/airbyte-config/init/src/main/resources/seed/source_specs.yaml @@ -5795,12 +5795,12 @@ oauthFlowOutputParameters: - - "access_token" - - "refresh_token" -- dockerImage: "airbyte/source-google-analytics-data-api:0.1.2" +- dockerImage: "airbyte/source-google-analytics-data-api:0.1.3" spec: - documentationUrl: "https://docs.airbyte.com/integrations/sources/google-analytics-v4" + documentationUrl: "https://docs.airbyte.com/integrations/sources/google-analytics-data-api" connectionSpecification: - $schema: "http://json-schema.org/draft-07/schema#" - title: "Google Analytics 4 (GA4) Spec" + $schema: "https://json-schema.org/draft-07/schema#" + title: "Google Analytics (Data API) Spec" type: "object" required: - "property_id" diff --git a/airbyte-integrations/connectors/source-google-analytics-data-api/Dockerfile b/airbyte-integrations/connectors/source-google-analytics-data-api/Dockerfile index 6df850eec590..91818294f89e 100644 --- a/airbyte-integrations/connectors/source-google-analytics-data-api/Dockerfile +++ b/airbyte-integrations/connectors/source-google-analytics-data-api/Dockerfile @@ -28,5 +28,5 @@ COPY source_google_analytics_data_api ./source_google_analytics_data_api ENV AIRBYTE_ENTRYPOINT "python /airbyte/integration_code/main.py" ENTRYPOINT ["python", "/airbyte/integration_code/main.py"] -LABEL io.airbyte.version=0.1.2 +LABEL io.airbyte.version=0.1.3 LABEL io.airbyte.name=airbyte/source-google-analytics-data-api diff --git a/airbyte-integrations/connectors/source-google-analytics-data-api/acceptance-test-config.yml b/airbyte-integrations/connectors/source-google-analytics-data-api/acceptance-test-config.yml index 344b83653ebd..2a88517b17b2 100644 --- a/airbyte-integrations/connectors/source-google-analytics-data-api/acceptance-test-config.yml +++ b/airbyte-integrations/connectors/source-google-analytics-data-api/acceptance-test-config.yml @@ -1,6 +1,7 @@ # See [Connector Acceptance Tests](https://docs.airbyte.com/connector-development/testing-connectors/connector-acceptance-tests-reference) # for more information about how to configure these tests connector_image: airbyte/source-google-analytics-data-api:dev +test_strictness_level: high acceptance_tests: spec: tests: @@ -17,36 +18,83 @@ acceptance_tests: basic_read: tests: - config_path: "secrets/config.json" - configured_catalog_path: "integration_tests/configured_catalog.json" + empty_streams: + - name: "traffic_sources" + bypass_reason: "The data contains business information" + expect_records: + path: "integration_tests/expected_records.jsonl" + extra_fields: no + exact_order: no + extra_records: yes + ignored_fields: + daily_active_users: + - name: uuid + bypass_reason: "dynamically created field" + weekly_active_users: + - name: uuid + bypass_reason: "dynamically created field" + four_weekly_active_users: + - name: uuid + bypass_reason: "dynamically created field" + devices: + - name: uuid + bypass_reason: "dynamically created field" + - name: averageSessionDuration + bypass_reason: "dynamic field" + locations: + - name: uuid + bypass_reason: "dynamically created field" + - name: averageSessionDuration + bypass_reason: "dynamic field" + pages: + - name: uuid + bypass_reason: "dynamically created field" + - name: screenPageViews + bypass_reason: "dynamically created field" + - name: bounceRate + bypass_reason: "dynamically created field" + website_overview: + - name: uuid + bypass_reason: "dynamically created field" + - name: averageSessionDuration + bypass_reason: "dynamically created field" full_refresh: tests: - config_path: "secrets/config.json" configured_catalog_path: "integration_tests/configured_catalog.json" ignored_fields: daily_active_users: - - name: "uuid" - bypass_reason: "property is changing from sync to sync" + - name: uuid + bypass_reason: "dynamically created field" weekly_active_users: - - name: "uuid" - bypass_reason: "property is changing from sync to sync" + - name: uuid + bypass_reason: "dynamically created field" four_weekly_active_users: - - name: "uuid" - bypass_reason: "property is changing from sync to sync" + - name: uuid + bypass_reason: "dynamically created field" devices: - - name: "uuid" - bypass_reason: "property is changing from sync to sync" + - name: uuid + bypass_reason: "dynamically created field" + - name: averageSessionDuration + bypass_reason: "dynamic field" locations: - - name: "uuid" - bypass_reason: "property is changing from sync to sync" + - name: uuid + bypass_reason: "dynamically created field" + - name: averageSessionDuration + bypass_reason: "dynamic field" pages: - - name: "uuid" - bypass_reason: "property is changing from sync to sync" + - name: uuid + bypass_reason: "dynamically created field" traffic_sources: - - name: "uuid" - bypass_reason: "property is changing from sync to sync" + - name: uuid + bypass_reason: "dynamically created field" + - name: averageSessionDuration + bypass_reason: "dynamically created field" website_overview: - - name: "uuid" - bypass_reason: "property is changing from sync to sync" + - name: uuid + bypass_reason: "dynamically created field" + - name: averageSessionDuration + bypass_reason: "dynamically created field" incremental: tests: - config_path: "secrets/config.json" diff --git a/airbyte-integrations/connectors/source-google-analytics-data-api/integration_tests/expected_records.jsonl b/airbyte-integrations/connectors/source-google-analytics-data-api/integration_tests/expected_records.jsonl new file mode 100644 index 000000000000..992b7cf5af2c --- /dev/null +++ b/airbyte-integrations/connectors/source-google-analytics-data-api/integration_tests/expected_records.jsonl @@ -0,0 +1,143 @@ +{"stream":"daily_active_users","data":{"uuid":"d740634d-5a99-4c00-8535-cc7dd39cf102","property_id":"314186564","date":"20230126","active1DayUsers":5588},"emitted_at":1678381333675} +{"stream":"daily_active_users","data":{"uuid":"5d856f4a-e129-4ab0-9b03-ad5f9ab36cd3","property_id":"314186564","date":"20230130","active1DayUsers":3044},"emitted_at":1678381333676} +{"stream":"daily_active_users","data":{"uuid":"bea93bd9-7b12-4035-b696-38b9e02d81b4","property_id":"314186564","date":"20230112","active1DayUsers":2783},"emitted_at":1678381333676} +{"stream":"daily_active_users","data":{"uuid":"537e93bf-d7af-4078-ab87-371a0ffbdf8c","property_id":"314186564","date":"20230228","active1DayUsers":2626},"emitted_at":1678381333979} +{"stream":"daily_active_users","data":{"uuid":"c842e31f-63ba-4610-845f-12d0683ff8b4","property_id":"314186564","date":"20230214","active1DayUsers":2582},"emitted_at":1678381333979} +{"stream":"daily_active_users","data":{"uuid":"11aa822c-5eeb-4ef2-b8aa-a71c8555c399","property_id":"314186564","date":"20230301","active1DayUsers":2562},"emitted_at":1678381333979} +{"stream":"daily_active_users","data":{"uuid":"9e6a5066-dfee-40e1-8a86-6e58ae79163a","property_id":"314186564","date":"20230213","active1DayUsers":2518},"emitted_at":1678381333979} +{"stream":"daily_active_users","data":{"uuid":"3a86c4fa-1d22-4d6d-96d4-aa1aa3ed4aae","property_id":"314186564","date":"20230205","active1DayUsers":1470},"emitted_at":1678381333980} +{"stream":"daily_active_users","data":{"uuid":"cb7ecf2b-96de-460f-8825-d79cc19e0017","property_id":"314186564","date":"20230204","active1DayUsers":1350},"emitted_at":1678381333980} +{"stream":"daily_active_users","data":{"uuid":"cf843a52-5509-4bc1-9be7-2680e444f72c","property_id":"314186564","date":"20230212","active1DayUsers":1269},"emitted_at":1678381333980} +{"stream":"daily_active_users","data":{"uuid":"4100edb8-2d5a-4b1c-98c3-32c24555f6e4","property_id":"314186564","date":"20230219","active1DayUsers":1211},"emitted_at":1678381333980} +{"stream":"daily_active_users","data":{"uuid":"6f06e832-f653-44ab-aca5-1b8bb95817cf","property_id":"314186564","date":"20230226","active1DayUsers":1189},"emitted_at":1678381333980} +{"stream":"daily_active_users","data":{"uuid":"e9204355-3a80-42a7-ad19-213438c8318a","property_id":"314186564","date":"20230211","active1DayUsers":958},"emitted_at":1678381333980} +{"stream":"daily_active_users","data":{"uuid":"4bc46fdf-3e61-4152-ab9a-de5de6317094","property_id":"314186564","date":"20230225","active1DayUsers":839},"emitted_at":1678381333980} +{"stream":"daily_active_users","data":{"uuid":"a1358391-2d0b-4a76-904c-fcc1b7ede7df","property_id":"314186564","date":"20230306","active1DayUsers":5849},"emitted_at":1678381334875} +{"stream":"daily_active_users","data":{"uuid":"0a018ec9-a1be-4027-b55d-150000c604ff","property_id":"314186564","date":"20230307","active1DayUsers":4285},"emitted_at":1678381334875} +{"stream":"daily_active_users","data":{"uuid":"2e83053e-62fd-4ade-84b5-25b44e824108","property_id":"314186564","date":"20230308","active1DayUsers":3180},"emitted_at":1678381334875} +{"stream":"daily_active_users","data":{"uuid":"1b0b5f7a-235b-4825-b892-d427df3eeb27","property_id":"314186564","date":"20230305","active1DayUsers":1358},"emitted_at":1678381334876} +{"stream":"daily_active_users","data":{"uuid":"c859dee1-408c-4951-9ff8-15ac042ccf14","property_id":"314186564","date":"20230304","active1DayUsers":1115},"emitted_at":1678381334876} +{"stream":"weekly_active_users","data":{"uuid":"934cdcae-1d0a-4681-93ca-31e4f2c4aa10","property_id":"314186564","date":"20230130","active7DayUsers":16837},"emitted_at":1678381336463} +{"stream":"weekly_active_users","data":{"uuid":"41bedd57-61a6-479d-812a-f732a1accb06","property_id":"314186564","date":"20230129","active7DayUsers":16577},"emitted_at":1678381336463} +{"stream":"weekly_active_users","data":{"uuid":"307ec546-fae5-4e95-8586-5615dc9d4a7d","property_id":"314186564","date":"20230128","active7DayUsers":16537},"emitted_at":1678381336463} +{"stream":"weekly_active_users","data":{"uuid":"11585f70-3b55-4050-bcd7-5479a8e5624c","property_id":"314186564","date":"20230127","active7DayUsers":16368},"emitted_at":1678381336463} +{"stream":"weekly_active_users","data":{"uuid":"eeb8a338-e038-4eb2-a47a-be13788bf5a3","property_id":"314186564","date":"20230126","active7DayUsers":15828},"emitted_at":1678381336463} +{"stream":"weekly_active_users","data":{"uuid":"7adb80f4-66af-461a-9c33-a4d338ae87b5","property_id":"314186564","date":"20230114","active7DayUsers":12970},"emitted_at":1678381336464} +{"stream":"weekly_active_users","data":{"uuid":"cb72a0da-164f-4f19-95cd-65fd24ab70ab","property_id":"314186564","date":"20230116","active7DayUsers":12895},"emitted_at":1678381336464} +{"stream":"weekly_active_users","data":{"uuid":"5ecba746-b1aa-4235-a5a8-fb94205615ca","property_id":"314186564","date":"20230202","active7DayUsers":15770},"emitted_at":1678381336755} +{"stream":"weekly_active_users","data":{"uuid":"c23432db-5910-40bc-9604-bd3cd8eae79b","property_id":"314186564","date":"20230205","active7DayUsers":15623},"emitted_at":1678381336755} +{"stream":"weekly_active_users","data":{"uuid":"4a6cd27c-cfbf-4cac-b367-bc749252c054","property_id":"314186564","date":"20230204","active7DayUsers":15553},"emitted_at":1678381336755} +{"stream":"weekly_active_users","data":{"uuid":"892dadfd-6229-481f-bdaa-3c9c5a840054","property_id":"314186564","date":"20230222","active7DayUsers":15450},"emitted_at":1678381336755} +{"stream":"weekly_active_users","data":{"uuid":"9ae54cbe-fd5e-4cda-ab37-bd2f0b0840e6","property_id":"314186564","date":"20230203","active7DayUsers":15362},"emitted_at":1678381336755} +{"stream":"weekly_active_users","data":{"uuid":"cbe3383e-ead1-4afb-b95f-53233b221da7","property_id":"314186564","date":"20230227","active7DayUsers":11582},"emitted_at":1678381336756} +{"stream":"weekly_active_users","data":{"uuid":"5ce683a4-603e-4e17-b98f-658348a5d255","property_id":"314186564","date":"20230225","active7DayUsers":11207},"emitted_at":1678381336756} +{"stream":"weekly_active_users","data":{"uuid":"641cb10e-8816-4dc8-8843-51a9e812ee6e","property_id":"314186564","date":"20230226","active7DayUsers":11152},"emitted_at":1678381336757} +{"stream":"weekly_active_users","data":{"uuid":"e4ea2069-6254-42e6-a14e-125f22d558e4","property_id":"314186564","date":"20230308","active7DayUsers":18126},"emitted_at":1678381337525} +{"stream":"weekly_active_users","data":{"uuid":"6b3d7cca-2abc-471e-9bc9-da6e4d435d71","property_id":"314186564","date":"20230307","active7DayUsers":17555},"emitted_at":1678381337527} +{"stream":"weekly_active_users","data":{"uuid":"83473b8d-0716-4ecc-8700-baa6e4cd77be","property_id":"314186564","date":"20230306","active7DayUsers":15874},"emitted_at":1678381337530} +{"stream":"weekly_active_users","data":{"uuid":"23df8c7f-237e-4fa0-98ad-4d230528c97d","property_id":"314186564","date":"20230302","active7DayUsers":12087},"emitted_at":1678381337530} +{"stream":"four_weekly_active_users","data":{"uuid":"2834dea3-9cfd-4649-b924-8e16c63aaa92","property_id":"314186564","date":"20230130","active28DayUsers":48553},"emitted_at":1678381339570} +{"stream":"four_weekly_active_users","data":{"uuid":"463276cf-364b-4103-a351-4767d71e9fe8","property_id":"314186564","date":"20230129","active28DayUsers":47206},"emitted_at":1678381339571} +{"stream":"four_weekly_active_users","data":{"uuid":"a27d065b-8e3e-4200-b5cb-91f07569f9c6","property_id":"314186564","date":"20230128","active28DayUsers":46942},"emitted_at":1678381339571} +{"stream":"four_weekly_active_users","data":{"uuid":"28322223-18ca-42f1-9b58-5291921ce283","property_id":"314186564","date":"20230205","active28DayUsers":53252},"emitted_at":1678381340113} +{"stream":"four_weekly_active_users","data":{"uuid":"150e0866-7bef-457d-ba05-1511a91ca247","property_id":"314186564","date":"20230213","active28DayUsers":53161},"emitted_at":1678381340113} +{"stream":"four_weekly_active_users","data":{"uuid":"b5b3c0c5-53f6-4aed-b7e1-eb481b098d6f","property_id":"314186564","date":"20230214","active28DayUsers":53007},"emitted_at":1678381340113} +{"stream":"four_weekly_active_users","data":{"uuid":"96575bb1-77c6-4590-91b7-df2e33c9ee45","property_id":"314186564","date":"20230210","active28DayUsers":52974},"emitted_at":1678381340113} +{"stream":"four_weekly_active_users","data":{"uuid":"2124baf5-b40a-4c84-aaae-d11a14eb5b8a","property_id":"314186564","date":"20230212","active28DayUsers":52950},"emitted_at":1678381340113} +{"stream":"four_weekly_active_users","data":{"uuid":"c915e1a0-d294-4659-a92b-997e07471947","property_id":"314186564","date":"20230204","active28DayUsers":52836},"emitted_at":1678381340113} +{"stream":"four_weekly_active_users","data":{"uuid":"86a9b1a2-6e80-48e0-b3be-dc7628c39a95","property_id":"314186564","date":"20230211","active28DayUsers":52772},"emitted_at":1678381340113} +{"stream":"four_weekly_active_users","data":{"uuid":"9f00870e-c0db-41d1-940c-6784533c91c8","property_id":"314186564","date":"20230223","active28DayUsers":52720},"emitted_at":1678381340113} +{"stream":"four_weekly_active_users","data":{"uuid":"51c9744f-3658-4965-9050-4ab9208581a4","property_id":"314186564","date":"20230203","active28DayUsers":52096},"emitted_at":1678381340114} +{"stream":"four_weekly_active_users","data":{"uuid":"472b845d-044b-41c2-adcb-9cdda71f4777","property_id":"314186564","date":"20230224","active28DayUsers":51840},"emitted_at":1678381340114} +{"stream":"four_weekly_active_users","data":{"uuid":"951547b6-2713-40f2-9938-3cc75c0d0ef9","property_id":"314186564","date":"20230202","active28DayUsers":51576},"emitted_at":1678381340114} +{"stream":"four_weekly_active_users","data":{"uuid":"d60c7684-e66a-4cdc-86b4-afeda1fd1b84","property_id":"314186564","date":"20230225","active28DayUsers":51554},"emitted_at":1678381340114} +{"stream":"four_weekly_active_users","data":{"uuid":"69fc3620-304f-41f3-9006-bd1c9272d310","property_id":"314186564","date":"20230226","active28DayUsers":51297},"emitted_at":1678381340114} +{"stream":"four_weekly_active_users","data":{"uuid":"7291c49c-6af8-4723-baaf-7d4c22a0fb91","property_id":"314186564","date":"20230227","active28DayUsers":50957},"emitted_at":1678381340114} +{"stream":"four_weekly_active_users","data":{"uuid":"79a678a4-68d6-43ce-b20a-5d1aae10577f","property_id":"314186564","date":"20230201","active28DayUsers":50822},"emitted_at":1678381340114} +{"stream":"four_weekly_active_users","data":{"uuid":"ecc068ac-45ce-4cf2-9f5e-e52a9f618996","property_id":"314186564","date":"20230228","active28DayUsers":50206},"emitted_at":1678381340114} +{"stream":"four_weekly_active_users","data":{"uuid":"7dfb2df2-e4c3-4ec6-9e28-8ed84af37edc","property_id":"314186564","date":"20230131","active28DayUsers":49804},"emitted_at":1678381340114} +{"stream":"devices","data":{"uuid":"3730e4f7-be18-46e5-afc4-cc19ab0f6a94","property_id":"314186564","date":"20230126","deviceCategory":"desktop","operatingSystem":"Macintosh","browser":"Chrome","totalUsers":1889,"newUsers":1081,"sessions":3323,"sessionsPerUser":2.0525015441630634,"averageSessionDuration":190.25625341889858,"screenPageViews":7700,"screenPageViewsPerSession":2.3171832681312066,"bounceRate":0.534456816130003},"emitted_at":1678381343155} +{"stream":"devices","data":{"uuid":"d55035f9-73d3-411a-8a24-630b74fccb17","property_id":"314186564","date":"20230114","deviceCategory":"desktop","operatingSystem":"Macintosh","browser":"Chrome","totalUsers":243,"newUsers":116,"sessions":430,"sessionsPerUser":2.4571428571428573,"averageSessionDuration":149.79113474418602,"screenPageViews":689,"screenPageViewsPerSession":1.6023255813953488,"bounceRate":0.6627906976744186},"emitted_at":1678381343179} +{"stream":"devices","data":{"uuid":"092d0654-402e-4eb0-839c-f538f218d48d","property_id":"314186564","date":"20230113","deviceCategory":"mobile","operatingSystem":"iOS","browser":"Safari","totalUsers":240,"newUsers":199,"sessions":282,"sessionsPerUser":1.247787610619469,"averageSessionDuration":116.2066634539007,"screenPageViews":401,"screenPageViewsPerSession":1.4219858156028369,"bounceRate":0.7056737588652482},"emitted_at":1678381343179} +{"stream":"devices","data":{"uuid":"cbd4ebc6-2c4a-403e-b809-d19b347e98e8","property_id":"314186564","date":"20230128","deviceCategory":"mobile","operatingSystem":"Android","browser":"Chrome","totalUsers":236,"newUsers":143,"sessions":306,"sessionsPerUser":1.4232558139534883,"averageSessionDuration":116.41804944444443,"screenPageViews":515,"screenPageViewsPerSession":1.6830065359477124,"bounceRate":0.4803921568627451},"emitted_at":1678381343179} +{"stream":"devices","data":{"uuid":"4c01fcbd-db57-4226-b35e-11960422a743","property_id":"314186564","date":"20230117","deviceCategory":"mobile","operatingSystem":"Android","browser":"Chrome","totalUsers":230,"newUsers":135,"sessions":335,"sessionsPerUser":1.7447916666666667,"averageSessionDuration":111.30464799104477,"screenPageViews":457,"screenPageViewsPerSession":1.364179104477612,"bounceRate":0.5044776119402985},"emitted_at":1678381343180} +{"stream":"devices","data":{"uuid":"08317b82-161b-425f-a29c-7c9b1326d188","property_id":"314186564","date":"20230102","deviceCategory":"mobile","operatingSystem":"Android","browser":"Chrome","totalUsers":226,"newUsers":160,"sessions":277,"sessionsPerUser":1.357843137254902,"averageSessionDuration":116.45424140433212,"screenPageViews":371,"screenPageViewsPerSession":1.339350180505415,"bounceRate":0.4657039711191336},"emitted_at":1678381343180} +{"stream":"devices","data":{"uuid":"e3e8cfe4-2a79-448c-8ccb-1d686744cf0f","property_id":"314186564","date":"20230101","deviceCategory":"desktop","operatingSystem":"Windows","browser":"Chrome","totalUsers":225,"newUsers":125,"sessions":329,"sessionsPerUser":1.848314606741573,"averageSessionDuration":130.99515609726444,"screenPageViews":426,"screenPageViewsPerSession":1.2948328267477203,"bounceRate":0.6261398176291794},"emitted_at":1678381343180} +{"stream":"devices","data":{"uuid":"e6d3ef35-fbcb-4d88-b543-d4d5e4ce7959","property_id":"314186564","date":"20230107","deviceCategory":"desktop","operatingSystem":"Macintosh","browser":"Chrome","totalUsers":220,"newUsers":89,"sessions":333,"sessionsPerUser":2.176470588235294,"averageSessionDuration":136.88719382882883,"screenPageViews":407,"screenPageViewsPerSession":1.2222222222222223,"bounceRate":0.6996996996996997},"emitted_at":1678381343180} +{"stream":"devices","data":{"uuid":"0f3bf211-b9a3-41fa-9e47-dded2b3b500a","property_id":"314186564","date":"20230116","deviceCategory":"mobile","operatingSystem":"Android","browser":"Chrome","totalUsers":218,"newUsers":115,"sessions":351,"sessionsPerUser":1.9285714285714286,"averageSessionDuration":99.59775829629629,"screenPageViews":406,"screenPageViewsPerSession":1.1566951566951567,"bounceRate":0.5641025641025641},"emitted_at":1678381343180} +{"stream":"devices","data":{"uuid":"d6e3a43e-76e8-463d-85f7-1ea3a27fb7d8","property_id":"314186564","date":"20230129","deviceCategory":"desktop","operatingSystem":"Linux","browser":"Firefox","totalUsers":14,"newUsers":7,"sessions":16,"sessionsPerUser":1.4545454545454546,"averageSessionDuration":134.647638625,"screenPageViews":36,"screenPageViewsPerSession":2.25,"bounceRate":0.3125},"emitted_at":1678381343211} +{"stream":"devices","data":{"uuid":"a2dbbe29-1522-4fe2-86af-e607f1a2c6f2","property_id":"314186564","date":"20230130","deviceCategory":"desktop","operatingSystem":"Windows","browser":"Opera","totalUsers":14,"newUsers":9,"sessions":17,"sessionsPerUser":1.4166666666666667,"averageSessionDuration":150.37403394117646,"screenPageViews":31,"screenPageViewsPerSession":1.8235294117647058,"bounceRate":0.4117647058823529},"emitted_at":1678381343211} +{"stream":"devices","data":{"uuid":"7502960e-587d-4871-80bc-fa10fc081ad9","property_id":"314186564","date":"20230307","deviceCategory":"mobile","operatingSystem":"Android","browser":"YaBrowser","totalUsers":1,"newUsers":0,"sessions":1,"sessionsPerUser":1,"averageSessionDuration":102.720276,"screenPageViews":0,"screenPageViewsPerSession":0,"bounceRate":1},"emitted_at":1678381347026} +{"stream":"devices","data":{"uuid":"23b15459-4201-4797-9106-9b4ecbffc862","property_id":"314186564","date":"20230307","deviceCategory":"mobile","operatingSystem":"Linux","browser":"Chrome","totalUsers":1,"newUsers":1,"sessions":1,"sessionsPerUser":1,"averageSessionDuration":0,"screenPageViews":1,"screenPageViewsPerSession":1,"bounceRate":1},"emitted_at":1678381347026} +{"stream":"devices","data":{"uuid":"b79ee675-8830-436c-8f0b-2b0aba5a5900","property_id":"314186564","date":"20230308","deviceCategory":"desktop","operatingSystem":"Linux","browser":"Edge","totalUsers":1,"newUsers":0,"sessions":1,"sessionsPerUser":0,"averageSessionDuration":0,"screenPageViews":1,"screenPageViewsPerSession":1,"bounceRate":1},"emitted_at":1678381347026} +{"stream":"devices","data":{"uuid":"4f78c49a-88f1-456f-b3d2-01157a9574c0","property_id":"314186564","date":"20230308","deviceCategory":"desktop","operatingSystem":"Linux","browser":"Safari","totalUsers":1,"newUsers":1,"sessions":1,"sessionsPerUser":1,"averageSessionDuration":0.092779,"screenPageViews":1,"screenPageViewsPerSession":1,"bounceRate":1},"emitted_at":1678381347026} +{"stream":"devices","data":{"uuid":"63f2544b-e0a3-4c71-b549-168ab2eedbba","property_id":"314186564","date":"20230308","deviceCategory":"desktop","operatingSystem":"Linux","browser":"YaBrowser","totalUsers":1,"newUsers":0,"sessions":1,"sessionsPerUser":0,"averageSessionDuration":0,"screenPageViews":1,"screenPageViewsPerSession":1,"bounceRate":1},"emitted_at":1678381347026} +{"stream":"devices","data":{"uuid":"68fa7c4d-9c61-45cb-acfb-55cb632125f5","property_id":"314186564","date":"20230308","deviceCategory":"desktop","operatingSystem":"Windows","browser":"YaBrowser","totalUsers":1,"newUsers":0,"sessions":1,"sessionsPerUser":1,"averageSessionDuration":1668.097776,"screenPageViews":1,"screenPageViewsPerSession":1,"bounceRate":0},"emitted_at":1678381347027} +{"stream":"devices","data":{"uuid":"15cd2ca9-07c6-4013-9b0d-f129f7a3ca76","property_id":"314186564","date":"20230308","deviceCategory":"mobile","operatingSystem":"Android","browser":"Android Browser","totalUsers":1,"newUsers":1,"sessions":1,"sessionsPerUser":1,"averageSessionDuration":0,"screenPageViews":1,"screenPageViewsPerSession":1,"bounceRate":1},"emitted_at":1678381347027} +{"stream":"devices","data":{"uuid":"6aaebc5c-831f-4b62-84a7-8972f94d9a9a","property_id":"314186564","date":"20230308","deviceCategory":"mobile","operatingSystem":"Macintosh","browser":"Chrome","totalUsers":1,"newUsers":1,"sessions":1,"sessionsPerUser":1,"averageSessionDuration":0,"screenPageViews":0,"screenPageViewsPerSession":0,"bounceRate":1},"emitted_at":1678381347027} +{"stream":"devices","data":{"uuid":"53bcd195-bb7e-4025-825d-8678186a1a3f","property_id":"314186564","date":"20230308","deviceCategory":"mobile","operatingSystem":"Windows","browser":"Chrome","totalUsers":1,"newUsers":0,"sessions":1,"sessionsPerUser":1,"averageSessionDuration":0,"screenPageViews":0,"screenPageViewsPerSession":0,"bounceRate":0},"emitted_at":1678381347027} +{"stream":"devices","data":{"uuid":"61be0c8d-ebd6-49f7-9a3b-eaa270c74df2","property_id":"314186564","date":"20230308","deviceCategory":"tablet","operatingSystem":"Android","browser":"Coc Coc","totalUsers":1,"newUsers":1,"sessions":2,"sessionsPerUser":2,"averageSessionDuration":0,"screenPageViews":1,"screenPageViewsPerSession":0.5,"bounceRate":1},"emitted_at":1678381347027} +{"stream":"devices","data":{"uuid":"37e512c9-7663-4440-adef-08caba1ed42b","property_id":"314186564","date":"20230308","deviceCategory":"tablet","operatingSystem":"iOS","browser":"Safari","totalUsers":1,"newUsers":1,"sessions":1,"sessionsPerUser":1,"averageSessionDuration":22.754585,"screenPageViews":1,"screenPageViewsPerSession":1,"bounceRate":0},"emitted_at":1678381347027} +{"stream":"locations","data":{"uuid":"59b23b72-df6f-4b57-aa87-b9c52fc5ba6b","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230126","totalUsers":261,"newUsers":186,"sessions":348,"sessionsPerUser":1.43801652892562,"averageSessionDuration":177.4253606494253,"screenPageViews":797,"screenPageViewsPerSession":2.2902298850574714,"bounceRate":0.41954022988505746},"emitted_at":1678381351369} +{"stream":"locations","data":{"uuid":"067cc6e2-06a0-43a6-9d36-545c6cdd9aba","property_id":"314186564","region":"California","country":"United States","city":"San Francisco","date":"20230126","totalUsers":173,"newUsers":102,"sessions":237,"sessionsPerUser":1.5095541401273886,"averageSessionDuration":219.36087900843881,"screenPageViews":585,"screenPageViewsPerSession":2.4683544303797467,"bounceRate":0.4177215189873418},"emitted_at":1678381351369} +{"stream":"locations","data":{"uuid":"3dd8a901-4881-46ac-9367-75efc95171de","property_id":"314186564","region":"California","country":"United States","city":"San Jose","date":"20230126","totalUsers":125,"newUsers":102,"sessions":143,"sessionsPerUser":1.2222222222222223,"averageSessionDuration":159.3054194195804,"screenPageViews":249,"screenPageViewsPerSession":1.7412587412587412,"bounceRate":0.4195804195804196},"emitted_at":1678381351369} +{"stream":"locations","data":{"uuid":"3711890a-805e-417d-bd75-d869ca3172c0","property_id":"314186564","region":"Washington","country":"United States","city":"Seattle","date":"20230126","totalUsers":119,"newUsers":84,"sessions":193,"sessionsPerUser":1.7545454545454546,"averageSessionDuration":103.39999222797927,"screenPageViews":323,"screenPageViewsPerSession":1.6735751295336787,"bounceRate":0.5699481865284974},"emitted_at":1678381351369} +{"stream":"locations","data":{"uuid":"9372b250-d3e0-4063-ba6d-643456ae78ed","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230123","totalUsers":117,"newUsers":63,"sessions":167,"sessionsPerUser":1.7395833333333333,"averageSessionDuration":269.8072515628742,"screenPageViews":538,"screenPageViewsPerSession":3.2215568862275448,"bounceRate":0.49700598802395207},"emitted_at":1678381351369} +{"stream":"locations","data":{"uuid":"1e72f548-0bc9-467d-b8c4-c48275d43554","property_id":"314186564","region":"England","country":"United Kingdom","city":"London","date":"20230126","totalUsers":115,"newUsers":15,"sessions":196,"sessionsPerUser":2.0631578947368423,"averageSessionDuration":75.64311498979592,"screenPageViews":231,"screenPageViewsPerSession":1.1785714285714286,"bounceRate":0.8214285714285714},"emitted_at":1678381351370} +{"stream":"locations","data":{"uuid":"3d583d87-19b2-469e-9c8d-f7fbe8673fff","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230125","totalUsers":114,"newUsers":66,"sessions":171,"sessionsPerUser":1.693069306930693,"averageSessionDuration":314.769004625731,"screenPageViews":747,"screenPageViewsPerSession":4.368421052631579,"bounceRate":0.39766081871345027},"emitted_at":1678381351370} +{"stream":"locations","data":{"uuid":"a32e99fd-7804-4f3f-872e-20ca17adaabe","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230111","totalUsers":108,"newUsers":71,"sessions":156,"sessionsPerUser":1.7333333333333334,"averageSessionDuration":226.08829592307688,"screenPageViews":451,"screenPageViewsPerSession":2.891025641025641,"bounceRate":0.5769230769230769},"emitted_at":1678381351370} +{"stream":"locations","data":{"uuid":"469ff29d-f73d-4ec6-95b9-af454cee1365","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230127","totalUsers":107,"newUsers":54,"sessions":158,"sessionsPerUser":1.880952380952381,"averageSessionDuration":394.91075217721516,"screenPageViews":1063,"screenPageViewsPerSession":6.727848101265823,"bounceRate":0.5189873417721519},"emitted_at":1678381351370} +{"stream":"locations","data":{"uuid":"26c149f6-bbcb-4f92-a5d1-32e1052a6549","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230119","totalUsers":106,"newUsers":59,"sessions":140,"sessionsPerUser":1.5217391304347827,"averageSessionDuration":226.4892927142857,"screenPageViews":304,"screenPageViewsPerSession":2.1714285714285713,"bounceRate":0.4714285714285714},"emitted_at":1678381351370} +{"stream":"locations","data":{"uuid":"aa385c07-0081-4350-99d1-64d1f352e842","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230124","totalUsers":106,"newUsers":49,"sessions":166,"sessionsPerUser":1.711340206185567,"averageSessionDuration":314.4820807349397,"screenPageViews":683,"screenPageViewsPerSession":4.114457831325301,"bounceRate":0.5301204819277109},"emitted_at":1678381351370} +{"stream":"locations","data":{"uuid":"4118cbba-0628-441f-94d8-6aad16d65dc4","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230118","totalUsers":101,"newUsers":64,"sessions":134,"sessionsPerUser":1.425531914893617,"averageSessionDuration":204.23028168656717,"screenPageViews":421,"screenPageViewsPerSession":3.1417910447761193,"bounceRate":0.4701492537313433},"emitted_at":1678381351371} +{"stream":"locations","data":{"uuid":"f31fbc84-53e2-4c87-a0d6-b8fb79be5128","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230130","totalUsers":100,"newUsers":50,"sessions":148,"sessionsPerUser":1.7411764705882353,"averageSessionDuration":588.3146048175676,"screenPageViews":1659,"screenPageViewsPerSession":11.20945945945946,"bounceRate":0.46621621621621623},"emitted_at":1678381351371} +{"stream":"locations","data":{"uuid":"3c54aefd-a080-4a24-92c5-071a511c00f0","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230117","totalUsers":99,"newUsers":53,"sessions":130,"sessionsPerUser":1.6883116883116882,"averageSessionDuration":252.9449443615385,"screenPageViews":310,"screenPageViewsPerSession":2.3846153846153846,"bounceRate":0.49230769230769234},"emitted_at":1678381351371} +{"stream":"locations","data":{"uuid":"f88cec28-9ac0-43e4-a0b7-70943c7b0499","property_id":"314186564","region":"California","country":"United States","city":"Los Angeles","date":"20230126","totalUsers":94,"newUsers":78,"sessions":115,"sessionsPerUser":1.2921348314606742,"averageSessionDuration":115.01889710434781,"screenPageViews":194,"screenPageViewsPerSession":1.6869565217391305,"bounceRate":0.4608695652173913},"emitted_at":1678381351371} +{"stream":"locations","data":{"uuid":"b21cf7b6-1708-4a67-bcf3-8645039c20c7","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230112","totalUsers":94,"newUsers":54,"sessions":125,"sessionsPerUser":1.6025641025641026,"averageSessionDuration":385.297371184,"screenPageViews":393,"screenPageViewsPerSession":3.144,"bounceRate":0.52},"emitted_at":1678381351371} +{"stream":"locations","data":{"uuid":"3e4b220d-2825-48d6-aa5b-e67f608c4761","property_id":"314186564","region":"Karnataka","country":"India","city":"Bengaluru","date":"20230111","totalUsers":92,"newUsers":52,"sessions":115,"sessionsPerUser":1.4375,"averageSessionDuration":266.1262206173913,"screenPageViews":185,"screenPageViewsPerSession":1.608695652173913,"bounceRate":0.4782608695652174},"emitted_at":1678381351371} +{"stream":"locations","data":{"uuid":"aaeafa30-ea15-4e4c-abfe-26e7248fd26b","property_id":"314186564","region":"New York","country":"United States","city":"New York","date":"20230110","totalUsers":92,"newUsers":54,"sessions":134,"sessionsPerUser":1.7402597402597402,"averageSessionDuration":165.56627757462687,"screenPageViews":162,"screenPageViewsPerSession":1.208955223880597,"bounceRate":0.5373134328358209},"emitted_at":1678381351371} +{"stream":"locations","data":{"uuid":"61b39026-477f-4fbb-8a64-d39a38a3ae81","property_id":"314186564","region":"Virginia","country":"United States","city":"Ashburn","date":"20230126","totalUsers":91,"newUsers":69,"sessions":115,"sessionsPerUser":1.3855421686746987,"averageSessionDuration":56.888851956521734,"screenPageViews":140,"screenPageViewsPerSession":1.2173913043478262,"bounceRate":0.6086956521739131},"emitted_at":1678381351371} +{"stream":"locations","data":{"uuid":"cc88c92e-0f4b-4e28-b617-d885d755d654","property_id":"314186564","region":"California","country":"United States","city":"Oakland","date":"20230124","totalUsers":12,"newUsers":4,"sessions":15,"sessionsPerUser":1.5,"averageSessionDuration":129.37265566666667,"screenPageViews":21,"screenPageViewsPerSession":1.4,"bounceRate":0.6},"emitted_at":1678381351464} +{"stream":"locations","data":{"uuid":"1fc85a8b-0c1d-4481-b5f1-db3213dd6e7b","property_id":"314186564","region":"California","country":"United States","city":"San Diego","date":"20230118","totalUsers":12,"newUsers":6,"sessions":16,"sessionsPerUser":1.7777777777777777,"averageSessionDuration":191.2098831875,"screenPageViews":24,"screenPageViewsPerSession":1.5,"bounceRate":0.5},"emitted_at":1678381351464} +{"stream":"locations","data":{"uuid":"cc0645bc-d844-4a74-b7b9-4a17e96b0eff","property_id":"314186564","region":"California","country":"United States","city":"San Diego","date":"20230130","totalUsers":12,"newUsers":8,"sessions":22,"sessionsPerUser":2,"averageSessionDuration":207.01342677272726,"screenPageViews":43,"screenPageViewsPerSession":1.9545454545454546,"bounceRate":0.36363636363636365},"emitted_at":1678381351464} +{"stream":"pages","data":{"uuid":"88a07f5d-684c-4711-a813-a8b9aca86087","property_id":"314186564","date":"20230126","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":2276,"bounceRate":0.7348798674399337},"emitted_at":1678381363213} +{"stream":"pages","data":{"uuid":"e118fcaf-26b2-442b-9e16-3520b5448d19","property_id":"314186564","date":"20230126","hostName":"airbyte.com","pagePathPlusQueryString":"/blog/why-airbyte-made-alpha-and-beta-connectors-free","screenPageViews":2176,"bounceRate":0.3861464968152866},"emitted_at":1678381363213} +{"stream":"pages","data":{"uuid":"30a61f7f-58b2-4629-97e8-1b2590d7bb5f","property_id":"314186564","date":"20230130","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1638,"bounceRate":0.6044857768052516},"emitted_at":1678381363213} +{"stream":"pages","data":{"uuid":"c627bc4b-3959-4bcb-98d9-ad0de7b4b915","property_id":"314186564","date":"20230109","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1594,"bounceRate":0.6356033452807647},"emitted_at":1678381363213} +{"stream":"pages","data":{"uuid":"7b52c8e8-946f-4564-8b23-bb6d9d7f49c2","property_id":"314186564","date":"20230117","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1481,"bounceRate":0.6195266272189349},"emitted_at":1678381363213} +{"stream":"pages","data":{"uuid":"6e600ce8-afba-4645-8825-06df0e00b70a","property_id":"314186564","date":"20230118","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1438,"bounceRate":0.5996376811594203},"emitted_at":1678381363213} +{"stream":"pages","data":{"uuid":"3780cae2-de2a-42bb-b11f-24e56b88ed78","property_id":"314186564","date":"20230110","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1402,"bounceRate":0.6209677419354839},"emitted_at":1678381363213} +{"stream":"pages","data":{"uuid":"8ca47bcc-2fed-47bf-ae41-285a8cbd4acb","property_id":"314186564","date":"20230112","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1384,"bounceRate":0.6355255070682237},"emitted_at":1678381363213} +{"stream":"pages","data":{"uuid":"fc2802e8-7b37-4aa5-b801-e5d7c6e3244e","property_id":"314186564","date":"20230111","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1358,"bounceRate":0.6296529968454259},"emitted_at":1678381363214} +{"stream":"pages","data":{"uuid":"3205cc1f-8f1f-4748-9794-295d51734587","property_id":"314186564","date":"20230119","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1337,"bounceRate":0.6132381570408826},"emitted_at":1678381363214} +{"stream":"pages","data":{"uuid":"cfd090a0-0c40-43b0-b366-6668f79c4de6","property_id":"314186564","date":"20230124","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1327,"bounceRate":0.6260869565217392},"emitted_at":1678381363214} +{"stream":"pages","data":{"uuid":"2d1eef6c-13f1-4ecc-91bf-3fe27cbc7e92","property_id":"314186564","date":"20230123","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1324,"bounceRate":0.5990660440293529},"emitted_at":1678381363214} +{"stream":"pages","data":{"uuid":"cc7235d4-1a60-4594-8f40-884e91a6f4ea","property_id":"314186564","date":"20230127","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1249,"bounceRate":0.6347095871238628},"emitted_at":1678381363214} +{"stream":"pages","data":{"uuid":"0b8be776-1f23-4060-9210-3879849368cb","property_id":"314186564","date":"20230125","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1212,"bounceRate":0.5846042120551924},"emitted_at":1678381363214} +{"stream":"pages","data":{"uuid":"110b98e1-0ab8-49c6-88a0-cf45a18928fa","property_id":"314186564","date":"20230116","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1150,"bounceRate":0.6237698713096139},"emitted_at":1678381363214} +{"stream":"pages","data":{"uuid":"470a6b49-00c8-49e9-a0c7-dbe667460ef1","property_id":"314186564","date":"20230105","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1144,"bounceRate":0.6569940476190477},"emitted_at":1678381363214} +{"stream":"pages","data":{"uuid":"80d446d0-f561-4e90-9451-76b9d7fac99a","property_id":"314186564","date":"20230104","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1124,"bounceRate":0.6132723112128147},"emitted_at":1678381363214} +{"stream":"pages","data":{"uuid":"a6159c64-0d9f-4a58-a7ed-2ec3f670af66","property_id":"314186564","date":"20230113","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1085,"bounceRate":0.6420600858369099},"emitted_at":1678381363214} +{"stream":"pages","data":{"uuid":"65704725-7c22-4f2d-90d6-8205f952367d","property_id":"314186564","date":"20230103","hostName":"airbyte.com","pagePathPlusQueryString":"/","screenPageViews":1082,"bounceRate":0.6127490039840637},"emitted_at":1678381363214} +{"stream":"website_overview","data":{"uuid":"61113a98-9297-42c0-bf4d-ae7ef3eb44d5","property_id":"314186564","date":"20230126","totalUsers":6168,"newUsers":4070,"sessions":8834,"sessionsPerUser":1.580887616320687,"averageSessionDuration":164.98179401697985,"screenPageViews":17314,"screenPageViewsPerSession":1.9599275526375368,"bounceRate":0.528073352954494},"emitted_at":1678381377100} +{"stream":"website_overview","data":{"uuid":"14cca8fb-0ccb-42ff-beb1-3cb54b733fbd","property_id":"314186564","date":"20230130","totalUsers":3682,"newUsers":2000,"sessions":6608,"sessionsPerUser":2.1708278580814717,"averageSessionDuration":190.6988095730932,"screenPageViews":14538,"screenPageViewsPerSession":2.2000605326876514,"bounceRate":0.612590799031477},"emitted_at":1678381377101} +{"stream":"website_overview","data":{"uuid":"bcc011da-9dce-40ae-ac00-bb25b28c2747","property_id":"314186564","date":"20230112","totalUsers":3416,"newUsers":1892,"sessions":5598,"sessionsPerUser":2.011498383039885,"averageSessionDuration":188.77579687477672,"screenPageViews":11043,"screenPageViewsPerSession":1.972668810289389,"bounceRate":0.6379063951411218},"emitted_at":1678381377101} +{"stream":"website_overview","data":{"uuid":"bb4b1589-61be-43c7-8a73-d2255172d4b6","property_id":"314186564","date":"20230123","totalUsers":3308,"newUsers":1749,"sessions":5535,"sessionsPerUser":1.9967532467532467,"averageSessionDuration":188.03694558265582,"screenPageViews":10295,"screenPageViewsPerSession":1.8599819331526648,"bounceRate":0.5694670280036134},"emitted_at":1678381377102} +{"stream":"website_overview","data":{"uuid":"c909659f-3dbc-4a96-b3c8-499522dee675","property_id":"314186564","date":"20230118","totalUsers":3248,"newUsers":1658,"sessions":5376,"sessionsPerUser":2.0317460317460316,"averageSessionDuration":172.09874560900298,"screenPageViews":8572,"screenPageViewsPerSession":1.5944940476190477,"bounceRate":0.5926339285714286},"emitted_at":1678381377102} +{"stream":"website_overview","data":{"uuid":"01530e84-96f6-4d38-9475-6b95897b43de","property_id":"314186564","date":"20230111","totalUsers":3231,"newUsers":1894,"sessions":5518,"sessionsPerUser":2.06203288490284,"averageSessionDuration":149.535961576477,"screenPageViews":8722,"screenPageViewsPerSession":1.5806451612903225,"bounceRate":0.6652772743747735},"emitted_at":1678381377102} +{"stream":"website_overview","data":{"uuid":"4e1e4484-8b31-4a09-8bb3-babba35c6ed1","property_id":"314186564","date":"20230117","totalUsers":3107,"newUsers":1512,"sessions":5135,"sessionsPerUser":2.0385073441842,"averageSessionDuration":183.1596054231743,"screenPageViews":9669,"screenPageViewsPerSession":1.8829600778967868,"bounceRate":0.5888997078870497},"emitted_at":1678381377103} +{"stream":"website_overview","data":{"uuid":"8d7fea6d-3004-4319-a45c-2b1109670773","property_id":"314186564","date":"20230127","totalUsers":3098,"newUsers":1601,"sessions":4931,"sessionsPerUser":1.9739791833466773,"averageSessionDuration":178.9474292780369,"screenPageViews":9555,"screenPageViewsPerSession":1.9377408233624012,"bounceRate":0.619549787061448},"emitted_at":1678381377103} +{"stream":"website_overview","data":{"uuid":"e850847f-74cf-4bba-bc5f-16f3d1cdc1c9","property_id":"314186564","date":"20230124","totalUsers":3061,"newUsers":1509,"sessions":5339,"sessionsPerUser":2.1296370163542084,"averageSessionDuration":193.48503378460387,"screenPageViews":10235,"screenPageViewsPerSession":1.9170256602359992,"bounceRate":0.6147218580258476},"emitted_at":1678381377103} +{"stream":"website_overview","data":{"uuid":"51b80e4d-9e7f-4055-8497-c435a2617130","property_id":"314186564","date":"20230119","totalUsers":3035,"newUsers":1523,"sessions":5033,"sessionsPerUser":2.026983487716472,"averageSessionDuration":184.39271639558913,"screenPageViews":9458,"screenPageViewsPerSession":1.8791972978342937,"bounceRate":0.5845420226505067},"emitted_at":1678381377104} +{"stream":"website_overview","data":{"uuid":"fc93bcad-558d-454b-81eb-614d99e15b85","property_id":"314186564","date":"20230125","totalUsers":2840,"newUsers":1441,"sessions":4652,"sessionsPerUser":2.0008602150537635,"averageSessionDuration":204.45900655674978,"screenPageViews":9531,"screenPageViewsPerSession":2.0487962166809974,"bounceRate":0.5801805674978504},"emitted_at":1678381377104} +{"stream":"website_overview","data":{"uuid":"52aad0a3-2340-403b-99f7-a0e5a2fd8eb3","property_id":"314186564","date":"20230113","totalUsers":2786,"newUsers":1545,"sessions":4403,"sessionsPerUser":1.9210296684118673,"averageSessionDuration":193.9103609679764,"screenPageViews":8331,"screenPageViewsPerSession":1.8921190097660685,"bounceRate":0.6422893481717011},"emitted_at":1678381377104} +{"stream":"website_overview","data":{"uuid":"784a70e8-4325-44c9-8286-0bfe2d7ef8fb","property_id":"314186564","date":"20230110","totalUsers":2757,"newUsers":1419,"sessions":4681,"sessionsPerUser":2.134518923848609,"averageSessionDuration":128.47261591860715,"screenPageViews":5555,"screenPageViewsPerSession":1.1867122409741508,"bounceRate":0.6656697286904507},"emitted_at":1678381377104} +{"stream":"website_overview","data":{"uuid":"34659aa4-9983-4a68-9de5-63a1381ec607","property_id":"314186564","date":"20230109","totalUsers":2691,"newUsers":1390,"sessions":4564,"sessionsPerUser":2.115901715345387,"averageSessionDuration":132.07061591520596,"screenPageViews":5725,"screenPageViewsPerSession":1.2543821209465382,"bounceRate":0.6726555652936022},"emitted_at":1678381377105} +{"stream":"website_overview","data":{"uuid":"17ad08b5-4b51-40f3-be6f-838967a900b8","property_id":"314186564","date":"20230116","totalUsers":2594,"newUsers":1268,"sessions":4517,"sessionsPerUser":2.194849368318756,"averageSessionDuration":172.99511950099625,"screenPageViews":7693,"screenPageViewsPerSession":1.7031215408456941,"bounceRate":0.6232012397609032},"emitted_at":1678381377105} +{"stream":"website_overview","data":{"uuid":"5f09f109-a218-46de-a3e4-14c0719d3aaf","property_id":"314186564","date":"20230105","totalUsers":2377,"newUsers":1194,"sessions":3913,"sessionsPerUser":2.041210224308816,"averageSessionDuration":144.14393872629697,"screenPageViews":4813,"screenPageViewsPerSession":1.2300025555839509,"bounceRate":0.6580628673651929},"emitted_at":1678381377105} +{"stream":"website_overview","data":{"uuid":"e8917eaa-449d-49c7-9d13-6af381ba50a0","property_id":"314186564","date":"20230120","totalUsers":2344,"newUsers":1173,"sessions":3816,"sessionsPerUser":2.04392072844135,"averageSessionDuration":190.34353808307128,"screenPageViews":7625,"screenPageViewsPerSession":1.9981656184486374,"bounceRate":0.5880503144654088},"emitted_at":1678381377106} +{"stream":"website_overview","data":{"uuid":"fdd62ddb-a6a9-49c9-9f25-5f011a79a560","property_id":"314186564","date":"20230104","totalUsers":2239,"newUsers":1137,"sessions":3765,"sessionsPerUser":2.1139809096013478,"averageSessionDuration":139.47659503585655,"screenPageViews":4638,"screenPageViewsPerSession":1.2318725099601593,"bounceRate":0.6608233731739708},"emitted_at":1678381377106} +{"stream":"website_overview","data":{"uuid":"89654a98-195a-4402-b828-9c64086c60a3","property_id":"314186564","date":"20230302","totalUsers":2770,"newUsers":1386,"sessions":4008,"sessionsPerUser":1.660314830157415,"averageSessionDuration":271.822018881986,"screenPageViews":11290,"screenPageViewsPerSession":2.8168662674650697,"bounceRate":0.41092814371257486},"emitted_at":1678381379199} +{"stream":"website_overview","data":{"uuid":"5a39fa48-8a34-448e-8593-376d16d3ab92","property_id":"314186564","date":"20230303","totalUsers":2292,"newUsers":1161,"sessions":3200,"sessionsPerUser":1.634320735444331,"averageSessionDuration":244.685786118125,"screenPageViews":8864,"screenPageViewsPerSession":2.77,"bounceRate":0.43875},"emitted_at":1678381379199} +{"stream":"website_overview","data":{"uuid":"a3cd1fb4-d6cd-4cdf-a9a3-273455a939e2","property_id":"314186564","date":"20230305","totalUsers":1576,"newUsers":901,"sessions":2028,"sessionsPerUser":1.4933726067746687,"averageSessionDuration":218.57345723915188,"screenPageViews":4863,"screenPageViewsPerSession":2.3979289940828403,"bounceRate":0.4285009861932939},"emitted_at":1678381379201} +{"stream":"website_overview","data":{"uuid":"00d72b8b-24a8-4885-af3e-6e2edc617c74","property_id":"314186564","date":"20230304","totalUsers":1253,"newUsers":784,"sessions":1593,"sessionsPerUser":1.4286995515695067,"averageSessionDuration":234.63554106779657,"screenPageViews":3917,"screenPageViewsPerSession":2.4588826114249844,"bounceRate":0.455743879472693},"emitted_at":1678381379202} diff --git a/airbyte-integrations/connectors/source-google-analytics-data-api/source_google_analytics_data_api/source.py b/airbyte-integrations/connectors/source-google-analytics-data-api/source_google_analytics_data_api/source.py index b15e156143bb..f027683b150e 100644 --- a/airbyte-integrations/connectors/source-google-analytics-data-api/source_google_analytics_data_api/source.py +++ b/airbyte-integrations/connectors/source-google-analytics-data-api/source_google_analytics_data_api/source.py @@ -87,10 +87,14 @@ class GoogleAnalyticsDataApiBaseStream(GoogleAnalyticsDataApiAbstractStream): _record_date_format = "%Y%m%d" primary_key = "uuid" - cursor_field = "date" + cursor_field = None metadata = MetadataDescriptor() + def __init__(self, *args, config: Mapping[str, Any], **kwargs): + self.cursor_field = "date" if "date" in config.get("dimensions") else [] + super().__init__(*args, config=config, **kwargs) + @staticmethod def add_primary_key() -> dict: return {"uuid": str(uuid.uuid4())} @@ -117,7 +121,7 @@ def get_json_schema(self) -> Mapping[str, Any]: Override get_json_schema CDK method to retrieve the schema information for GoogleAnalyticsV4 Object dynamically. """ schema: Dict[str, Any] = { - "$schema": "http://json-schema.org/draft-07/schema#", + "$schema": "https://json-schema.org/draft-07/schema#", "type": ["null", "object"], "additionalProperties": True, "properties": { @@ -252,10 +256,11 @@ def parse_response(self, response: requests.Response, **kwargs) -> Iterable[Mapp class SourceGoogleAnalyticsDataApi(AbstractSource): def _validate_and_transform(self, config: Mapping[str, Any], report_names: Set[str]): if "custom_reports" in config: - try: - config["custom_reports"] = json.loads(config["custom_reports"]) - except ValueError: - raise ConfigurationError("custom_reports is not valid JSON") + if isinstance(config["custom_reports"], str): + try: + config["custom_reports"] = json.loads(config["custom_reports"]) + except ValueError: + raise ConfigurationError("custom_reports is not valid JSON") else: config["custom_reports"] = [] @@ -273,11 +278,6 @@ def _validate_and_transform(self, config: Mapping[str, Any], report_names: Set[s existing_names = ", ".join(existing_names) raise ConfigurationError(f"custom_reports: {existing_names} already exist as a default report(s).") - for report in config["custom_reports"]: - # "date" dimension is mandatory because it's cursor_field - if "date" not in report["dimensions"]: - report["dimensions"].append("date") - if "credentials_json" in config["credentials"]: try: config["credentials"]["credentials_json"] = json.loads(config["credentials"]["credentials_json"]) @@ -325,16 +325,20 @@ def check_connection(self, logger: logging.Logger, config: Mapping[str, Any]) -> if invalid_metrics: invalid_metrics = ", ".join(invalid_metrics) return False, f"custom_reports: invalid metric(s): {invalid_metrics} for the custom report: {report['name']}" + report_stream = self.instantiate_report_class(report, config) + # check if custom_report dimensions + metrics can be combined and report generated + stream_slice = next(report_stream.stream_slices(sync_mode=SyncMode.full_refresh)) + next(report_stream.read_records(sync_mode=SyncMode.full_refresh, stream_slice=stream_slice), None) return True, None def streams(self, config: Mapping[str, Any]) -> List[Stream]: reports = json.loads(pkgutil.get_data("source_google_analytics_data_api", "defaults/default_reports.json")) config = self._validate_and_transform(config, report_names={r["name"] for r in reports}) config["authenticator"] = self.get_authenticator(config) + return [self.instantiate_report_class(report, config) for report in reports + config["custom_reports"]] - return [ - type(report["name"], (GoogleAnalyticsDataApiBaseStream,), {})( - config=dict(**config, metrics=report["metrics"], dimensions=report["dimensions"]), authenticator=config["authenticator"] - ) - for report in reports + config["custom_reports"] - ] + @staticmethod + def instantiate_report_class(report: dict, config: Mapping[str, Any]) -> GoogleAnalyticsDataApiBaseStream: + return type(report["name"], (GoogleAnalyticsDataApiBaseStream,), {})( + config=dict(**config, metrics=report["metrics"], dimensions=report["dimensions"]), authenticator=config["authenticator"] + ) diff --git a/airbyte-integrations/connectors/source-google-analytics-data-api/source_google_analytics_data_api/spec.json b/airbyte-integrations/connectors/source-google-analytics-data-api/source_google_analytics_data_api/spec.json index 7348806af7b5..fcb974c82f8c 100644 --- a/airbyte-integrations/connectors/source-google-analytics-data-api/source_google_analytics_data_api/spec.json +++ b/airbyte-integrations/connectors/source-google-analytics-data-api/source_google_analytics_data_api/spec.json @@ -1,7 +1,7 @@ { "documentationUrl": "https://docs.airbyte.com/integrations/sources/google-analytics-data-api", "connectionSpecification": { - "$schema": "http://json-schema.org/draft-07/schema#", + "$schema": "https://json-schema.org/draft-07/schema#", "title": "Google Analytics (Data API) Spec", "type": "object", "required": ["property_id", "date_ranges_start_date"], diff --git a/airbyte-integrations/connectors/source-google-analytics-data-api/unit_tests/test_source.py b/airbyte-integrations/connectors/source-google-analytics-data-api/unit_tests/test_source.py index 0ec8da0a8202..2068e5bfb0e5 100644 --- a/airbyte-integrations/connectors/source-google-analytics-data-api/unit_tests/test_source.py +++ b/airbyte-integrations/connectors/source-google-analytics-data-api/unit_tests/test_source.py @@ -68,6 +68,12 @@ def test_check(requests_mock, config_gen): "dimensions": [{"apiName": "date"}, {"apiName": "country"}], "metrics": [{"apiName": "totalUsers"}, {"apiName": "screenPageViews"}], }) + requests_mock.register_uri("POST", "https://analyticsdata.googleapis.com/v1beta/properties/108176369:runReport", + json={"dimensionHeaders": [{"name": "date"}, {"name": "country"}], + "metricHeaders": [{"name": "totalUsers", "type": "s"}, + {"name": "screenPageViews", "type": "m"}], + "rows": [] + }) source = SourceGoogleAnalyticsDataApi() logger = MagicMock() diff --git a/airbyte-integrations/connectors/source-google-analytics-data-api/unit_tests/test_streams.py b/airbyte-integrations/connectors/source-google-analytics-data-api/unit_tests/test_streams.py index 90acba417f92..dfc64ac79f49 100644 --- a/airbyte-integrations/connectors/source-google-analytics-data-api/unit_tests/test_streams.py +++ b/airbyte-integrations/connectors/source-google-analytics-data-api/unit_tests/test_streams.py @@ -279,7 +279,7 @@ def test_backoff_time(patch_base_class): @freeze_time("2023-01-01 00:00:00") def test_stream_slices(): - config = {"date_ranges_start_date": datetime.date(2022, 12, 29), "window_in_days": 1} + config = {"date_ranges_start_date": datetime.date(2022, 12, 29), "window_in_days": 1, "dimensions": ["date"]} stream = GoogleAnalyticsDataApiBaseStream(authenticator=None, config=config) slices = list(stream.stream_slices(sync_mode=None)) assert slices == [ @@ -289,7 +289,7 @@ def test_stream_slices(): {"startDate": "2023-01-01", "endDate": "2023-01-01"}, ] - config = {"date_ranges_start_date": datetime.date(2022, 12, 28), "window_in_days": 2} + config = {"date_ranges_start_date": datetime.date(2022, 12, 28), "window_in_days": 2, "dimensions": ["date"]} stream = GoogleAnalyticsDataApiBaseStream(authenticator=None, config=config) slices = list(stream.stream_slices(sync_mode=None)) assert slices == [ @@ -298,7 +298,7 @@ def test_stream_slices(): {"startDate": "2023-01-01", "endDate": "2023-01-01"}, ] - config = {"date_ranges_start_date": datetime.date(2022, 12, 20), "window_in_days": 5} + config = {"date_ranges_start_date": datetime.date(2022, 12, 20), "window_in_days": 5, "dimensions": ["date"]} stream = GoogleAnalyticsDataApiBaseStream(authenticator=None, config=config) slices = list(stream.stream_slices(sync_mode=None)) assert slices == [ diff --git a/connectors.md b/connectors.md index b85cad690e8f..fbc9ddb02a3e 100644 --- a/connectors.md +++ b/connectors.md @@ -89,7 +89,7 @@ | **Gong** | Gong icon | Source | airbyte/source-gong:0.1.0 | alpha | [link](https://docs.airbyte.com/integrations/sources/gong) | [code](https://github.com/airbytehq/airbyte/tree/master/airbyte-integrations/connectors/source-gong) | `32382e40-3b49-4b99-9c5c-4076501914e7` | | **Google Ads** | Google Ads icon | Source | airbyte/source-google-ads:0.2.11 | generally_available | [link](https://docs.airbyte.com/integrations/sources/google-ads) | [code](https://github.com/airbytehq/airbyte/tree/master/airbyte-integrations/connectors/source-google-ads) | `253487c0-2246-43ba-a21f-5116b20a2c50` | | **Google Analytics (Universal Analytics)** | Google Analytics (Universal Analytics) icon | Source | airbyte/source-google-analytics-v4:0.1.34 | generally_available | [link](https://docs.airbyte.com/integrations/sources/google-analytics-v4/) | [code](https://github.com/airbytehq/airbyte/tree/master/airbyte-integrations/connectors/source-google-analytics-v4) | `eff3616a-f9c3-11eb-9a03-0242ac130003` | -| **Google Analytics 4 (GA4)** | Google Analytics 4 (GA4) icon | Source | airbyte/source-google-analytics-data-api:0.1.2 | beta | [link](https://docs.airbyte.com/integrations/sources/google-analytics-data-api/) | [code](https://github.com/airbytehq/airbyte/tree/master/airbyte-integrations/connectors/source-google-analytics-data-api) | `3cc2eafd-84aa-4dca-93af-322d9dfeec1a` | +| **Google Analytics 4 (GA4)** | Google Analytics 4 (GA4) icon | Source | airbyte/source-google-analytics-data-api:0.1.3 | beta | [link](https://docs.airbyte.com/integrations/sources/google-analytics-data-api/) | [code](https://github.com/airbytehq/airbyte/tree/master/airbyte-integrations/connectors/source-google-analytics-data-api) | `3cc2eafd-84aa-4dca-93af-322d9dfeec1a` | | **Google Directory** | Google Directory icon | Source | airbyte/source-google-directory:0.1.9 | alpha | [link](https://docs.airbyte.com/integrations/sources/google-directory) | [code](https://github.com/airbytehq/airbyte/tree/master/airbyte-integrations/connectors/source-google-directory) | `d19ae824-e289-4b14-995a-0632eb46d246` | | **Google PageSpeed Insights** | Google PageSpeed Insights icon | Source | airbyte/source-google-pagespeed-insights:0.1.0 | alpha | [link](https://docs.airbyte.com/integrations/sources/google-pagespeed-insights) | [code](https://github.com/airbytehq/airbyte/tree/master/airbyte-integrations/connectors/source-google-pagespeed-insights) | `1e9086ab-ddac-4c1d-aafd-ba43ff575fe4` | | **Google Search Console** | Google Search Console icon | Source | airbyte/source-google-search-console:0.1.20 | generally_available | [link](https://docs.airbyte.com/integrations/sources/google-search-console) | [code](https://github.com/airbytehq/airbyte/tree/master/airbyte-integrations/connectors/source-google-search-console) | `eb4c9e00-db83-4d63-a386-39cfa91012a8` | diff --git a/docs/integrations/sources/google-analytics-data-api.md b/docs/integrations/sources/google-analytics-data-api.md index fcade2e3e1e6..9c935ccf8476 100644 --- a/docs/integrations/sources/google-analytics-data-api.md +++ b/docs/integrations/sources/google-analytics-data-api.md @@ -1,55 +1,64 @@ # Google Analytics 4 (GA4) -This page guides you through the process of setting up the Google Analytics 4 source connector. - -This connector supports GA4 properties through the [Analytics Data API v1](https://developers.google.com/analytics/devguides/reporting/data/v1). +This page contains the setup guide and reference information for the Google Analytics 4 source connector. ## Prerequisites -A Google Cloud account with [Viewer permissions](https://support.google.com/analytics/answer/2884495) and [Google Analytics Reporting API](https://console.developers.google.com/apis/api/analyticsreporting.googleapis.com/overview) and [Google Analytics API](https://console.developers.google.com/apis/api/analytics.googleapis.com/overview) enabled. +* JSON credentials for the service account that has access to Google Analytics. For more details check [instructions](https://support.google.com/analytics/answer/1009702) +* OAuth 2.0 credentials for the service account that has access to Google Analytics +* Property ID -## Setup guide +## Step 1: Set up Source - -**For Airbyte Cloud:** +### Create a Service Account + +First, you need to select existing or create a new project in the Google Developers Console: + +1. Sign in to the Google Account you are using for Google Analytics as an admin. +2. Go to the [Service Accounts](https://console.developers.google.com/iam-admin/serviceaccounts) page. +3. Click `Create service account`. +4. Create a JSON key file for the service user. The contents of this file will be provided as the `credentials_json` in the UI when authorizing GA after you grant permissions \(see below\). + +### Add service account to the Google Analytics account +Use the service account email address to [add a user](https://support.google.com/analytics/answer/1009702) to the Google analytics view you want to access via the API. You will need to grant [Viewer permissions](https://support.google.com/analytics/answer/2884495). -To set up Google Analytics 4 as a source in Airbyte Cloud: +### Enable the APIs -1. [Log into your Airbyte Cloud](https://cloud.airbyte.io/workspaces) account. +1. Go to the [Google Analytics Reporting API dashboard](https://console.developers.google.com/apis/api/analyticsreporting.googleapis.com/overview) in the project for your service user. Enable the API for your account. You can set quotas and check usage. +2. Go to the [Google Analytics API dashboard](https://console.developers.google.com/apis/api/analytics.googleapis.com/overview) in the project for your service user. Enable the API for your account. + +### Step 2: Set up the Google Analytics connector in Airbyte + +**For Airbyte Cloud:** + +1. [Login to your Airbyte Cloud](https://cloud.airbyte.com/workspaces) account. 2. In the left navigation bar, click **Sources**. In the top-right corner, click **+ new source**. 3. On the source setup page, select **Google Analytics 4 (GA4)** from the Source type dropdown and enter a name for this connector. -4. Authenticate your Google account via OAuth or Service Account Key Authentication. - - (Recommended) To authenticate your Google account via OAuth, click **Sign in with Google** and complete the authentication workflow. - - To authenticate your Google account via Service Account Key Authentication, enter your [Google Cloud service account key](https://cloud.google.com/iam/docs/creating-managing-service-account-keys#creating_service_account_keys) in JSON format. Use the service account email address to [add a user](https://support.google.com/analytics/answer/1009702) to the Google analytics view you want to access via the API and grant the [Viewer](https://support.google.com/analytics/answer/2884495) permission. -6. Enter the [**Property ID**](https://developers.google.com/analytics/devguides/reporting/data/v1/property-id#what_is_my_property_id). +4. Click `Authenticate your account` by selecting Oauth or Service Account for Authentication. +5. Log in and Authorize the Google Analytics account. +6. Enter the [**Property ID**](https://developers.google.com/analytics/devguides/reporting/data/v1/property-id#what_is_my_property_id) whose events are tracked. 7. Enter the **Start Date** from which to replicate report data in the format YYYY-MM-DD. -8. Optionally, to generate **Custom Reports**, enter a JSON array describing the [custom reports](#custom-reports) you want to sync from Google Analytics. -9. Leave **Data request time increment in days (Optional)** blank or set to 1. For faster syncs, set this value to more than 1 but that might result in inaccuracies in the returned results. The maximum allowed value is 364. - +8. Enter the **Custom Reports (Optional)** a JSON array describing the custom reports you want to sync from Google Analytics. +9. Enter the **Data request time increment in days (Optional)**. The bigger this value is, the faster the sync will be, but the more likely that sampling will be applied to your data, potentially causing inaccuracies in the returned results. We recommend setting this to 1 unless you have a hard requirement to make the sync faster at the expense of accuracy. The minimum allowed value for this field is 1, and the maximum is 364. - **For Airbyte Open Source:** -To set up Google Analytics 4 as a source in Airbyte Open Source: - -1. Go to the Airbyte UI, click **Sources**, and then click **+ New source**. -2. On the Set up the source page, select **Google Analytics 4 (GA4)** from the **Source type** dropdown. -3. Enter a name for the Google Analytics 4 connector. -4. Authenticate your Google account via OAuth or Service Account Key Authentication: - - To authenticate your Google account via OAuth, enter your Google application's [client ID, client secret, and refresh token](https://developers.google.com/identity/protocols/oauth2). - - To authenticate your Google account via Service Account Key Authentication, enter your [Google Cloud service account key](https://cloud.google.com/iam/docs/creating-managing-service-account-keys#creating_service_account_keys) in JSON format. Use the service account email address to [add a user](https://support.google.com/analytics/answer/1009702) to the Google analytics view you want to access via the API and grant the [Viewer](https://support.google.com/analytics/answer/2884495) permission. -5. Enter the [**Property ID**](https://developers.google.com/analytics/devguides/reporting/data/v1/property-id#what_is_my_property_id). +1. Navigate to the Airbyte Open Source dashboard. +2. In the left navigation bar, click **Sources**. In the top-right corner, click **+ new source**. +3. On the source setup page, select **Google Analytics 4 (GA4)** from the Source type dropdown and enter a name for this connector. +4. Select Service Account for Authentication in dropdown list and enter **Service Account JSON Key** from Step 1. +5. Enter the [**Property ID**](https://developers.google.com/analytics/devguides/reporting/data/v1/property-id#what_is_my_property_id) whose events are tracked. 6. Enter the **Start Date** from which to replicate report data in the format YYYY-MM-DD. -7. Optionally, to generate **Custom Reports**, enter a JSON array describing the [custom reports](#custom-reports) you want to sync from Google Analytics. -8. Leave **Data request time increment in days (Optional)** blank or set to 1. For faster syncs, set this value to more than 1 but that might result in inaccuracies in the returned results. The maximum allowed value is 364. - +7. Enter the **Custom Reports (Optional)** a JSON array describing the custom reports you want to sync from Google Analytics. +8. Enter the **Data request time increment in days (Optional)**. The bigger this value is, the faster the sync will be, but the more likely that sampling will be applied to your data, potentially causing inaccuracies in the returned results. We recommend setting this to 1 unless you have a hard requirement to make the sync faster at the expense of accuracy. The minimum allowed value for this field is 1, and the maximum is 364. + ## Supported sync modes The Google Analytics source connector supports the following [sync modes](https://docs.airbyte.com/cloud/core-concepts#connection-sync-modes): -- [Full Refresh - Overwrite](https://docs.airbyte.com/understanding-airbyte/connections/full-refresh-overwrite/) +- [Full Refresh - Overwrite](https://docs.airbyte.com/understanding-airbyte/glossary#full-refresh-sync) - [Full Refresh - Append](https://docs.airbyte.com/understanding-airbyte/connections/full-refresh-append) - [Incremental - Append](https://docs.airbyte.com/understanding-airbyte/connections/incremental-append) - [Incremental - Deduped History](https://docs.airbyte.com/understanding-airbyte/connections/incremental-deduped-history) @@ -58,29 +67,48 @@ The Google Analytics source connector supports the following [sync modes](https: This connector outputs the following incremental streams: -* [daily_active_users](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) -* [devices](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) -* [four_weekly_active_users](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) -* [locations](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) -* [pages](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) -* [traffic_sources](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) -* [website_overview](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) -* [weekly_active_users](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) +* Preconfigured streams: + * [daily_active_users](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) + * [devices](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) + * [four_weekly_active_users](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) + * [locations](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) + * [pages](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) + * [traffic_sources](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) + * [website_overview](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) + * [weekly_active_users](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) +* [Custom stream\(s\)](https://developers.google.com/analytics/devguides/reporting/data/v1/rest/v1beta/properties/runReport) + +## Connector-specific features + +* Connector supports multiple custom reports with user provided [Dimensions and metrics](https://ga-dev-tools.web.app/dimensions-metrics-explorer/) + +:::note + + * Custom reports should be provided in format `[{"name": "", "dimensions": ["", ...], "metrics": ["", ...]}]` + * To enable Incremental sync for Custom reports, you need to include the `date` dimension. +::: + +## Performance Considerations + +[Google Analytics Data API Quotas docs](https://developers.google.com/analytics/devguides/reporting/data/v1/quotas). -## Custom reports +## Data type map -* Custom reports in format `[{"name": "", "dimensions": ["", ...], "metrics": ["", ...]}]` -* Custom report format when using segments and / or filters `[{"name": "", "dimensions": ["", ...], "metrics": ["", ...], "segments": [""}]` -* When using segments, make sure you add the `ga:segment` dimension. -* Custom reports: [Dimensions and metrics explorer](https://ga-dev-tools.web.app/dimensions-metrics-explorer/) +| Integration Type | Airbyte Type | Notes | +|:-----------------|:-------------|:------| +| `string` | `string` | | +| `number` | `number` | | +| `array` | `array` | | +| `object` | `object` | | ## Changelog -| Version | Date | Pull Request | Subject | -|:--------|:-----------|:---------------------------------------------------------|:---------------------------------------------------| +| Version | Date | Pull Request | Subject | +|:--------|:-----------|:---------------------------------------------------------|:------------------------------------------------------------------------------| +| 0.1.3 | 2023-03-10 | [23872](https://github.com/airbytehq/airbyte/pull/23872) | Fix parse + cursor for custom reports | | 0.1.2 | 2023-03-07 | [23822](https://github.com/airbytehq/airbyte/pull/23822) | Improve `rate limits` customer faced error messages and retry logic for `429` | -| 0.1.1 | 2023-01-10 | [21169](https://github.com/airbytehq/airbyte/pull/21169) | Slicer updated, unit tests added | -| 0.1.0 | 2023-01-08 | [20889](https://github.com/airbytehq/airbyte/pull/20889) | Improved config validation, SAT | -| 0.0.3 | 2022-08-15 | [15229](https://github.com/airbytehq/airbyte/pull/15229) | Source Google Analytics Data Api: code refactoring | -| 0.0.2 | 2022-07-27 | [15087](https://github.com/airbytehq/airbyte/pull/15087) | fix documentationUrl | -| 0.0.1 | 2022-05-09 | [12701](https://github.com/airbytehq/airbyte/pull/12701) | Introduce Google Analytics Data API source | +| 0.1.1 | 2023-01-10 | [21169](https://github.com/airbytehq/airbyte/pull/21169) | Slicer updated, unit tests added | +| 0.1.0 | 2023-01-08 | [20889](https://github.com/airbytehq/airbyte/pull/20889) | Improved config validation, SAT | +| 0.0.3 | 2022-08-15 | [15229](https://github.com/airbytehq/airbyte/pull/15229) | Source Google Analytics Data Api: code refactoring | +| 0.0.2 | 2022-07-27 | [15087](https://github.com/airbytehq/airbyte/pull/15087) | fix documentationUrl | +| 0.0.1 | 2022-05-09 | [12701](https://github.com/airbytehq/airbyte/pull/12701) | Introduce Google Analytics Data API source |