Git Product home page Git Product logo

karrioapi / karrio Goto Github PK

View Code? Open in Web Editor NEW
392.0 12.0 73.0 78.73 MB

Programmable Shipping API (self-hosted)

Home Page: https://karrio.io

License: Apache License 2.0

Python 96.43% Shell 0.02% Dockerfile 0.01% JavaScript 0.38% HTML 0.01% TypeScript 2.35% CSS 0.01% SCSS 0.08% MDX 0.71%
python shipping-api dhl fedex canada-post ups multiple-carriers shipping-software purolator carriers

karrio's Introduction

Karrio

Karrio

License puprlship-tests karrio-build Codacy Badge Discord Docker pulls

Karrio is a developer-first shipping integration and logistics automation platform that helps developers build shipping experiences into their platforms.

Get up and running in 1 minute with:

git clone --depth 1 https://github.com/karrioapi/karrio
cd karrio/docker
docker compose up

Default Login: [email protected] | demo

Features

  • Headless Shipping: Access a network of traditional and modern shipping carriers API-first.
  • Extensible: Build anything with webhooks, APIs and metadata.
  • Multi-carrier SDK: Use the karrio SDK to integrate with custom carrier APIs.
  • Fulfilment: Connect carrier accounts, get live rates and purchase shipping labels.
  • Tracking: Create package trackers, get real-time tracking status and deliver a great shopping experience.
  • Address Validation: Validate shipping addresses using integrated 3rd party APIs.
  • Cloud: Optimized for deployments using Docker.
  • Dashboard: Use the karrio dashboard to orchestrate your logistics operations.

Karrio Dashboard

Get started

Quick start demo

A short video (less than 4 minutes) that goes over creating your first label and tracking your first package.

Open-source hobby deploy (Advanced)

You can deploy a hobby instance in one line on Linux with Docker (recommended 4GB memory):

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/karrioapi/karrio/HEAD/bin/deploy-hobby)"

The problem: Shipping integration is still painful

  • Lack of documentation.
  • Multiple and inconsistent APIs.
  • Difficult access to account and API credentials for development.
  • Poor developer experience.

Our philosophy

We help you integrate with your shipping carriers and improve your fulfilment processes without loosing control.

We believe that the logistics industry can greatly benefit from a unified, open and standardized shipping API that gives you direct access to a network of carriers, control over customers' personal data and compliance.

What are the benefits?

Karrio is the only platform-focused open-source shipping platform with label generation, document generation and package tracking API that you can host on your own infrastructure.

We are an open-source alternative to expensive in-house carrier integration and multi-carrier Saas APIs. We're designed to be more developer-friendly, with the fullset of shipping functionalities without vendor-lockin.

Shipping for platforms

With Karrio, you can extend your platform with native shipping capabilities. Improve merchants and customers experience on your Marketplace, eCommerce, ERP, WMS, OMS, 3PL and Logistics platform. With Karrio, 3PLs and large volume shippers regain control over their shipping tech stack and processes.

Shipping for enterprise

Karrio makes modern shipping accessible to brands, retailers as well as businesses in regulated industries. Ideal for pharmacy shipping where compliance is a must.

Support

If you have general questions about Karrio, want to say hello or just follow along, we'd like to invite you to join our Discord Community.

If you run into any problems or issues, please create a Github issue and we'll try our best to help.

We strive to provide good support through our issue trackers on Github.

Contributing

See our Docs for instructions on development setup.

We <3 contributions big or small, check out our guide on how to get started.

Not sure where to start? Send us an email to chat with a member of our team.

Contributors

License

This project uses the Apache v2 license

Sponsors

We are building an open and global shipping platform that makes shipping integration and logistics automation fun and accessible using open source software. Thanks for sponsoring and backing us.

Apps & Brains

Past sponsors

Cheques Plus Truck Hardware Shiptome Platana.fr

Become a sponsor

New Sponsor

karrio's People

Contributors

danh91 avatar danieloaks avatar darkswoop avatar delalisk avatar dependabot[bot] avatar gitter-badger avatar iyzairi avatar jacobshilitz avatar nahall avatar rcknr avatar turbobot-temp avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

karrio's Issues

[carrier-integration] Sendle - Get Rates and Buy Label

Is your feature request related to a problem? Please describe.

It is currently possible to track shipment serviced by Sendle. I did like to be able to the purplship SDK
fetch live rates for shipments within Australia and buy labels.

Integrate autocomplete + address validation powered by OpenCage

Is your feature request related to a problem? Please describe.
As a privacy-first business, the Google Geocoding API may cause privacy concerns to my customers.

Describe the solution you'd like
I propose the integration possibility to use alternative solutions that are more privacy-friendly

Describe alternatives you've considered
OpenCage is mature and very accurate to handle address validations. Could be an ideal alternative to the Google Geocoding API usage

Additional context

OpenCage website https://opencagedata.com/
Pricing compared to Google Geocoding https://opencagedata.com/reducing-your-google-geocoding-costs

Bug where package.weight.map(MeasurementOptions).KG would round down to 0 when making a conversion to kg failing canadapost rate request

Describe the bug
Bug where package.weight.map(MeasurementOptions).KG would round down to 0 when making a conversion to kg failing Canada post rate request

To Reproduce
Steps to reproduce the behavior:

Make a Canada post rate request with a smaller weight than 0.1 kg.

fix

Change providers.canadapost.units:

MeasurementOptions = MeasurementOptionsType(quant=0.01, min_kg=0.01)

I have a fix on a branch but I'm not allowed to make de pull request.

[carrier-integration] Deutsche Post International

Is your feature request related to a problem? Please describe.

It is currently possible to track shipments serviced by Deutsche Post using the DHL Universal integration. I did like to be able to the purplship SDK fetch live rates for shipments within Germany and internationally and buy labels.

[bug] Order created in test mode prevent order_id reuse in live mode

Describe the bug
Creating order in test mode prevents the use of the same order_id in live

To Reproduce
Steps to reproduce the behavior:

  1. Create an order setting test_mode to True
  2. Try to create the same order with test_mode to False
  3. You get an error saying that an order from the same source and order_id already exists

Expected behavior
I would expect the validation to apply on a specific mode only.
Meaning one should be allowed to create an order in test_mode and reuse the same order_number in live mode.

Standardize Hold at location option for supported carriers

Is your feature request related to a problem? Please describe.
Though Karrio offers the possibility to forward any options offered by shipping carrier APIs,
some common options are nice to interact with when they are added to the standardized common Karrio shipping options.
Currently, "hold at location" is not standardized

Describe the solution you'd like
Add support for "hold at location" to the unified Karrio shipping option.

Update Tracking event response to have a separate object for location.

Currently, the tracking event contains a single key for the location information on each event.

{
      ... tracking details
      "events": [
        {
          "date": "string",
          "description": "string",
          "location": "string",
          "code": "string",
          "time": "string"
        }
      ],
      ... deliver details
    }
  ]
}

This will need to be a separate object to have more information about the location of the event.

{
      ... tracking details
      "events": [
        {
          "date": "string",
          "description": "string",
          "location": {
                "city": "string",
                "state": "string",
                "zipcode": "string",
                "country": "string",
                "geocoding": {
                      "latitude": "string",
                      "longitude": "string",
                }
           },
          "code": "string",
          "time": "string"
        }
      ],
      ... deliver details
    }
  ]
}

The geocoding object can be done through either open-source integrations with geonames.org or through proprietary integrations like Google Geocoding or Maxmind databases. Based on how it is hosted.

Purolator tracking scan times are incorrectly parsed

The times reported in a TrackingEvent from Purolator seem to be incorrectly parsed as seconds instead of the HHMMSS format Purolator weirdly uses.

This is the debug output to console for the tracking number I am testing with (note the <ScanTime>100625</ScanTime>):

       <Scan i:type="DeliveryScan">
            <ScanType>Delivery</ScanType>
            <PIN>
                <Value>607460066279</Value>
            </PIN>
            <Depot>
                <Name>130 IBER RD, STITTSVILLE, ON, K2S1E9</Name>
            </Depot>
            <ScanDate>2021-01-25</ScanDate>
            <ScanTime>100625</ScanTime>
            <Description>Shipment delivered</Description>
            <Comment/>
            <SummaryScanIndicator>false</SummaryScanIndicator>
            <ScanDetails>
                <DeliverySignature>LYY</DeliverySignature>
                <SignatureImage/>
                <SignatureImageSize>0</SignatureImageSize>
                <SignatureImageFormat>GIF</SignatureImageFormat>
                <DeliveryAddress>STITTSVILLE, ON</DeliveryAddress>
                <DeliveryCompanyName/>
                <PremiumServiceText>Not known or specified</PremiumServiceText>
                <ProductTypeText>Regular</ProductTypeText>
                <SpecialHandlingText/>
                <PaymentTypeText>Sender</PaymentTypeText>
            </ScanDetails>
        </Scan>

And here is the TrackingEvent object that is returned (note the time='03:57':

TrackingEvent(date='2021-01-25', description='Shipment delivered', location='130 IBER RD, STITTSVILLE, ON, K2S1E9', code='Delivery', time='03:57')

And here is what the Purolator website shows:
image

I poked around in the code, and it seems like it may be treating 100625 as seconds instead of HHMMSS?

Shipping document upload API (Electronic Trade document)

Hello,
I apologize if this is answered elsewhere, I did made a search but I may have overlooked it. I am new to purplship and also still trying to understand the concepts behind shipping API's.

Is your feature request related to a problem? Please describe.
I wonder if the upload of trade documents is supported by the purplship package. I could find no reference in the documentation.

Describe the solution you'd like
I am looking for a implementation of what it is described here:
https://developertest.fedex.com/api/en-nl/catalog/upload-documents/v1/docs.html

Thank you for all the efforts put in this package!!! I do know how much time it takes...

Widely used carriers list to prioritize carrier integration

  • AmazonMws
  • APC
  • Aramex (still to check if this supports tracking for global tracking numbers or just a certain region)
  • Asendia
  • Asendia USA
  • Australia Post (tracking implemented)
  • AxlehireV3
  • Better Trucks
  • Bond
  • Bluedart
  • Cainiao
  • Canada Post
  • Canpar
  • CDL Last Mile Solutions
  • Chronopost
  • CloudSort
  • Courier Express
  • CouriersPlease
  • Dai Post
  • Deutsche Post
  • Deutsche Post UK
  • DHL eCommerce Asia
  • DHL eCommerce Solutions
  • DHL Express
  • DHL Poland (pickup not implemented)
  • DHL Universal (tracking implemented)
  • Dicom (tracking implemented)
  • DPD
  • DPD UK
  • Delhivery
  • ePost Global
  • EMS Post China
  • Estafeta
  • Fastway
  • FedEx
  • FedEx Cross Border
  • FedEx Mailview
  • FedEx Sameday City
  • FedEx SmartPost
  • FirstMile
  • Globegistics
  • GSO
  • Hermes
  • ICS Courier (pickup not implemented)
  • Interlink Express
  • JP Post
  • Kuroneko Yamato
  • La Poste
  • LaserShip
  • Loomis Express
  • LSO
  • Newgistics
  • OnTrac
  • Osm Worldwide
  • Parcelforce
  • Passport
  • PCF Final Mile
  • PostNL
  • Purolator
  • Royal Mail (tracking implemented)
  • SEKO OmniParcel
  • Sendle
  • SF Express
  • Spee-Dee
  • StarTrack
  • TForce
  • TNT
  • UDS
  • UPS
  • UPS Ground
  • UPS i-Parcel
  • UPS Mail Innovations
  • USPS
  • USPS International
  • Veho
  • XpressBees
  • Yanwen

Inconsistent requirements/validations between the API serializers and model serializers

Describe the bug
Some requirements such as Charfield max size or formating are not validated upfront on the API.
The consequence is that one might pass the validation to create a shipment with let's say an organization name of more than 50 characters get rates and only fail to persist the data due to a failed model validation.
This can put the server in an invalid state

Expected behaviour
Get API serializer requirement validations that reflect the related model's requirements.

Purplship Carrier Integration Preparation Guidelines

Introduction

Purplship is a multi-carrier API integration SDK that brings carrier API under a unified interface.
To achieve that goal, Purplship relies on a set of components assembled to simplify the integration process.

Steps

  • Retrieve Shipping Carrier API Docs
  • Collect API Endpoints Data Schemas
  • Generate a Python Data Types Library
  • Setup a Purplship Extension (Plugin) package

1. Retrieve Carriers API References

Find any docs provided by the shipping carrier that outlines the APIs specifications.

Note that some carrier may require that you subscribe to a dev platform

2. Collect API Endpoints Data Schemas

The goal of this step is to come up with a set of schemas that describes what the carrier expects in terms of input and output.

The shipping carriers APIs come in these variant formats:

XML based API

SOAP with .wsdl schemas

When you are dealing with WSDL files, extract the all <xs:schema>...<xs:schema> blocks located under the <wsdl:types>...</wsdl:types> block into .xsd files.

Note that you will need to copy the namespaces definitions from <wsdl:definitions ...> header to <xs:schema ...>

We will also help you validate your schemas when you submit a PR below

Example:

campar-wsdl sample

  • The red line outline the namespaces that need to be copied over
  • The blue lines outline the schemas that need to be copied into their dedicated files

The resulting .xsd schema file looks like this:

Screen Shot 2021-02-06 at 5 24 14 PM

SOAP with .xsd schemas

If the carrier provides .xsd files, you have literally nothing to do. That's good news, download them and move to the next step.

XML samples without schemas

Collect all XML samples for each request and response you want to integrate and use a platform like the freeformatter xsd-generator to generate .xsd schema files from the various samples.

Generating schemas from XML sample

Screen Shot 2021-02-06 at 5 28 24 PM

JSON based API

REST with .json samples

REST with .json OpenAPI schemas

JSON samples without schemas

3. Generate a Python Data Types Library

Once you have the set of APIs schemas you want to support, it's time to transform them into Python classes.

  • For JSON based API, quicktype is a simple tool that will transform your .json schema files into Python classes

Generating Python code with quicktype.io

Screen Shot 2021-02-06 at 5 06 14 PM

  • For XML based API, generateDS is a simple tool that will transform your .xsd schema files input Python classes

Generating Python code with generateDs

Then

4. Setup a Purplship Extension (Plugin) package

After those things are ready, the integration process is fairly straight forward expressing service request
in Python code.

Configurable currency preference support

Is your feature request related to a problem? Please describe.
International carriers return monetary values in the currency of the shipment origin or default to USD and that can lead to inconsistencies

Describe the solution you'd like
It would be great to have a way of configuring preferred currency per system or per organization. So that returned monetary values are consistent for a user.

[feature] User preference

Is your feature request related to a problem? Please describe.
There are no ways to personalize Karrio with preferences such as default dimension units and such.

Describe the solution you'd like
Allow the user to configure preferences and improve their experience,

Bill Third-Party for FedEx and UPS

Is your feature request related to a problem? Please describe.
Right now, there is no option to bill third-party accounts for UPS or FedEx. (Note: When billing third-party accounts, the rates of shipping cannot be pulled from carrier API so if this is implemented, the buying of shipping labels might have to be rethought.)

Describe the solution you'd like
Add feature to allow third-party billing.

Additional context
Third-party billing implementation on a similar app.
image

Could not import 'karrio.server.core.authentication.TokenBasicAuthentication'

Describe the bug
I followed the installation steps from here: https://docs.karrio.io/installation, but the server throws the following exception ImportError: Could not import 'karrio.server.core.authentication.TokenBasicAuthentication' for API setting 'DEFAULT_AUTHENTICATION_CLASSES'. ModuleNotFoundError: No module named 'yaml'.

To Reproduce
Steps to reproduce the behavior:

  1. Create .env file with these values
DEBUG_MODE=True
ALLOWED_HOSTS=*
DATABASE_HOST=db
DATABASE_PORT=5432
DATABASE_NAME=db
DATABASE_USERNAME=postgres
DATABASE_PASSWORD=postgres
DETACHED_WORKER=False
  1. Create docker-compose.yml file
version: '3'

services:
  karrio:
    container_name: karrio
    image: karrio/server:2022.6
    restart: unless-stopped
    ports:
      - "5002:5002"
    env_file: .env
    depends_on:
      - db
    networks:
      - db_network
      - web_network
    volumes:
      - karriostatics:/karrio/static

  dashboard:
    container_name: dashboard
    image: karrio/dashboard:2022.6
    ports:
      - "3000:3000"
    environment:
      - 'NEXT_PUBLIC_KARRIO_API_URL=http://host.docker.internal:5002'
      - 'NEXTAUTH_URL=http://host.docker.internal:3000'
      - JWT_SECRET="n*s-ex6@ex_r1i%bk=3jd)p+lsick5bi*90!mbk7rc3iy_op1r"
    networks:
      - web_network

  db:
    container_name: db
    image: postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: "db"
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
      PGDATA: /var/lib/postgresql/data/sandbox
    networks:
      - db_network

volumes:
  karriostatics:
  karrio-db:

networks:
  db_network:
  web_network:
  1. Run docker-compose up

Entire log

karrio     | Traceback (most recent call last):
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/rest_framework/settings.py", line 177, in import_from_string
karrio     |     return import_string(val)
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/django/utils/module_loading.py", line 17, in import_string
karrio     |     module = import_module(module_path)
karrio     |   File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
karrio     |     return _bootstrap._gcd_import(name[level:], package, level)
karrio     |   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
karrio     |   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
karrio     |   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
karrio     |   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
karrio     |   File "<frozen importlib._bootstrap_external>", line 843, in exec_module
karrio     |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/karrio/server/core/authentication.py", line 1, in <module>
karrio     |     import yaml
karrio     | ModuleNotFoundError: No module named 'yaml'
karrio     |
karrio     | During handling of the above exception, another exception occurred:
karrio     |
karrio     | Traceback (most recent call last):
karrio     |   File "/karrio/venv/bin/karrio", line 8, in <module>
karrio     |     sys.exit(main())
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/karrio/server/__main__.py", line 17, in main
karrio     |     execute_from_command_line(sys.argv)
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
karrio     |     utility.execute()
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
karrio     |     django.setup()
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/django/__init__.py", line 24, in setup
karrio     |     apps.populate(settings.INSTALLED_APPS)
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/django/apps/registry.py", line 114, in populate
karrio     |     app_config.import_models()
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/django/apps/config.py", line 301, in import_models
karrio     |     self.models_module = import_module(models_module_name)
karrio     |   File "/usr/local/lib/python3.8/importlib/__init__.py", line 127, in import_module
karrio     |     return _bootstrap._gcd_import(name[level:], package, level)
karrio     |   File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
karrio     |   File "<frozen importlib._bootstrap>", line 991, in _find_and_load
karrio     |   File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
karrio     |   File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
karrio     |   File "<frozen importlib._bootstrap_external>", line 843, in exec_module
karrio     |   File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/karrio/server/graph/models.py", line 5, in <module>
karrio     |     from karrio.server.manager.models import Customs, Parcel, Address
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/karrio/server/manager/models.py", line 8, in <module>
karrio     |     from karrio.server.core.utils import identity
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/karrio/server/core/utils.py", line 14, in <module>
karrio     |     from karrio.server.core import datatypes, serializers
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/karrio/server/core/serializers.py", line 2, in <module>
karrio     |     from drf_yasg import openapi
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/drf_yasg/openapi.py", line 11, in <module>
karrio     |     from .utils import dict_has_ordered_keys, filter_none, force_real_str
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/drf_yasg/utils.py", line 17, in <module>
karrio     |     from rest_framework.views import APIView
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/rest_framework/views.py", line 17, in <module>
karrio     |     from rest_framework.schemas import DefaultSchema
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/rest_framework/schemas/__init__.py", line 33, in <module>
karrio     |     authentication_classes=api_settings.DEFAULT_AUTHENTICATION_CLASSES,
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/rest_framework/settings.py", line 225, in __getattr__
karrio     |     val = perform_import(val, attr)
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/rest_framework/settings.py", line 168, in perform_import
karrio     |     return [import_from_string(item, setting_name) for item in val]
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/rest_framework/settings.py", line 168, in <listcomp>
karrio     |     return [import_from_string(item, setting_name) for item in val]
karrio     |   File "/karrio/venv/lib/python3.8/site-packages/rest_framework/settings.py", line 180, in import_from_string
karrio     |     raise ImportError(msg)
karrio     | ImportError: Could not import 'karrio.server.core.authentication.TokenBasicAuthentication' for API setting 'DEFAULT_AUTHENTICATION_CLASSES'. ModuleNotFoundError: No module named 'yaml'.
karrio exited with code 1

[carrier-integration] Amazon MWS beta carrier integration

Is your feature request related to a problem? Please describe.
karrio currently doesn't support AmazonMws services

Describe the solution you'd like
Integrate karrio with the AmazonMws API

Additional context
AmazonMws API documentation links:

Unified tracking status

Is your feature request related to a problem? Please describe.
purplship currently returns a list for tracking events from carriers with different event codes and different meanings.

Describe the solution you'd like
Define a unified tracking status across carriers that will sum up the meaning of the latest tracking event code.

Describe alternatives you've considered
Currently need to check the meaning of the tracking event code per carrier to determine when there is an issue.

Additional context
e.g. of status

  • delivered
  • in-transit
  • blocked
  • out-for-delivery
  • ...

One-Call Buy shipment label request

Is your feature request related to a problem? Please describe.
Sometimes, I know exactly the carrier service I am interested in and since we know the costs in advance,
we want to be able to buy labels with a single API request

Describe the solution you'd like
It would be nice and simple to make a call to POST /v1/shipments with a carrier service_code to buy a label
in a single request.

Describe alternatives you've considered
Currently, I need to make a request to create an empty shipment then send a second call to buy it.

[feature] Shipping Manifest

Is your feature request related to a problem? Please describe.
I believe the ability to generate shipping manifests for large volume processing is very important

Describe the solution you'd like
Add support for shipping manifest generation for supported carriers and a multi-carrier option from Karrio would be very valuable.

[insiders] Add GraphQL mutations for organization user management and user invitation

Is your feature request related to a problem? Please describe.
There are know convenient ways of adding or inviting a user to join an organization

Describe the solution you'd like
A set of GraphQL queries and mutations to retrieve users and invitations from an organization, send and cancel invitations.
This will allow the integration of user management from the dashboard.

Describe alternatives you've considered
Currently, the only way to add users to an organization is by adding them manually from the admin console.

CSV orders imports

Is your feature request related to a problem? Please describe.

Integrate a way to import multiple orders at once into purplship-server for fulfillment.
This will allow batch processing (meaning a large volume of shipment processed at once)

Describe the solution you'd like

I did like to be able to export orders from my platform (ERP, marketplace, eCommerce...) in a CSV file and import them in purplship for fulfilment.

[abstraction] Introduce an "options" field for package level insurance

Is your feature request related to a problem? Please describe.
I am currently unable to specify an insurance coverage value for a single specific package when I use Multi-piece shipment.
The current insurance value is applied at the shipment level instead of package. That works for single package shipments only.

Describe the solution you'd like
In fact, it seems that insurance should be completely moved from the shipment to the package instead.

Multi-piece shipment support for carriers that don't support it by default

Is your feature request related to a problem? Please describe.
Currently, some carriers such as FedEx support multi-piece shipment whereas others (Canada post...) do not.

Describe the solution you'd like
Integrate Multi-piece support for all carriers and define a unified abstraction for future carrier integrations

Describe alternatives you've considered
Currently, I can get rates and buy labels for multi-piece shipments carriers that have built-in support and manually create multiple single parcel shipments for the rest.

Webhook signature / authentication

Is your feature request related to a problem? Please describe.
Currently, the webhook sends a request that can be impersonated without any distinctive authentication or signature.
That is not a good practice.

Describe the solution you'd like
We should have a header that ensures the authenticity of the event origin similar to Stripe secret header

Describe alternatives you've considered
It is currently possible to use a query string to do something like that is not the most secure.

Additional context
https://stripe.com/docs/webhooks/signatures

[devX] Switch from flag to API Key for karrio test mode

Is your feature request related to a problem? Please describe.
It is confusing as a dev getting started with the karrio API to understand how to send API requests in test mode and play with carrier sandbox/test servers.

Describe the solution you'd like
Instead of using test flags in requests query strings to make calls in test mode, use test API keys like Stripe.
It is more explicit and more familiar.

[carrier-integration] UPS Ground services

Is your feature request related to a problem? Please describe.
Missing UPS ground services for shipment

Describe the solution you'd like
Add a purplship-sdk extension for UPS Ground or augment the current purplship.ups integration to support UPS Ground services

[security] Add support for 2FA

Is your feature request related to a problem? Please describe.
Two factor authentication is best practice and a must these days.

Describe the solution you'd like
Add 2FA support for the current user login

API healthcheck endpoint

Is your feature request related to a problem? Please describe.

There is currently no endpoint available to collect the health status of the Purplship API.
That can be a limitation for deployment on certain cloud platforms that require a health check endpoint to ensure the successful deployment of a purplship server instance.

Describe the solution you'd like

An API endpoint displaying the server status:

  • Database connection
  • Static files availability
  • Response to a ping...
  • Any other relevant details

Describe alternatives you've considered

As a workaround, /login/ page could be used for health check until then

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.