Is a Web Based Reporting System that Extract Data From Klaviyo and Display it On a More Productive Level
Utilize the Following Latest Stack of Technology
- git clone --recursive https://github.com/g0ld3lux/reporthero.io
- composer install
- yarn install or npm install
- cp .env.example .env
- edit .env file
- KLAVIYO_PUBLIC_API_KEY=yourpublickey
- KLAVIYO_PRIVATE_API_KEY=yourprivatekey
- KLAVIYO_EMAIL=yourklaviyoemail
- KLAVIYO_API_VERSION=api/v1/
- ServerSide API
- Method (GET) /api/track
- Method (GET) /api/track-once
- Method (GET) /api/identify
- Metrics API
- ENDPOINTS :
- Method (GET) /api/v1/metrics
- Args (api_key:required,page:optional,count:optional)
- Method (GET) /api/v1/metrics/timeline
- Args (api_key:required,since:optional,count:optional,sort:optional(asc, desc))
- Method (GET) /api/v1/metric/{{METRIC_ID}}/timeline
- Param (Metric ID)
- Args (api_key:required,since:optional,count:optional,sort:optional(asc, desc))
- Method (GET) /api/v1/metric/{{METRIC_ID}}/export
- Param (Metric ID)
- Args (api_key:required,start_date:optional,end_date:optional,measurement:optional,where:optional,by:optional,count:optional)
- Method (GET) /api/v1/metrics
- Profiles API
- ENDPOINTS :
- Method (GET) /api/v1/person/{PERSON_ID}
- Param (PERSON ID)
- Args (api_key:required)
- Method (PUT) /api/v1/person/{PERSON_ID}
- Args (api_key:required,$id,$email,$first_name,$last_name,$phone_number,$title,$organization,$city,$region,$country,$zip)
- Method (GET) /api/v1/person/{{PERSON_ID}}/metrics/timeline
- Param (PERSON ID)
- Args (api_key:required,since:optional,count:optional,sort:optional(asc, desc))
- Method (GET) /api/v1/person/{{PERSON_ID}}/metric/{{METRIC_ID}}/timeline
- Param (PERSON ID , METRIC ID)
- Args (api_key:required,since:optional,count:optional,sort:optional(asc, desc))
- Method (GET) /api/v1/person/{PERSON_ID}
- Lists API
- ENDPOINTS :
- Method (GET) /api/v1/lists
- Args (api_key:required,page:optional,count:optional)
- Method (POST) /api/v1/lists
- Args (api_key:required,name:required,list_type:required(default:standard))
- Method (GET) /api/v1/list/{LIST_ID}
- Param (LIST_ID)
- Args (api_key:required)
- Method (PUT) /api/v1/list/{LIST_ID}
- Param (LIST_ID)
- Args (api_key:required,name:required)
- Method (DELETE) /api/v1/list/{LIST_ID}
- Param (LIST_ID)
- Args (api_key:required)
- Method (GET) /api/v1/list/{LIST_ID}/members
- Param (LIST_ID)
- Args(api_key:required,email:required(array))
- Method (GET) /api/v1/segment/{SEGMENT_ID}/members
- Param (SEGMENT_ID
- Args (api_key:required,email:required(array))
- Method (POST) /api/v1/list/{LIST_ID}/members
- Param (LIST_ID)
- Args (api_key:required,email:required,properties:required(json),confirm_optn:optional(boolean))
- Method (POST) /api/v1/list/{LIST_ID}/members/batch
- Param (LIST_ID)
- Args (api_key:required,batch:required(json),confirm_optn:optional(boolean))
- Method (DELETE) /api/v1/list/{LIST_ID}/members/batch
- Param (LIST_ID)
- Args (api_key:required,batch:required(json))
- Method (POST) /api/v1/list/{LIST_ID}/members/exclude
- Param (LIST_ID)
- Args (api_key:required,email:required,timestamp:optional(unix_timestamp))
- Method (GET) /api/v1/list/{ LIST_ID }/exclusions
- Param (LIST_ID)
- Args (api_key:required,reason:optional(unsubscribed, bounced, invalid_email, reported_spam and manually_excluded),sort:optional(asc, desc))
- Method (GET) /api/v1/people/exclusions
- Params (LIST_ID)
- Args (api_key:required,reason:optional(unsubscribed, bounced, invalid_email, reported_spam and manually_excluded),sort:optional(asc, desc))
- Method (POST) /api/v1/people/exclusions
- Args (api_key:required,email:required,timestamp:optional(unix_timestamp))
- Method (GET) /api/v1/lists
- Campaign API
- Method (GET) /api/v1/campaigns
- Args (api_key:required,page:optional,count:optional)
- Method (POST) /api/v1/campaigns
- Args (api_key:required,list_id:)
- Method (GET) /api/v1/campaign/{CAMPAIGN_ID}
- Params (CAMPAIGN_ID)
- Args (api_key:required)
- Method (PUT) /api/v1/campaign/{CAMPAIGN_ID}
- Params (CAMPAIGN_ID)
- Args (api_key:required,list_id:optional(string), template_id:optional(string), from_email:optional(string), from_name:optional(string), subject:optional(string), use_smart_sending:optional(boolean), add_google_analytics(boolean))
- Method (POST) /api/v1/campaign/{CAMPAIGN_ID}/send
- Params (CAMPAIGN_ID)
- Args (api_key:required,)
- Method (POST) /api/v1/campaign/{CAMPAIGN_ID}/schedule
- Params (CAMPAIGN_ID)
- Args (api_key:required, send_time:datetime(format(%Y-%m-%d %H:%M:%S)))
- Method (POST) /api/v1/campaign/{CAMPAIGN_ID}/cancel
- Params (CAMPAIGN_ID)
- Args (api_key:required)
- Method (POST)/api/v1/campaign/{CAMPAIGN_ID}/clone
- Params (CAMPAIGN_ID)
- Args (api_key:required, name:required(string), list_id:required(string))
- Method (GET) /api/v1/campaigns
- Templates API
- Method (GET) /api/v1/email-templates
- Args (api_key:required)
- Method (POST) /api/v1/email-templates
- Args (api_key:required,name:required(string), html:required(string)
- Method (PUT) /api/v1/email-template/{TEMPLATE_ID}
- Params (TEMPLATE_ID)
- Args (api_key:required,name:required(string), html:required(string)
- Method (DELETE) /api/v1/email-template/{TEMPLATE_ID}
- Params (TEMPLATE_ID)
- Args (api_key:required)
- Method (POST) /api/v1/email-template/{TEMPLATE_ID}/clone
- Params (TEMPLATE_ID)
- Args (api_key:required, name:required(string))
- Method (POST) /api/v1/email-template/{TEMPLATE_ID}/render
- Params (TEMPLATE_ID)
- Args (api_key:required, context:optional(json))
- Method (POST) /api/v1/email-template/{TEMPLATE_ID}/send
- Params (TEMPLATE_ID)
- Args (api_key:required, from_email:required(string),from_name:required(string), subject:required(string), context:optional(json) )
- Method (GET) /api/v1/email-templates
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Klaviyo;
class ApiController extends Controller
public $api;
public function __construct(Klaviyo $klaviyo) {
$this->api = $klaviyo;
}
// Each Api Call Can Be Configure As Such
protected function sampleApiCall()
{
// If We Dont Override Api Key It Will Fetch Our Api Key From Config
$this->api->setApiKey($key);
// This Will Populate Our Custom Props
$customProps = $this->api->setCustomProps($this->api->getSampleContext());
// This Will Populate Special Attribute Props
$props = $this->api->setProps($this->api->getSampleContext());
// This Will Override the Default Request Option which is query
// Use for POST, PUT since they have different request option key [form_params ,body]
$this->api->setRequestOption('form_params');
// This are all the List of RequestOptions
$allowed_keys = ['query', 'body', 'form_params', 'multipart', 'cookies', 'allow_redirects', 'stream' , 'verify',
'connect_timeout', 'debug', 'decode_content', 'headers', 'http_errors', 'json', 'handler', 'progress', 'sink' , 'save_to'];
// This Will Populate Filters
$filters = $this->api->setFilters($this->api->getSampleContext());
// This Code Will automatically Fetch All Data magically as long as you set
// Your Routes Properly and Set Proper Args For that Api Call
// If No Args Provided it will Use Only the Api Key Args
return $this->api->makeCall($this->api->getMethod(), $this->api->getEndPoint(), $this->api->buildArgs());
}
Note: Your Url Path must be the same format as The List End Point So We Dont Have to Set the Endpoint Manually ,if Not We Can Set it using this method
- $this->api->setEndpoint($url)
the url variable should omit the api/v1 or the version of api...
<?php
Route::group(['prefix' => 'lists'], function() {
Route::get('/', 'ListApiController@index')->name('list::index');
Route::get('/create', 'ListApiController@create')->name('list::create');
Route::post('/', 'ListApiController@store')->name('list::store');
Route::get('/{listID}', 'ListApiController@show')->name('list::show');
Route::get('/{listID}/edit', 'ListApiController@edit')->name('list::edit');
Route::put('/{listID}', 'ListApiController@update')->name('list::update');
Route::delete('/{listID}', 'ListApiController@destroy')->name('list::destroy');
Route::get('/{listID}/members', 'ListApiController@searchPeopleInList')->name('list::searchPeopleInList');
Route::post('/{listID}/members', 'ListApiController@addSomeoneInList')->name('list::addSomeoneInList');
Route::post('/{listID}/members/batch', 'ListApiController@batchAddPeopleToList')->name('list::batchAddPeopleToList');
Route::delete('/{listID}/members/batch', 'ListApiController@batchRemovePeopleFromList')->name('list::batchRemovePeopleFromList');
Route::post('/{listID}/members/exclude', 'ListApiController@unsubscribeSomeoneFromList')->name('list::unsubscribeSomeoneFromList');
Route::get('/{listID}/exclusions', 'ListApiController@getAllExclusionForSpecificList')->name('list::getAllExclusionForSpecificList');
});
- Note : That This 2 Api Only Returns 0 or 1 As Boolean Value for Success and Failure
// This Method Will Differ Depending if You Are Using Track / Track once / Identify
// Track and track once has same params except for the other method that adds extra properties to our trackOnce method
protected function setTrackFilters()
{
// We Need to Change Api Version Since it is Not Using api/v1 for end point
$this->api->setApiVersion('api');
// This Will Override Any Token In Your Config
$this->api->setToken('Stringtoken');
$this->api->setEvent($this->filter->byEvent());
$this->api->setCustomerProperties($this->filter->byCustomerProps());
$this->api->setProperties($this->filter->byProps());
$this->api->setTime($this->filter->ByTime());
}
// The No of Params Differs Between in Track and Identify
// This is the Args $args that is passed to encodedData
// We Have 5 Method For Fecthing Params that can be Used in building Track/Track Once/ Identify
protected function buildParams()
{
// Set the Token
$args = $this->api->getBaseParam();
// Set the Event
$args = $this->api->addEventParam($args);
// Set Properties
$args = $this->api->addPropertyParams($args);
// Set Customer Properties
$args = $this->api->addCustomerPropertyParams($args);
// Set Time
$args = $this->api->addTimeParams($args);
}
// This Method is In Charge in Encoding params Properly
$this->api->encodeData($args)
// We Send the Get Request Using this Method to the Proper API End point
$this->api->makeCall($this->api->getMethod(), $this->api->getEndPoint(), $this->api->encodeData($args))
// For Track Once We Need to Passed in Additional method inside encodeData
$this->api->encodeData($this->api->setTrackOnce($args))
- Method (GET) /#/
- Method (GET) /#/metrics
- Method (GET) /#/lists
- Method (GET) /#/campaigns
- Method (GET) /#/templates
- Method (GET) /#/person/:id
Extra Note:
Make Sure you Use the fix vue-datepicker check the pull request for the