# NimbusPost Shipping for GoCommerce — Open-Source Module

> Book shipments across NimbusPost’s couriers from a GoCommerce order: login, warehouse, courier choice, COD, labels, and what the module leaves out.

- Canonical: https://kitcommerce.store/integrations/fulfill-nimbuspost/
- Last updated: 2026-09-25

---

Shipping

## NimbusPost shipping for GoCommerce

A Go package that books a parcel through NimbusPost, which hands it to a courier — Delhivery, XpressBees, Blue Dart and the rest — and returns that courier’s waybill and a label. An account login and a registered warehouse are what it needs.

- **Shipping** module
- **9** settings
- **9** tests
- **ext/fulfill-nimbuspost**

### What it does

Registering the module adds “nimbuspost” as a fulfillment provider. An operator ships the usual way — the admin’s ship dialog, or POST /api/admin/create-fulfillment with "provider": "nimbuspost" — and the module books the parcel, returning the waybill as the tracking number along with NimbusPost’s label URL. The engine stores the shipment and moves the order on; the module only talks to NimbusPost.

NimbusPost is an aggregator, not a carrier, and the package doc is careful about what follows. The shipment comes back naming whichever courier took it, so the carrier on the GoCommerce shipment is read from the response rather than assumed, and the tracking number belongs to that courier, not to NimbusPost.

In the admin it describes itself as “NimbusPost’s courier aggregation, India: one login books across the couriers it holds.”

### Configuration

Three settings are required: the account’s email and password, and the warehouse name. Set them in Config from your own main(), or leave Config empty and fill them in under Settings › Shipping providers.

*NimbusPost module settings — 9 settings, 3 required*

| Setting | Environment variable | Required | What it does |
| --- | --- | --- | --- |
| `Email` Account email | `NIMBUSPOST_EMAIL` | Yes | The NimbusPost login. The API has no long-lived key, only a login that mints a token. |
| `Password` Account password | `NIMBUSPOST_PASSWORD` | Yes | Exchanged for a token, which the module reuses for a day. |
| `WarehouseName` Warehouse name | — | Yes | The pickup warehouse registered with NimbusPost, matched exactly. The package’s example uses “Primary”. |
| `PickupName, PickupAddress, PickupCity, PickupState, PickupPincode, PickupPhone` Pickup: name, address, city, state, pincode, phone | — | No | The pickup address sent with each shipment. NimbusPost finds the warehouse by name; these are what gets printed, and left empty they lean on what the dashboard holds. |
| `AutoPickup` Raise the pickup request while booking | — | No | Has NimbusPost raise the pickup with the courier as part of booking. Off by default — in the code’s words, scheduling a van is a decision about somebody’s afternoon. |
| `DefaultWeightGrams` Default weight (grams) | — | No | Per unit, for a parcel the engine could not weigh. 500 g when unset. |
| `DefaultLengthCM, DefaultBreadthCM, DefaultHeightCM` | — | No | The box used for any parcel of more than one unit, where the engine has no single size. 15 × 15 × 10 cm when unset. Go only. |
| `BaseURL` API base URL | — | No | Overrides https://api.nimbuspost.com/v1, for tests. Empty for production. |
| `Client` | — | No | Replaces the HTTP client, which otherwise times out after 30 seconds. Go only; not in the panel. |

The module reads its Config struct, not the environment. The variable names are the ones the package’s own example or the reference binary uses; in your own `main()` you choose where each value comes from. Where a setting has a panel label, the admin’s settings drawer can hold it too, and a value typed there wins over Config.

### Setting it up

1. **Register the warehouse** — In NimbusPost, register the pickup warehouse and note its name exactly, along with the account login the module will use.
2. **Install the module** — Import it and pass nimbuspost.New to gocommerce.New, as below — or run the reference binary with -carriers, which installs every carrier module idle.
3. **Configure it** — Email, password and warehouse name, in Config or under Settings › Shipping providers. Decide whether booking should also raise the pickup.
4. **Ship an order** — Choose NimbusPost in the admin’s ship dialog, or POST /api/admin/create-fulfillment with "provider": "nimbuspost". The courier’s waybill becomes the tracking number.

main.go

```
import (
	"os"

	"github.com/itswadesh/gocommerce/core"
	nimbuspost "github.com/itswadesh/gocommerce/ext/fulfill-nimbuspost"
)

app, err := gocommerce.New(cfg,
	nimbuspost.New(nimbuspost.Config{
		Email:         os.Getenv("NIMBUSPOST_EMAIL"),
		Password:      os.Getenv("NIMBUSPOST_PASSWORD"),
		WarehouseName: "Primary",
	}),
)
```

The package doc’s own example, with its imports; cfg is your gocommerce.Config. With an empty nimbuspost.Config the module installs idle and waits for the panel. Import path `github.com/itswadesh/gocommerce/ext/fulfill-nimbuspost`.

### How it works

- **One booking call**

  The parcel goes to NimbusPost’s shipments endpoint with the consignee, the pickup, this parcel’s items, weight and size. The answer carries the waybill, the courier’s name and a label URL.

- **status: false is a refusal**

  NimbusPost can answer HTTP 200 with "status": false. Every response is checked for the flag before anything is believed, so a refusal never reads as a shipped order.

- **The courier, not the aggregator**

  The courier’s name is mapped to one of the engine’s carrier codes — Delhivery, XpressBees, Blue Dart, Ecom Express, DTDC, Shadowfax, Ekart, Amazon Shipping, India Post, DHL, FedEx — so the number gets the right tracking link.

- **COD or prepaid, from the order**

  An unpaid order is booked cod and a paid one prepaid, with the order amount set to the value of what is in this parcel.

- **Measured weight first**

  Weight in grams, sides in centimetres. The engine’s summed weight is used only when every line was weighed; otherwise the default per unit. A courier_id in the request’s meta asks for that courier.

- **A token a day, an id per parcel**

  The login’s token is reused for 24 hours and cleared on a 401. NimbusPost rejects a duplicate order number, so later parcels on one order go as number-2, number-3.

### What it does not do

Read these before an order depends on it. No store is known to run GoCommerce in production yet, so these come from the code, not from anyone’s experience.

- **A booking without a waybill** — If NimbusPost creates the shipment but assigns no waybill, the call fails with the code’s own instruction: cancel it in NimbusPost before retrying.
- **No tracking updates** — Nothing comes back after booking: no webhook, no polling. Marking an order delivered is a separate step, in the admin or through the API.
- **No rates, no cancellation** — The module quotes no rates, and deleting a fulfillment in GoCommerce does not cancel the shipment in NimbusPost.
- **Courier choice needs the API** — The admin’s ship dialog sends no meta, so asking for a particular courier_id is an API call.
- **A password, not a key** — NimbusPost’s API has no long-lived key, so the module has to hold the account’s email and password to log in with.
- **Two-decimal money** — Prices and the order amount are minor units divided by 100 — right for rupees, wrong for a currency with none or three decimals.

FAQ

### Questions about the NimbusPost module

**Which courier carries the parcel?**

Whichever NimbusPost assigns, unless a courier_id in the request’s meta asks for one. The module reads the courier’s name from the response and records it as the carrier, so the tracking number is that courier’s.

**Does it book the pickup too?**

Only if you ask. AutoPickup, off by default, has NimbusPost raise the pickup request with the courier as part of booking.

**Does it return a label?**

When NimbusPost sends one. The label URL in the booking response is stored on the shipment, next to the waybill.

**Does the order update when the parcel is delivered?**

No. The module books and returns; it has no webhook and polls nothing. Mark the order delivered from the admin or with POST /api/admin/orders/{id}/deliver.

**Is NimbusPost a partner?**

No. The module calls NimbusPost’s API with a login you supply. NimbusPost does not endorse GoCommerce, and no store is known to run this module in production yet.

### Source

Everything on this page is read from [`ext/fulfill-nimbuspost`](https://github.com/itswadesh/gocommerce/tree/main/ext/fulfill-nimbuspost) in the GoCommerce repository, MIT licensed. When this page and the code disagree, the code is right and this page is out of date.NimbusPost is a trademark of its owner; this module talks to its public API and implies no endorsement. See [trademarks](https://kitcommerce.store/about/#trademarks).

- [ext/fulfill-nimbuspost on GitHub](https://github.com/itswadesh/gocommerce/tree/main/ext/fulfill-nimbuspost)
- [NimbusPost](https://nimbuspost.com)
- [All GoCommerce modules](https://kitcommerce.store/integrations/)

### Try it against a store of your own

The one-command stack gives you GoCommerce’s API and admin on your own machine in minutes. Add this module to it and try it on test orders before a real one depends on it.

[Deploy in minutes](https://kitcommerce.store/#one-command) · [Read the module](https://github.com/itswadesh/gocommerce/tree/main/ext/fulfill-nimbuspost) · [All integrations](https://kitcommerce.store/integrations/)
