NAV Navbar
JavaScript SDK

Gofleetly API Reference

You can install our JavaScript SDK via npm:

$ npm install @gofleetly/api
/* ES6+ */
import Gofleetly from '@gofleetly/api';

/* CommonJS */
const Gofleetly = require('@gofleetly/api');

/* AMD */
require(['@gofleetly/api'], function(Gofleetly) {
  // ...
});

The Gofleetly API Reference describes the endpoints in our REST API.

We currently offer an SDK for JavaScript (Node.js). Although this SDK can be used from browser-facing code, we do not recommend this due to the potential to leak your API keys. Additional SDKs in other languages are available upon request.

Example code for any SDKs will be shown on the right pane. This center pane will document endpoints for language-independent use (e.g. cURL).

Postman Collection

You can also leverage our Postman collection for easily testing out API routes.

Run in Postman

Make sure to enter in your API key in the collection's authorization settings. Note that not all optional params are included in the colllection; see each endpoint doc for more details.

Authentication

Pass your API key to the Gofleetly constructor to create an API client

const gofleetly = new Gofleetly('YOUR_API_KEY_HERE');

Gofleetly uses API Keys to securely authenticate requests. If a Gofleetly API key is not included when making a request, or an invalid key is used, Gofleetly will return an error.

You will be provided with seperate keys for testing and running live deliveries.

API keys should be included in the following HTTP header, where {{apiKey}} is your API key:
Authorization: Bearer {{apiKey}}

Obtaining your API keys

API keys can be created by signing up for an account on the Gofleetly dashboard or by reaching out to your Gofleetly representative.

Test and live modes

When obtaining your API keys, you will be provided with a test key and a production key. All properties of deliveries made using your test key will mimic those of a live delivery, except for an actual courier fulfilling the delivery. Responses that are variable will be randomized within reasonable parameters and should not be considered representative of anticipated production values.

Gofleetly partners

Our API is consumable by Gofleetly partners and non-partners.

When signing up to our dashboard, you will start out as a non-partner. This means that you will need to pay for each Gofleetly delivery at the time of scheduling.

The only payment option currently available for non-partners is Stripe. In practice, this means you will need to include a tokenized credit card every time you hit our schedule endpoint. We'll charge this card if the delivery is successfully scheduled. Likewise, we'll refund this card if you cancel a refundable delivery. See your keys page for information on getting started with Stripe.

For Gofleetly partners, Stripe is not required. Partners enjoy more flexibility and better rates while using Gofleetly services.

Interested in becoming a Gofleetly partner? Contact us!

Requests

The base URL for requests is https://api.go-fleetly.com.
All requests must be made over HTTPS.

HTTP Methods

We leverage HTTP message formatting as the method of communication with our interface. The most-commonly-used HTTP verbs are POST, GET, PUT, and DELETE. In our interface, these correspond to create, read, update, and delete (or CRUD) operations, respectively.

Versioning

The current major version is 1.
To avoid breaking changes, pass an X-Gofleetly-Version header specifying your desired API version.

The API SDKs handle this for you.

Rate limiting

To protect our endpoints and keep high availability, we rate limit requests to the API. General routes are protected by a rate limit of 3 requests per second. If you have concerns about your application exceeding this limit, please contact us.

API consumers that pass the limit will be responded to with a 429 error (see the Error section).

All responses from the API include the following headers:

Request bodies

Request bodies can be sent as either application/x-www-form-urlencoded or application/json. The examples in these docs use the latter.

Make sure you set the Content-Type header appropriately. The API SDKs handle this for you.

Responses

All Gofleetly responses are in JSON.

Dates, times, and currency

Dates are formatted in ISO 8061 with a UTC offset that the standard denotes with 'Z'. Currency is interpreted as USD and represented as a whole number integer with the leftmost two digits being cents.

Units Format Example
Dates ISO 8601 10-10-10
Times ISO 8061 10-10-10T15:46:20Z
Currency USD Integer 1499 ($14.99)

Status codes

Gofleetly responds to requests with HTTP status codes allowing for easy programming between interfaces.

For successful requests, we send back a 200 (or a 201 if a resource was created).

See the Errors section for our error codes.

Quotes

Quote a delivery

const params = {
  "store": {
    "name": "string",
    "id": "string",
    "phone": "string",
    "address": {
      "addressLine1": "string",
      "addressLine2": "string",
      "city": "string",
      "state": "string",
      "zipcode": "string",
      "latitude": -180,
      "longitude": -180
    }
  },
  "dropoffAddress": {
    "addressLine1": "string",
    "addressLine2": "string",
    "city": "string",
    "state": "string",
    "zipcode": "string",
    "latitude": -180,
    "longitude": -180
  },
  "items": [
    {
      "id": "string",
      "sku": "string",
      "name": "string",
      "price": 0,
      "quantity": 1,
      "storeId": "string",
      "weight": 0,
      "height": 0,
      "width": 0,
      "length": 0,
      "size": "string",
      "color": "string",
      "imageURL": "http://example.com",
      "productURL": "http://example.com"
    }
  ],
  "pickupReadyByTime": "2019-02-10T02:17:48Z"
};

gofleetly.quoteDelivery(params)
  .then(quote => {
    console.log(quote.id);
  })
  .catch(err => {
    console.error(err);
  });

POST /quotes

Generates a quote for a delivery.

Parameters

Name In Type Required Description
store body Store true The physical store where the items will be picked up from.
dropoffAddress body Address true The customer's address for delivery.
items body [Item] true The items that will be delivered from the store to the dropoffAddress. At least one item is required.
pickupReadyByTime body string false Timestamp corresponding to when the items will be ready for pickup. The current time is used if omitted.

Responses

Status Meaning Description Schema
201 Created A new delivery quote. Quote
default Default See the errors documentation page. Error

Update items

const params = {
  "id": "string",
  "items": [
    {
      "id": "string",
      "sku": "string",
      "name": "string",
      "price": 0,
      "quantity": 1,
      "storeId": "string",
      "weight": 0,
      "height": 0,
      "width": 0,
      "length": 0,
      "size": "string",
      "color": "string",
      "imageURL": "http://example.com",
      "productURL": "http://example.com"
    }
  ]
};

gofleetly.updateItems(params)
  .then(quote => {
    console.log(quote.items);
  })
  .catch(err => {
    console.error(err);
  });

PUT /quotes/{id}/items

Updates the items associated with an existing delivery. This will overwrite the array.

Parameters

Name In Type Required Description
id path string true ID of an existing quote.
items body [Item] true The items that will overwrite those associated with this quote. At least one item is required.

Responses

Status Meaning Description Schema
200 OK The updated quote. Quote
default Default See the errors documentation page. Error

Refresh a quote

const params = {
  "id": "string"
};

gofleetly.refreshQuote(params)
  .then(quote => {
    console.log(quote.id);
  })
  .catch(err => {
    console.error(err);
  });

POST /quotes/{id}/refresh

Refreshes an expired quote.

Parameters

Name In Type Required Description
id path string true ID of an existing quote.

Responses

Status Meaning Description Schema
201 Created A new delivery quote based on the properties of the original one. Quote
default Default See the errors documentation page. Error

Deliveries

Get delivery details

const params = {
  "id": "string"
};

gofleetly.getDelivery(params)
  .then(delivery => {
    console.log(delivery.status);
  })
  .catch(err => {
    console.error(err);
  });

GET /deliveries/{id}

Gets the most up-to-date details about an existing delivery.

Parameters

Name In Type Required Description
id path string true ID of an existing delivery.

Responses

Status Meaning Description Schema
200 OK The delivery identified by the provided ID. Delivery
default Default See the errors documentation page. Error

Schedule a delivery

const params = {
  "quoteId": "string",
  "orderNumber": "string",
  "dropoffName": "string",
  "dropoffPhone": "string"
};

gofleetly.scheduleDelivery(params)
  .then(delivery => {
    console.log(delivery.status);
  })
  .catch(err => {
    console.error(err);
  });

POST /deliveries

Schedules a delivery.

Parameters

Name In Type Required Description
quoteId body string true ID of an existing quote.
orderNumber body string true A unique ID given to the customer identifying their order with your store.
dropoffName body string true The full name of the customer.
dropoffPhone body string true The customer's phone number in E.164 format (e.g. "+15051234567").
shouldSendSMS body boolean false Whether or not SMS updates should be sent to the provided dropoffPhone when this delivery's status changes. If omitted, we'll use your global setting for deliveries.
pickupInstructions body string false Optional pickup instructions. Up to 255 characters. If omitted, we instruct the courier to pick items up from the customer service desk.
dropoffInstructions body string false Optional dropoff instructions (e.g. "gate code is 123"). Up to 255 characters.
preferredETA body string false Timestamp corresponding to when the customer would prefer the delivery to be completed. Must be at least an hour after the pickupReadyByTime and at least an hour in the future. If omitted, the delivery will be completed ASAP after the items are ready for pickup.
stripeId body string If you are a Gofleetly partner, you do not need to provide this parameter since deliveries are collectively invoiced per your subscription plan and tier. If you are not a Gofleetly partner, you must provide this parameter. More info...

Responses

Status Meaning Description Schema
201 Created A new delivery based on the provided quote ID. Delivery
default Default See the errors documentation page. Error

Cancel a delivery

const params = {
  "id": "string"
};

gofleetly.cancelDelivery(params)
  .then(canceledDelivery => {
    console.log(canceledDelivery);
  })
  .catch(err => {
    console.error(err);
  });

DELETE /deliveries/{id}

Depending on needs, deliveries have the ability to be both canceled and refunded. To query whether or not a delivery is available for such options, use the GET Delivery Endpoint endpoint. You may then confirm the cancelation using the endpoint listed here.

Parameters

Name In Type Required Description
id path string true ID of an existing delivery.

Responses

Status Meaning Description Schema
200 OK The canceled delivery identified by the provided ID. Delivery
default Default See the errors documentation page. Error

Submit feedback

const params = {
  "id": "string",
  "score": 100
};

gofleetly.submitFeedback(params)
  .then(delivery => {
    console.log(delivery.feedbackScore);
  })
  .catch(err => {
    console.error(err);
  });

PUT /deliveries/{id}/feedback

Assigns a 0-100 feedback score for an existing delivery.

Parameters

Name In Type Required Description
id path string true ID of an existing delivery.
score body integer true Customer's 0 to 100 score for this delivery.

Responses

Status Meaning Description Schema
200 OK The delivery identified by the provided ID. Delivery
default Default See the errors documentation page. Error

Schemas

Quote

{
  "items": [
    {
      "id": "string",
      "sku": "string",
      "name": "string",
      "price": 0,
      "quantity": 1,
      "storeId": "string",
      "weight": 0,
      "height": 0,
      "width": 0,
      "length": 0,
      "size": "string",
      "color": "string",
      "imageURL": "http://example.com",
      "productURL": "http://example.com"
    }
  ],
  "pickupReadyByTime": "2019-02-10T02:17:48Z",
  "store": {
    "name": "string",
    "id": "string",
    "phone": "string",
    "address": {
      "addressLine1": "string",
      "addressLine2": "string",
      "city": "string",
      "state": "string",
      "zipcode": "string",
      "latitude": -180,
      "longitude": -180
    }
  },
  "dropoffAddress": {
    "addressLine1": "string",
    "addressLine2": "string",
    "city": "string",
    "state": "string",
    "zipcode": "string",
    "latitude": -180,
    "longitude": -180
  },
  "expiration": "2019-02-10T02:17:48Z",
  "earliestDropoffWindow": {
    "start": "2019-02-10T02:17:48Z",
    "end": "2019-02-10T02:17:48Z"
  },
  "createdAt": "2019-02-10T02:17:48Z",
  "updatedAt": "2019-02-10T02:17:48Z",
  "id": "string",
  "total": 0,
  "isLive": true
}

Properties

Name Type Required Description
items [Item] true The items that will be delivered from the store to the dropoffAddress.
pickupReadyByTime string true Timestamp corresponding to when the items will be ready for pickup.
store Store true The physical store where the items will be picked up from.
dropoffAddress Address true The customer's address for delivery.
expiration string true Timestamp corresponding to when this quote can no longer be scheduled.
earliestDropoffWindow DateRange true Earliest estimated dropoff ETA if this quote were to be scheduled.
createdAt string true Timestamp corresponding to when this quote was created.
updatedAt string true Timestamp corresponding to the last time this quote was updated.
id string true Unique identifier for this quote.
total number true Total billable cost for this delivery.
isLive boolean true Whether or not this quote was created in live mode.

Delivery

{
  "status": "created",
  "orderNumber": "string",
  "dropoffName": "string",
  "dropoffPhone": "string",
  "shouldSendSMS": true,
  "createdAt": "2019-02-10T02:17:48Z",
  "updatedAt": "2019-02-10T02:17:48Z",
  "id": "string",
  "feedbackScore": 0,
  "pickupInstructions": "string",
  "dropoffInstructions": "string",
  "preferredETA": "2019-02-10T02:17:48Z",
  "estimatedDropoffWindow": {
    "start": "2019-02-10T02:17:48Z",
    "end": "2019-02-10T02:17:48Z"
  },
  "isCancelable": true,
  "isRefundAvailable": false,
  "quote": {
    // ...
  }
}

Properties

Name Type Required Description
status string true See the status values below
orderNumber string true A unique ID given to the customer identifying their order with your store.
dropoffName string true The full name of the customer.
dropoffPhone string true The customer's phone number in E.164 format (e.g. "+15051234567").
shouldSendSMS boolean true Whether or not SMS updates are sent to the dropoffPhone whenever this delivery's status changes.
createdAt string true Timestamp corresponding to when this delivery was created.
updatedAt string true Timestamp corresponding to the last time this delivery was updated.
id string true Unique identifier for this delivery.
feedbackScore number false Optional 0-100 score for this delivery.
pickupInstructions string false Optional instructions given to the driver when at the store.
dropoffInstructions string false Optional instructions given to the driver when at the dropoff address.
preferredETA string false Timestamp corresponding to when the customer would prefer the delivery to be completed.
estimatedDropoffWindow DateRange true The current estimated delivery window.
isCancelable boolean true Whether or not this delivery can be canceled.
isRefundAvailable boolean true Whether or not charges would still apply if this delivery were to be canceled.
quote Quote true The quote this delivery was scheduled with.

Status Enum

Value Description
created Delivery has been created but has not been assigned a driver.
assigned A driver has been assigned but isn't en-route.
in_transit A driver is en-route.
delivered The items have been dropped off.
canceled The delivery has been canceled.

Item

{
  "id": "string",
  "sku": "string",
  "name": "string",
  "price": 0,
  "quantity": 1,
  "storeId": "string",
  "weight": 0,
  "height": 0,
  "width": 0,
  "length": 0,
  "size": "string",
  "color": "string",
  "imageURL": "http://example.com",
  "productURL": "http://example.com"
}

Properties

Name Type Required Description
id string true none
sku string true none
name string true none
price number true none
quantity number true none
storeId string false none
weight number false In pounds
height number false In inches
width number false In inches
length number false In inches
size string false none
color string false none
imageURL string false none
productURL string true none

Store

{
  "name": "string",
  "id": "string",
  "phone": "string",
  "address": {
    "addressLine1": "string",
    "addressLine2": "string",
    "city": "string",
    "state": "string",
    "zipcode": "string",
    "latitude": -180,
    "longitude": -180
  },
  "organizationName": "string"
}

Properties

Name Type Required Description
name string true Name of the store (e.g. "CoolCity at The Domain")
id string true Unique identifier for this store.
phone string true The store's phone number.
address Address true The store's physical address.
organizationName string false Organization name (e.g. "CoolCity")

Address

{
  "addressLine1": "string",
  "addressLine2": "string",
  "city": "string",
  "state": "string",
  "zipcode": "string",
  "latitude": -180,
  "longitude": -180
}

Properties

Name Type Required Description
addressLine1 string true none
addressLine2 string false none
city string true none
state string true One of 50 state abbreviations or DC
zipcode string true Maximum 12 digits.
latitude number false none
longitude number false none

DateRange

{
  "start": "2019-02-10T02:17:48Z",
  "end": "2019-02-10T02:17:48Z"
}

Properties

Name Type Required Description
start string true Timestamp corresponding to the beginning of this span of time.
end string true Timestamp corresponding to the end of this span of time.

Error

{
  "status": 0,
  "kind": "string",
  "message": "string",
  "ref": "string",
  "params": {}
}

Properties

Name Type Required Description
status integer true HTTP status code.
kind string true See the error codes below.
message string true Developer-targeted error message.
ref string true Unique identifier for this error.
params object false If parameter validation failed, the faulty parameters are included in a hashmap along with the failure reason.

Error codes

Status Code Kind Description
400 invalid_params Used when a request is caught with invalid parameters given by the client.
400 outside_covered_areas Used when a quote cannot be provided because either the depot address or the dropoff address is outside the deliverable range.
400 quote_expired Used when a quote cannot be scheduled because its expiration date has passed.
400 non_cancelable_delivery Used when a delivery can no longer be canceled. Typically this happens when the courier has already picked up the item(s).
401 model_exists Used when trying to create a model that already exists in requests for creation.
401 unauthorized Used when the request requires client authentication.
403 forbidden Used when the request is attempting to access a resource that is not permitted for reasons other than authentication.
404 model_not_found Used when an identifier given by a client was used but did not turn up any models when querying a collection
404 resource_not_found Used when a resource is requested by a client that was not found in the server.
429 rate_limit_reached Used to indicate a client that is requesting a resource too often.
500 internal_server_error General error used by servers when something unanticipated goes wrong. Typically accompanied by a reference error for auditing.
500 couriers_busy Used when a quote cannot be provided because the courier is busy.

Changelog

This format is based on Keep a Changelog, and adheres to Semantic Versioning.

[1.1.0] - 2019-05-29

[1.0.0] - 2019-02-08

Gofleetly Elements

Gofleetly Elements are general use UI components specifically designed to enable a seamless same-day delivery experience on any eCommerce platform. Thorough user testing and refinement has culminated in UI elements that allow instant integration into Gofleetly services.

Gofleetly elements are opinionated, but flexible and allow for customization for advanced users. We've elimintated the need for our customers to design and build out the elements required to provide their customers with a same-day delivery experience that works for them.

Gofleetly Elements requires an API key. Please see the Authentication section.

Setup

Include the Gofleetly Elements script on every page where you want to use elements.

<script src="https://go-fleetly.com/elements.js"></script>

Step 1: Obtain your delivery quote

The simplest way for you to securely collect quote information is adding our same-day delivery button. This button combines HTML, Javascript, and CSS to automatically collect item information. When your customer adds an item to their bag this item automatically starts a gofleetly quote that can later be turned into a delivery.

<style>
.gofleetly-button {
  width: "100px";
  color: "coral-blue";
}
</style>

<button
  id="gofleetly-cart-button"
  class="gofleetly-button"
  data-key="apk_testing_TjfdKJ3jfkdSJ3kj2ljx"
  data-label="Add Same Day Delivery"
  data-callback="onUserAddsToSameDayDelivery"
  data-store-name="CoolCity North Austin"
  data-store-id="509"
  data-store-phone="+15551234567"
  data-store-address-addressLine1="44 Riverrock Ave"
  data-store-address-city="Austin"
  data-store-address-state="TX"
  data-store-address-zipcode="78758"
  data-store-address-latitude="-180.0"
  data-store-address-longitude="-180.0"
  data-dropoffAddress-addressLine1="1501 Esperanza Xing"
  data-dropoffAddress-city="Austin"
  data-dropoffAddress-state="TX"
  data-dropoffAddress-zipcode="78758"
  data-item-id="149042"
  data-item-sku="149042-bfc"
  data-item-name="VANS Classic Grey M 12"
  data-item-price="5999"
  data-item-storeId="509"
  data-item-quantity="1"
>
</button>
<!-- ...later in your HTML -->
<script>
  /**
   * Call back function that occurs when a user adds an item
   * to the bag for same-day delivery.
   * @param {Quote} quote
   * @param {Item} item
   * @param {Error} err
   */ 
  window.onUserAddsToSameDayDelivery = function (quote, item, err) {
    if (err) {
      // do not add to bag
      // display appropriate UI to customer
    } else {
      // use quote information as you see fit.
      window.product.addToBag(); // EXAMPLE
      alert('Added product to bag with a delivery fee of: ' + quote.fee);

      // IMPORTANT: Save the quote id returned from Gofleetly for future use.
      // to understand why, see Step 2 below.
      window.client.saveQuoteIdForCustomer(window.customer, quote.id); // EXAMPLE
    }
  }
</script>

Step 2: Cart review and editing

This step loads in flexible form box ("inlay") that will contain all the items in your customer's order. This step is optional, but allows for easy cart management through Gofleetly.

<div
  class="gofleetly-inlay"
  data-key="apk_testing_TjfdKJ3jfkdSJ3kj2ljx"
  data-quote-id="YOUR_QUOTE_ID_FROM_ABOVE"
  data-optional-item-quantity-edit-callback="onGofleetlyItemEdit"
  data-optional-item-removal-callback="onGofleetlyItemRemove"
  data-optional-customer-phone-number="+13213453007"
  data-optional-customer-preferred-eta="2019-02-10T02:17:48Z"
>
</div>
<!-- ...later in your HTML -->
<script>
  /**
   * Callback function that invoked when a customer requests a quantity change on an item associated with their Gofleetly quote.
   * 
   * @param {Quote} quote
   * @param {Item} item This will contain the user's requested quantity.
   * @return {Boolean}
   * Return true to reflect the `item`'s new quantity in the Gofleetly quote.
   * Return false to negate the user's change and preserve the original quantity.
   */  
  window.onGofleetlyItemQuantityEdit = function (quote, item) {
    if (window.cart.hasAvailable(item.id, item.quantity)) {
      window.cart.editQuantity(item.id, item.quantity);
      return true;
    } else {
      // provide error UI
      alert('Unable to update quantity due to stock-out.');                          
      return false;
    }
  }

  /** 
   * Callback function that returns an item that was removed.
   * Will be called after the user clicks on remove item, which will also
   * remove the item from the Gofleetly inlay.
   * 
   * Put typical logic for removing items within native cart. 
   * 
   * @param {Quote} quote
   * @param {Item} item
   * @return {Boolean} whether or not to accept users removal request
   */
  window.onGofleetlyItemRemove = function (quote, item) {
    window.cart.removeItem(item.id);
    return true;
  }
</script>

Step 3: Schedule the same-day delivery with Gofleetly

<button
  id="gofleetly-schedule-button" 
  class="gofleetly-schedule"
  data-key="apk_testing_TjfdKJ3jfkdSJ3kj2ljx"
  data-callback="scheduleDeliveryCallback"
  data-quoteId="quote-39753783"
  data-order-number="coolcity-873t362"
  data-dropoffName="John Freddy"
  data-dropoffPhone="+183293888"
>
</button>
<!-- ...later in your HTML -->
<script>
  /** 
   * Callback function that fires when a delivery is scheduled.
   * 
   * @param {Delivery} delivery
   */
  window.scheduleDeliveryCallback = function(delivery) {
    console.log(delivery.status);
  }
  // Schedule the delivery
  document.querySelector('#gofleetly-schedule-button').click();
</script>

Attributes

Our elements library is enabled by the different attributes you provide to us. Our Gofleetly services will use those attributes to enable same-day delivery capabilities on your website. If misconfigured it is possible that deliveries parameters can be incorrect, or incorrect rendering of Gofleetly elements on your page.

Below are examples of attribute types along with use case explanations.

Element Identifiers

Example: id="gofleetly-cart-button" Usage: Identify the element you'd like to inject onto the page. Also dictates how Gofleetly reads in adjacent parameters.

Styling Classes

Example: class="gofleetly-button" Usage: Add your own customized styles to elements imported into the page.

API Keys

Example: data-key="apk_testing_TjfdKJ3jfkdSJ3kj2ljx" Usage: Used to authorize valid requests. Safe to publish client side, this key validates your eCommerce site's requests.

Data Properties

Example: data-item-name="Google Home Mini" Usage: Used to provide data in Gofleetly service requests. Represents a property of the data represented in the element. Will typically be prefixed with the models name and postfixed with the specific field. Data can be any type (i.e. Number, String, etc.).

Element Parameters

Example: data-label="Add Same Day Delivery" Usage: Customizable inputs to Gofleetly element components. Such as inner text to buttons.

Event Callback Functions

Example: data-callback="onUserAddsToSameDayDelivery" Usage: Defined somewhere else in your HTML code, this will be the identifier used to invoke a custom logic within a callback function when a Gofleetly request is made.

UI Frameworks

Components for popular UI frameworks (e.g. React, Vue) will be available at a later date.

Gofleetly Complete

Gofleetly Complete is our consulting service. We'll work with you to determine your store's specific same-day delivery needs and then we'll build a custom integration tailored to your site.

The end deliverable is a script that enables same-day delivery for your customers when placed on your HTML template.

<html>
  <!-- ✂⸻ -->
  <body>
    <!-- ✂⸻ -->
    <script src="https://go-fleetly.com/your-script.js"></script>
  </body>
</html>