Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Neto Laravel Package

venturedrake/laravel-neto

Laravel Neto is a Laravel package for integrating with the Neto (Maropost Commerce Cloud) e-commerce API. It provides a convenient client to retrieve and manage products, orders, customers, and inventory from your Laravel application, with configurable credentials and a simple, expressive interface.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • Thin, SDK-style HTTP client packaged the conventional Laravel way: published config, container-bound client, resource classes (Orders, Items, Customers), and typed exceptions. This is the pattern most Laravel teams already expect, so cognitive load is low.
  • Stateless request/response design means it composes cleanly with queue workers, Horizon, and scheduled jobs — no long-lived connection or session state to manage.
  • request() / get() as a generic escape hatch is the single most important architectural decision here: it means gaps in resource coverage do not force a fork or a parallel bespoke client. Preserve that boundary when wrapping the package internally.
  • No mention of response DTOs, collections, or pagination primitives — callers likely receive raw arrays. That shifts validation and shape-assumption risk onto our application code.

Integration feasibility

  • The version matrix is the gating factor: PHP 8.3–8.5 and Laravel 12–13 only. Any service still on Laravel 10/11 (the bulk of most estates today) cannot adopt this without an upgrade first. Treat this as a platform prerequisite, not a package decision.
  • Feature surface covers the high-value commerce flows — order lifecycle including cancel, status, and tracking, plus items and customers with findByEmail. That is a credible v0.1 for order-sync and customer-lookup use cases.
  • Configuration, auth, timeout, retry, and logging are all declared as first-class concerns, which suggests the author has operated this integration rather than merely wrapped endpoints.

Technical risk

  • Pre-release stability: v0.1.0 carries no semantic-versioning guarantee. Breaking changes to method signatures, config keys, or exception hierarchy are expected and permitted. Pin exactly and expect churn.
  • Retry semantics on non-idempotent calls: automatic retry on transient failures is correct for get/find, but create, update, and cancel are not inherently idempotent. Without a documented idempotency story, a timeout-then-retry can produce duplicate orders or double-applied status changes. This is the highest-severity risk in the release notes.
  • PII exposure in logs: masking the API key is good hygiene, but the more serious concern is request/response bodies containing customer names, emails, addresses, and order contents. Logging must be off by default in production or scoped to metadata only.
  • Single-maintainer, single-package dependency on a business-critical revenue path (orders). Bus-factor and abandonment risk are real at 0.x.
  • Vendor/platform drift: Maropost Commerce Cloud (formerly Neto) has rebranded and continues to evolve its API. A one-person package may lag breaking platform changes with no SLA.
  • Unstated test coverage: no mention of a test suite, CI matrix, static analysis, or security policy. Absence of evidence is not evidence of absence, but it should be verified before adoption.

Key questions

  1. Is the retry policy applied uniformly, and is there any idempotency key or duplicate-suppression mechanism for create / cancel?
  2. What exactly is written to logs when request logging is enabled, and is it opt-in and off by default?
  3. Is there a test suite, CI matrix across PHP 8.3–8.5 × Laravel 12–13, and static analysis? What is the coverage of error-path mapping?
  4. How are Maropost rate limits (HTTP 429) and pagination surfaced — handled internally, or pushed to the caller?
  5. Are responses returned as typed objects/collections or raw arrays? Is there any documented response schema?
  6. What is the author's stated support window and deprecation policy for 0.x, and is there a path to 1.0?
  7. Does the exception hierarchy preserve the underlying HTTP status and Maropost error code for triage, or does it collapse them?
  8. Are there testing affordances (Http::fake compatibility, a fake client, contract tests) so we can test our integration without hitting the live API?

Integration Approach

Stack fit

  • Strong fit for a greenfield Laravel 12+ service or one already scheduled to upgrade. Poor fit for a mature Laravel 10/11 estate without an upgrade budget.
  • Best suited to asynchronous order-sync workers and back-office tooling, not customer-facing synchronous checkout paths where a third-party HTTP call in the request cycle adds latency and a new failure domain.
  • Fits an anti-corruption-layer pattern well: the generic request() escape hatch means we can route all Maropost traffic through this client rather than maintaining a bespoke one.

Migration path

  • Adopt behind an internal interface (e.g. OrderGateway) with the package as one adapter implementation. This contains 0.x churn to a single file and preserves the option to swap or vendor the client.
  • Strangler pattern per resource: migrate one flow at a time (customers lookup → items read → order reads → order writes), running new and legacy paths in parallel with output comparison before cutover.
  • If currently on a hand-rolled cURL/Guzzle integration, the typed exceptions and retry handling are an immediate maintainability win; if on a mature third-party OMS connector, the value proposition is weaker.

Compatibility

  • Confirm the runtime matrix against every service in scope, including transitive constraints from other Laravel packages that may not yet support Laravel 13.
  • Verify PHP 8.5 support is real (not merely declared) — 8.5 is new enough that CI coverage claims should be checked, not assumed.
  • Check config publishing and env-var naming against existing secret-management conventions; API keys should come from a secrets store, not .env committed to a repo.

Sequencing

  1. Spike (1–2 days): install in a sandbox, exercise read-only endpoints against a Maropost sandbox, and read the source for retry, logging, and exception behavior. This directly answers questions 1–3 and 7.
  2. Wrap: define the internal gateway interface; write the adapter; add contract tests using the client's fake/Http::fake support.
  3. Read-only production: customers findByEmail and order get/find in a non-critical reporting or support tool.
  4. Guarded writes: order create/update/cancel behind a feature flag, with application-level duplicate suppression and alerting on retries.
  5. Expand: items and remaining flows; revisit generic request() usage and upstream any recurring patterns as resource methods.
  6. Reassess at 1.0 or at the first breaking 0.x release, whichever comes first.

Operational Impact

Maintenance

  • Pin to an exact version (0.1.0) and upgrade deliberately. Budget recurring effort for 0.x breaking changes — assume at least one disruptive minor release per quarter while pre-1.0.
  • Keep the package behind the internal adapter so upgrades are a one-file change. Track upstream releases via watch/notification rather than manual checks.
  • No migrations, no schema, no persistent state — operational maintenance is dependency hygiene only, which is a meaningful advantage over heavier integration packages.

Support

  • No commercial support or SLA. Escalation path is GitHub issues plus the Maropost API documentation; internal triage capability is required.
  • Establish an internal owner for the adapter layer and a documented runbook for auth failures and schema drift. Do not let this become unowned glue code.
  • Have a documented fallback: the generic request() method, or direct HTTP as last resort, if the package stalls on a platform change.

Scaling

  • Each resource call is an independent HTTP round trip. Bulk order or catalogue sync will be latency-bound and prone to N+1 patterns — design callers to batch at the business level and avoid per-line-item fetches.
  • No batching or bulk endpoint helpers are advertised. Confirm whether Maropost's bulk get semantics (filter/limit) are reachable through request(); if so, prefer a few large filtered reads over many point reads.
  • Concurrency must respect Maropost rate limits. Use dedicated queue workers with capped concurrency and backoff, isolated from latency-sensitive queues so a Maropost slowdown cannot starve unrelated jobs.
  • Retries amplify load during a Maropost incident. Cap total attempts, add jitter, and consider a circuit breaker at the adapter layer.

Failure modes

  • Duplicate order creation from retried non-idempotent create — highest severity; mitigate with application-level idempotency keys and reconciliation queries.
  • Retry storms during vendor degradation, compounding an outage.
  • Auth failure (401) on key rotation or config drift; ensure ConfigurationException and RequestException are distinguishable in alerting.
  • Silent schema drift when Maropost adds or renames fields; raw-array responses fail late and quietly. Add assertions on required fields at the adapter boundary.
  • PII leakage via request logging enabled in production.
  • Upstream abandonment — mitigated by the adapter boundary and the generic request() fallback.
  • Breaking 0.x upgrade landing during a release freeze; controlled by exact version pinning.

Ramp-up

  • Low for any Laravel developer: idiomatic config, DI, and exceptions; the resource API is self-describing. Expect roughly half a day to first successful call and 2–3 days to production-grade usage including the adapter, tests, and idempotency guards.
  • The real ramp-up cost is domain knowledge, not code: understanding Maropost order lifecycle semantics (cancel, status, tracking transitions) and the platform's filtering/pagination model. Assign that to whoever owns the commerce domain, not whoever owns the integration.
  • Document the retry and idempotency behavior in the adapter's README — it is the least obvious and most consequential part of the package's semantics.
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings
coleus/apps
seampact/laravel
emmyconceptng/laravel-ng-postcode
jjsquady/round-robin
skyraptor/chatter
edlugz/sasapay
abbasudo/artisan-route