shipping module

In this post we will tell you how to create a Shipping Module in Magento 2. If you have created shipping extension in Magento 1 then it would be easy for you to understand it in Magento 2. Let’s begin with an example,

To create a Shipping Module in Magento 2 you need to follow 5 simple steps and your shipping method will be ready.

Here “Cedcommerce” is our workspace and “Ship” is our extension name.

1. Create app/code/Cedcommerce/Ship/registration.php







2. Create app/code/Cedcommerce/Ship/etc/module.xml

<?xml version="1.0"?>

<config xmlns:xsi="" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">

        <module name="Cedcommerce_Ship" setup_version="1.0.0" schema_version="1.0.0"></module>


After that you to run following command to register your module:

For Linux users-

/opt/lampp/bin/php bin/magento setup:upgrade

For Windows Users-

php bin/magento setup:upgrade

3. Create app/code/Cedcommerce/Ship/etc/adminhtml/system.xml

We create system.xml to bring our shipping module settings in stores>configurations>sales>shipping methods section.

<?xml version="1.0"?>

<config xmlns:xsi="" xsi:noNamespaceSchemaLocation="../../../../Magento/Config/etc/system_file.xsd">

<section id="carriers" translate="label" type="text" sortOrder="320" showInDefault="1" showInWebsite="1" showInStore="1">

<group id="cedship" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="1">

<label>Ced Ship Shipping</label>

<field id="active" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="0">




<field id="name" translate="label" type="text" sortOrder="3" showInDefault="1" showInWebsite="1" showInStore="1">

<label>Method Name</label>


<field id="price" translate="label" type="text" sortOrder="5" showInDefault="1" showInWebsite="1" showInStore="0">


<validate>validate-number validate-zero-or-greater</validate>


<field id="sort_order" translate="label" type="text" sortOrder="100" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Sort Order</label>


<field id="title" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="1">



<field id="sallowspecific" translate="label" type="select" sortOrder="90" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Ship to Applicable Countries</label>

<frontend_class>shipping-applicable-country</frontend_class> <source_model>Magento\Shipping\Model\Config\Source\Allspecificcountries</source_model>


<field id="specificcountry" translate="label" type="multiselect" sortOrder="91" showInDefault="1" showInWebsite="1" showInStore="0">

<label>Ship to Specific Countries</label>




<field id="specificerrmsg" translate="label" type="textarea" sortOrder="80" showInDefault="1" showInWebsite="1" showInStore="1">

<label>Displayed Error Message</label>






After creating system.xml you can see this section by going to admin>stores>configurations>sales>shipping methods.


4. Create app/code/Cedcommerce/Shipping/etc/config.xml for adding the default values of fields and call the model for the respective shipping carrier.

<?xml version="1.0"?>

<config xmlns:xsi="" xsi:noNamespaceSchemaLocation="../../Store/etc/config.xsd">







<name>Cedcommerce Shipping</name>


<title>Cedcommerce Shipping</title>

<specificerrmsg>Ced Ship Shipping is not available for your area. Please contact us.</specificerrmsg>





5. After that create app/code/Cedcommerce/Shipping/Model/Carrier/Cedship.php


namespace Cedcommerce\Ship\Model\Carrier;

use Magento\Quote\Model\Quote\Address\RateRequest;

class Cedship extends \Magento\Shipping\Model\Carrier\AbstractCarrier implements




* @var string


protected $_code = 'cedship';

protected $_logger;


* @var bool


protected $_isFixed = true;


* @var \Magento\Shipping\Model\Rate\ResultFactory


protected $_rateResultFactory;


* @var \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory


protected $_rateMethodFactory;


* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig

* @param \Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory $rateErrorFactory

* @param \Psr\Log\LoggerInterface $logger

* @param \Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory

* @param \Magento\Quote\Model\Quote\Address\RateResult\MethodFactory $rateMethodFactory

* @param array $data


public function __construct(

\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,

\Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory $rateErrorFactory,

\Psr\Log\LoggerInterface $logger,

\Magento\Shipping\Model\Rate\ResultFactory $rateResultFactory,

\Magento\Quote\Model\Quote\Address\RateResult\MethodFactory $rateMethodFactory,

array $data = []

) {

$this->_rateResultFactory = $rateResultFactory;

$this->_rateMethodFactory = $rateMethodFactory;

$this->_logger = $logger;

parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data);



* @param RateRequest $request

* @return \Magento\Shipping\Model\Rate\Result|bool


public function collectRates(RateRequest $request)


if (!$this->getConfigFlag('active')) {

return false;


/** @var \Magento\Shipping\Model\Rate\Result $result */

$result = $this->_rateResultFactory->create();

$shippingPrice = $this->getConfigData('price');

$method = $this->_rateMethodFactory->create();








return $result;



* @return array


public function getAllowedMethods()


return [$this->_code=> $this->getConfigData('name')];



Your Shipping Method is ready now. You can place an order and check that your shipping rates are applicable or not.

When you will order any product you will see this shipping method on checkout page.


This is all about shipping module creation. If you have any suggestions or comments then please share with us.


Author of this post:


Started in 2010, the company has been involved in over 1000 ventures of customizing solutions to address all the unique needs. Fuelled by its rich experience, the company has developed highly popular JET SHOPIFY INTEGRATION APP being used by 500+ sellers across the United States of America. And recently, it became the Official Channel Integration Partner of Walmart, Sears, and Newegg. The company offers all the products that make selling easier on e-commerce.

  • John

    Thanks a lot for this awesome tutorial. Very helpful and explained very well. Keep up the good work .

  • Rachel Green

    I used this product just before and this is what I needed. Our team were searching something like which can run at each platform and definitely I can say that’s it.

  • Jenny Watson

    I have used your module and its working fine , thank you! that is a great help.

  • Chang

    this has helped me out – thank you.

  • S.Parker

    Good article, thanks for share with us,
    I follow your article and create a shipping method in magento 2 and it work properly.

  • Justin Anderson

    Nice tutorial. Easy to understand with brief explanation.