1
0
mirror of synced 2025-12-25 02:09:19 -05:00

source-customerly contribution from Shuky (#55821)

Co-authored-by: Marcos Marx <marcosmarxm@users.noreply.github.com>
This commit is contained in:
shukshuk
2025-03-20 14:58:03 -05:00
committed by GitHub
parent 63b9562c0f
commit dad3fd0c1a
6 changed files with 858 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
# Customerly
This directory contains the manifest-only connector for `source-customerly`.
Connector for customerly.io
## Usage
There are multiple ways to use this connector:
- You can use this connector as any other connector in Airbyte Marketplace.
- You can load this connector in `pyairbyte` using `get_source`!
- You can open this connector in Connector Builder, edit it, and publish to your workspaces.
Please refer to the manifest-only connector documentation for more details.
## Local Development
We recommend you use the Connector Builder to edit this connector.
But, if you want to develop this connector locally, you can use the following steps.
### Environment Setup
You will need `airbyte-ci` installed. You can find the documentation [here](airbyte-ci).
### Build
This will create a dev image (`source-customerly:dev`) that you can use to test the connector locally.
```bash
airbyte-ci connectors --name=source-customerly build
```
### Test
This will run the acceptance tests for the connector.
```bash
airbyte-ci connectors --name=source-customerly test
```

View File

@@ -0,0 +1,17 @@
# 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-customerly:dev
acceptance_tests:
spec:
tests:
- spec_path: "manifest.yaml"
connection:
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
discovery:
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
basic_read:
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
incremental:
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"
full_refresh:
bypass_reason: "This is a builder contribution, and we do not have secrets at this time"

View File

@@ -0,0 +1 @@
<svg height="600" viewBox="0 0 600 600" width="600" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientUnits="userSpaceOnUse" x1="446.349757" x2="111.78597" y1="610.887571" y2="-88.681184"><stop offset=".00001" stop-color="#2589ff"/><stop offset="1" stop-color="#78daff"/></linearGradient><path d="m295.449036 509.319946c125.68927 0 227.578247-98.745422 227.578247-220.555298 0-121.8078-101.888977-220.552978-227.578247-220.552978-125.689545 0-227.580628 98.745178-227.580628 220.552978 0 121.809876 101.891083 220.555298 227.580628 220.555298z" fill="#fff"/><path d="m66.465698 408.981812c-.715118-1.173584-1.460022-2.349549-2.235687-3.527802l.772156.705566c-17.685944-34.628204-27.64502-73.752838-27.64502-115.168823 0-141.637207 116.473267-256.457001 260.150299-256.457001 143.677552 0 260.150269 114.819794 260.150269 256.457001 0 141.637665-116.472717 256.457245-260.150269 256.457245-36.456085 0-71.161102-7.393249-102.654815-20.740601-234.419938 75.832276-73.231476-7.211547-123.673218-109.175109-1.624176-2.817566-3.195984-5.667694-4.713715-8.550476zm154.136048-203.790314c-12.932892 0-23.418213 10.444366-23.418213 23.328338 0 12.883973 10.485321 23.329987 23.418213 23.329987h125.337707c12.932861 0 23.418396-10.446014 23.418396-23.329987 0-12.883972-10.485535-23.328338-23.418396-23.328338zm0 135.255798c-12.932892 0-23.418213 10.445954-23.418213 23.329926 0 12.884002 10.485321 23.327636 23.418213 23.327636h125.337707c12.932861 0 23.418396-10.443634 23.418396-23.327636 0-12.883972-10.485535-23.329926-23.418396-23.329926zm25.851806-67.628723c-12.932892 0-23.418457 10.445984-23.418457 23.329987 0 12.883972 10.485565 23.329956 23.418457 23.329956h125.337647c12.935241 0 23.418518-10.445984 23.418518-23.329956 0-12.884003-10.483277-23.329987-23.418518-23.329987z" fill="url(#a)" fill-rule="evenodd"/><path d="m562.606018 115.444397c0-44.68573-36.362976-80.910645-81.218262-80.910645-44.857544 0-81.220581 36.224915-81.220581 80.910645 0 44.68576 36.363037 80.910889 81.220581 80.910889 44.855286 0 81.218262-36.225129 81.218262-80.910889z" fill="#ff2e2e"/><path d="m462.833679 99.05127 20.589295-17.695984h7.036926v62.475586h13.601135v6.524414h-37.11969v-6.524414h14.877197v-46.985718c0-1.408325.04657-2.83197.142029-4.271485l-12.374023 10.514405c-.314331.250305-.638001.437988-.968689.563049-.330628.125305-.638001.187927-.919739.187927-.472717 0-.905823-.10968-1.299377-.328552-.393555-.219116-.684571-.469482-.87323-.750977z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -0,0 +1,747 @@
version: 6.5.2
type: DeclarativeSource
description: Connector for customerly.io
check:
type: CheckStream
stream_names:
- users
definitions:
streams:
leads:
type: DeclarativeStream
name: leads
retriever:
type: SimpleRetriever
paginator:
type: DefaultPaginator
page_size_option:
type: RequestOption
field_name: per_page
inject_into: request_parameter
page_token_option:
type: RequestOption
field_name: page
inject_into: request_parameter
pagination_strategy:
type: PageIncrement
page_size: 50
start_from_page: 0
requester:
$ref: "#/definitions/base_requester"
path: leads/list
http_method: GET
request_parameters:
sort: last_update
sort_direction: desc
record_selector:
type: RecordSelector
extractor:
type: DpathExtractor
field_path:
- data
- leads
schema_normalization: Default
primary_key:
- crmhero_user_id
schema_loader:
type: InlineSchemaLoader
schema:
$ref: "#/schemas/leads"
transformations:
- type: AddFields
fields:
- path:
- ab_test
value: "{{ record['attributes']['ab_test'] }}"
- type: AddFields
fields:
- path:
- ab_test_var
value: "{{ record['attributes']['ab_test_var'] }}"
- type: AddFields
fields:
- path:
- create_date
value: "{{ record['attributes']['create_date'] }}"
- type: AddFields
fields:
- path:
- role
value: "{{ record['attributes']['role'] }}"
- type: AddFields
fields:
- path:
- sub_active
value: "{{ record['attributes']['sub_active'] }}"
- type: AddFields
fields:
- path:
- sub_status
value: "{{ record['attributes']['sub_status'] }}"
- type: AddFields
fields:
- path:
- username
value: "{{ record['attributes']['username'] }}"
- type: AddFields
fields:
- path:
- initiated_checkout_at
value: "{{ record['attributes']['initiated_checkout_at'] }}"
- type: RemoveFields
field_pointers:
- - utm_source
- type: RemoveFields
field_pointers:
- - was_lead
- type: RemoveFields
field_pointers:
- - ip_address
- type: RemoveFields
field_pointers:
- - isp
- type: RemoveFields
field_pointers:
- - browser_version
- type: RemoveFields
field_pointers:
- - last_page_viewed
- type: RemoveFields
field_pointers:
- - last_page_viewed_at
- type: RemoveFields
field_pointers:
- - android_app_name
- type: RemoveFields
field_pointers:
- - android_app_version
- type: RemoveFields
field_pointers:
- - android_device
- type: RemoveFields
field_pointers:
- - android_last_seen_at
- type: RemoveFields
field_pointers:
- - android_os_version
- type: RemoveFields
field_pointers:
- - android_session
- type: RemoveFields
field_pointers:
- - ios_app_name
- type: RemoveFields
field_pointers:
- - ios_app_version
- type: RemoveFields
field_pointers:
- - ios_device
- type: RemoveFields
field_pointers:
- - ios_last_seen_at
- type: RemoveFields
field_pointers:
- - ios_os_version
- type: RemoveFields
field_pointers:
- - ios_session
- type: RemoveFields
field_pointers:
- - referrer
- type: RemoveFields
field_pointers:
- - utm_campaign
- type: RemoveFields
field_pointers:
- - utm_content
- type: RemoveFields
field_pointers:
- - utm_medium
- type: RemoveFields
field_pointers:
- - utm_source
- type: RemoveFields
field_pointers:
- - utm_term
- type: RemoveFields
field_pointers:
- - picture_background
- type: RemoveFields
field_pointers:
- - picture_gravatar
- type: RemoveFields
field_pointers:
- - picture_gravatar_last_update
- type: RemoveFields
field_pointers:
- - picture_gravatar
- type: RemoveFields
field_pointers:
- - facebook_profile_id
- type: RemoveFields
field_pointers:
- - name
- type: RemoveFields
field_pointers:
- - is_user
- type: RemoveFields
field_pointers:
- - rating
- type: RemoveFields
field_pointers:
- - web_session
- type: RemoveFields
field_pointers:
- - app_id
- type: RemoveFields
field_pointers:
- - is_name_autogenerated
- type: RemoveFields
field_pointers:
- - picture_initials
- type: RemoveFields
field_pointers:
- - spam
- type: RemoveFields
field_pointers:
- - bounce
- type: RemoveFields
field_pointers:
- - attributes
incremental_sync:
type: DatetimeBasedCursor
cursor_field: last_update
is_data_feed: true
start_datetime:
type: MinMaxDatetime
datetime: "2024-01-01"
datetime_format: "%Y-%m-%d"
datetime_format: "%Y-%m-%d %H:%M:%S"
cursor_datetime_formats:
- "%Y-%m-%d %H:%M:%S"
users:
type: DeclarativeStream
name: users
retriever:
type: SimpleRetriever
paginator:
type: DefaultPaginator
page_size_option:
type: RequestOption
field_name: per_page
inject_into: request_parameter
page_token_option:
type: RequestOption
field_name: page
inject_into: request_parameter
pagination_strategy:
type: PageIncrement
page_size: 50
start_from_page: 0
requester:
$ref: "#/definitions/base_requester"
path: users/list
http_method: GET
request_parameters:
sort: last_update
sort_direction: desc
record_selector:
type: RecordSelector
extractor:
type: DpathExtractor
field_path:
- data
- users
schema_normalization: Default
primary_key:
- user_id
- email
schema_loader:
type: InlineSchemaLoader
schema:
$ref: "#/schemas/users"
transformations:
- type: AddFields
fields:
- path:
- ab_test
value: "{{ record['attributes']['ab_test'] }}"
- type: AddFields
fields:
- path:
- ab_test_var
value: "{{ record['attributes']['ab_test_var'] }}"
- type: AddFields
fields:
- path:
- create_date
value: "{{ record['attributes']['create_date'] }}"
- type: AddFields
fields:
- path:
- role
value: "{{ record['attributes']['role'] }}"
- type: AddFields
fields:
- path:
- sub_active
value: "{{ record['attributes']['sub_active'] }}"
- type: AddFields
fields:
- path:
- sub_status
value: "{{ record['attributes']['sub_status'] }}"
- type: AddFields
fields:
- path:
- username
value: "{{ record['attributes']['username'] }}"
- type: AddFields
fields:
- path:
- initiated_checkout_at
value: "{{ record['attributes']['initiated_checkout_at'] }}"
- type: RemoveFields
field_pointers:
- - utm_source
- type: RemoveFields
field_pointers:
- - was_lead
- type: RemoveFields
field_pointers:
- - ip_address
- type: RemoveFields
field_pointers:
- - isp
- type: RemoveFields
field_pointers:
- - browser_version
- type: RemoveFields
field_pointers:
- - last_page_viewed
- type: RemoveFields
field_pointers:
- - last_page_viewed_at
- type: RemoveFields
field_pointers:
- - android_app_name
- type: RemoveFields
field_pointers:
- - android_app_version
- type: RemoveFields
field_pointers:
- - android_device
- type: RemoveFields
field_pointers:
- - android_last_seen_at
- type: RemoveFields
field_pointers:
- - android_os_version
- type: RemoveFields
field_pointers:
- - android_session
- type: RemoveFields
field_pointers:
- - ios_app_name
- type: RemoveFields
field_pointers:
- - ios_app_version
- type: RemoveFields
field_pointers:
- - ios_device
- type: RemoveFields
field_pointers:
- - ios_last_seen_at
- type: RemoveFields
field_pointers:
- - ios_os_version
- type: RemoveFields
field_pointers:
- - ios_session
- type: RemoveFields
field_pointers:
- - referrer
- type: RemoveFields
field_pointers:
- - utm_campaign
- type: RemoveFields
field_pointers:
- - utm_content
- type: RemoveFields
field_pointers:
- - utm_medium
- type: RemoveFields
field_pointers:
- - utm_source
- type: RemoveFields
field_pointers:
- - utm_term
- type: RemoveFields
field_pointers:
- - picture_background
- type: RemoveFields
field_pointers:
- - picture_gravatar
- type: RemoveFields
field_pointers:
- - picture_gravatar_last_update
- type: RemoveFields
field_pointers:
- - picture_gravatar
- type: RemoveFields
field_pointers:
- - facebook_profile_id
- type: RemoveFields
field_pointers:
- - name
- type: RemoveFields
field_pointers:
- - is_user
- type: RemoveFields
field_pointers:
- - rating
- type: RemoveFields
field_pointers:
- - web_session
- type: RemoveFields
field_pointers:
- - app_id
- type: RemoveFields
field_pointers:
- - is_name_autogenerated
- type: RemoveFields
field_pointers:
- - picture_initials
- type: RemoveFields
field_pointers:
- - spam
- type: RemoveFields
field_pointers:
- - bounce
- type: RemoveFields
field_pointers:
- - attributes
incremental_sync:
type: DatetimeBasedCursor
cursor_field: last_update
is_data_feed: true
start_datetime:
type: MinMaxDatetime
datetime: "2024-01-01"
datetime_format: "%Y-%m-%d"
datetime_format: "%Y-%m-%d %H:%M:%S"
cursor_datetime_formats:
- "%Y-%m-%d %H:%M:%S"
base_requester:
type: HttpRequester
url_base: https://api.customerly.io/v1/
authenticator:
type: BearerAuthenticator
api_token: "{{ config[\"api_key\"] }}"
streams:
- $ref: "#/definitions/streams/users"
- $ref: "#/definitions/streams/leads"
spec:
type: Spec
connection_specification:
type: object
$schema: http://json-schema.org/draft-07/schema#
required:
- api_key
properties:
api_key:
type: string
order: 0
title: API Key
airbyte_secret: true
additionalProperties: true
metadata:
assist: {}
testedStreams:
leads:
hasRecords: true
streamHash: 7b31efcc26e955e5ae2969e4453bd5124a5c2797
hasResponse: true
primaryKeysAreUnique: true
primaryKeysArePresent: true
responsesAreSuccessful: true
users:
hasRecords: true
streamHash: 79976ce70a608e62853c83d36f2a5935eed4e021
hasResponse: true
primaryKeysAreUnique: true
primaryKeysArePresent: true
responsesAreSuccessful: true
yamlComponents:
streams:
leads:
- incrementalSync
users:
- incrementalSync
autoImportSchema:
leads: true
users: true
schemas:
leads:
type: object
$schema: http://json-schema.org/schema#
required:
- crmhero_user_id
- last_update
properties:
os:
type:
- string
- "null"
city:
type:
- string
- "null"
role:
type:
- string
- "null"
email:
type:
- string
- "null"
region:
type:
- string
- "null"
ab_test:
type:
- number
- string
- "null"
country:
type:
- string
- "null"
latitude:
type:
- number
- "null"
timezone:
type:
- string
- "null"
username:
type:
- string
- "null"
continent:
type:
- string
- "null"
longitude:
type:
- number
- "null"
os_version:
type:
- string
- "null"
sub_active:
type:
- string
- "null"
sub_status:
type:
- string
- "null"
ab_test_var:
type:
- number
- string
- "null"
create_date:
type:
- number
- string
- "null"
last_update:
type: string
postal_code:
type:
- string
- "null"
region_code:
type:
- string
- "null"
unsubscribe:
type:
- number
- "null"
browser_name:
type:
- string
- "null"
country_code:
type:
- string
- "null"
first_seen_at:
type:
- number
- "null"
last_activity:
type:
- number
- "null"
continent_code:
type:
- string
- "null"
crmhero_user_id:
type: number
browser_language:
type:
- string
- "null"
initiated_checkout_at:
type:
- string
- "null"
additionalProperties: true
users:
type: object
$schema: http://json-schema.org/schema#
required:
- user_id
- email
- last_update
properties:
os:
type:
- string
- "null"
city:
type:
- string
- "null"
role:
type:
- string
- "null"
email:
type: string
region:
type:
- string
- "null"
ab_test:
type:
- number
- string
- "null"
country:
type:
- string
- "null"
user_id:
type: string
latitude:
type:
- number
- "null"
nps_vote:
type:
- number
- "null"
timezone:
type:
- string
- "null"
username:
type:
- string
- "null"
continent:
type:
- string
- "null"
longitude:
type:
- number
- "null"
os_version:
type:
- string
- "null"
sub_active:
type:
- number
- string
- "null"
sub_status:
type:
- string
- "null"
ab_test_var:
type:
- number
- string
- "null"
create_date:
type:
- number
- string
- "null"
last_update:
type: string
postal_code:
type:
- string
- "null"
region_code:
type:
- string
- "null"
unsubscribe:
type:
- number
- "null"
browser_name:
type:
- string
- "null"
country_code:
type:
- string
- "null"
first_seen_at:
type:
- number
- "null"
last_activity:
type:
- number
- "null"
continent_code:
type:
- string
- "null"
crmhero_user_id:
type:
- number
- "null"
browser_language:
type:
- string
- "null"
initiated_checkout_at:
type:
- number
- string
- "null"
additionalProperties: true

View File

@@ -0,0 +1,35 @@
metadataSpecVersion: "1.0"
data:
allowedHosts:
hosts:
- "api.customerly.io"
registryOverrides:
oss:
enabled: true
cloud:
enabled: true
remoteRegistries:
pypi:
enabled: false
packageName: airbyte-source-customerly
connectorBuildOptions:
baseImage: docker.io/airbyte/source-declarative-manifest:6.41.3@sha256:dad33e5ffdd4a2480ea809d79ebad0128214c3cd0f2799ae3f0232e737a0bc58
connectorSubtype: api
connectorType: source
definitionId: 5a48749a-84ee-4a4e-8e84-217119fbe438
dockerImageTag: 0.0.1
dockerRepository: airbyte/source-customerly
githubIssueLabel: source-customerly
icon: icon.svg
license: MIT
name: Customerly
releaseDate: 2025-03-18
releaseStage: alpha
supportLevel: community
documentationUrl: https://docs.airbyte.com/integrations/sources/customerly
tags:
- language:manifest-only
- cdk:low-code
ab_internal:
ql: 100
sl: 100

View File

@@ -0,0 +1,25 @@
# Customerly
Connector for customerly.io
## Configuration
| Input | Type | Description | Default Value |
|-------|------|-------------|---------------|
| `api_key` | `string` | API Key. | |
## Streams
| Stream Name | Primary Key | Pagination | Supports Full Sync | Supports Incremental |
|-------------|-------------|------------|---------------------|----------------------|
| users | user_id.email | DefaultPaginator | ✅ | ✅ |
| leads | crmhero_user_id | DefaultPaginator | ✅ | ✅ |
## Changelog
<details>
<summary>Expand to review</summary>
| Version | Date | Pull Request | Subject |
|------------------|-------------------|--------------|----------------|
| 0.0.1 | 2025-03-18 | | Initial release by [@Shuky](https://github.com/Shuky) via Connector Builder |
</details>