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

Document Signer Sdk Laravel Package

la-souris/document-signer-sdk

Laravel/PHP SDK for document signing workflows—create, send, and track signature requests directly from your app. Wraps the Document Signer API with a clean client, typed DTOs, and framework-ready configuration for quick integration into Laravel projects.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • The package is a library, not an application: it exposes a SignatureProvider interface (send(), downloadSignedDocument(), downloadAudit(), webhook handling) and lets the consuming Laravel app own orchestration, persistence, and routing. That is the right shape for a Laravel codebase — business logic stays in the app, vendor coupling stays in one adapter class.
  • The contract-authoring model is a compile step: HTML with {[type:signer:name]} placeholders → PlaceholderParser → anchor-based replacement → BrowsershotPdfRenderer → PDF → provider. This is a clean, testable pipeline, but it means document templating is code/config owned by us, not a hosted template editor. Product and legal stakeholders will need to accept that trade-off.
  • The Document::$id normalization rule (downloadSignedDocument() always takes the caller's own id, providers map internally) is the single most valuable design decision in the release. It is what makes swapping or running two providers side by side realistic, and it is the constraint we must not allow adapters to violate.

Integration feasibility

  • Straightforward in principle: composer install, pick or write a SignatureProvider, render and send. There is no stated Laravel service provider, config publishing, facade, or migration/table set — the release notes are silent on framework glue, so assume we wire it manually until proven otherwise.
  • The hard dependency is not the package, it is Browsershot: headless Chromium plus Node/Puppeteer on every environment that renders PDFs. That is a real infrastructure commitment (container image size, cold start, CI parity, local dev setup), not a composer line item.
  • Webhooks are handled but not hosted: we supply the route, the signature verification, the idempotency, and the state machine. The abstraction does not remove that work.

Technical risk

  • v1.0.0 with no prior assessment history and no adoption evidence. Treat as "evaluate under a spike," not "commit a roadmap to it."
  • Abstraction-leak risk is highest at the two edges the interface cannot flatten: webhook payload shapes (each vendor posts a different body and verification scheme) and downloadAudit() semantics (DocuSign's Certificate of Completion and ValidSign's Evidence Summary are not equivalent legal artifacts across jurisdictions). We will end up with provider-specific code in the app regardless; budget for it.
  • PDF rendering fidelity is a known operational tax: fonts, page breaks, header/footer placement, and Chromium version drift all produce "the contract looked different" bugs. The page decoration support suggests the author hit this already, which is a good sign but not a solved problem.
  • SignedDocumentUnavailableException being explicitly retryable is good design, but the package ships no retry/backoff, queue, or polling helper. The retry loop is ours to build and get right.
  • No mention of idempotency keys, webhook replay protection, or rate-limit handling beyond the named exceptions. Those are exactly where production incidents land.

Key questions

  1. Which Laravel and PHP minor versions are supported, and is there a service provider, config file, and facade, or is this pure-PHP wiring?
  2. Which SignatureProvider implementations actually ship in v1.0.0, and what is the support commitment for each as vendor APIs change?
  3. Is webhook signature verification implemented per provider, or is that left entirely to the consumer?
  4. What is the license, maintainer count, and release cadence? Who do we call at 2am?
  5. Does the Browsershot pipeline support queued/async rendering, and what is the memory/CPU profile of a typical contract at our page counts?
  6. Where does the rendered PDF and the signed PDF live — is storage/persistence deliberately out of scope?
  7. How does downloadAudit() behave for providers whose evidence report is not a PDF or is not available until retention expiry?

Integration Approach

Stack fit

  • Fits a Laravel monolith or modular app that already sends contracts for signature and wants to stop hard-coding one vendor. It also fits as an internal shared package across multiple products, which is the stronger case for adopting an abstraction at all.
  • Weak fit if we only ever intend to use one vendor — the abstraction adds a translation layer and a Browsershot dependency for no portability benefit. Be honest about which situation we are in.

Migration path

  • Greenfield: no incumbent to displace, so the migration path is a spike, not a cutover. Recommended sequence: (1) stand up Browsershot in a container identical to production, (2) render one real contract template end to end, (3) send through one provider in sandbox, (4) receive a real webhook, (5) download signed doc and audit, (6) only then evaluate a second provider adapter to prove the abstraction holds.
  • Brownfield (existing direct vendor integration): do not rip out. Introduce the package behind a new code path for one low-risk contract type, run both paths in parallel, and retire the old integration only after webhook and audit parity is demonstrated on live envelopes.

Compatibility

  • PHP 8.2+ is a hard floor; confirm our oldest production app meets it before scoping.
  • Browsershot brings Node + Chromium into the deploy image. Verify it works in our CI, our container base image, and on developer laptops — this is the most common source of "works on my machine" tickets with this class of package.
  • If our documents need legally specific audit artifacts per region, confirm the target provider's certificate satisfies compliance before designing around downloadAudit().

Sequencing

  1. Evaluate the abstraction against two providers, not one — a one-provider test tells us nothing about portability.
  2. Ship the webhook endpoint and idempotent state machine as app code, treating the package as a payload translator only.
  3. Wrap send() and the download calls in queued jobs with explicit retry policy keyed on SignedDocumentUnavailableException, ProviderRateLimitException, and ProviderTransientException.
  4. Defer template authoring tooling; start with version-controlled HTML templates so legal review happens through code review.

Operational Impact

Maintenance

  • Two maintenance surfaces, not one: the package itself, and the provider adapters. Vendor e-signature APIs change (auth flows, envelope states, OAuth scopes, webhook schemas), and each change lands in our adapter or in a package upgrade we must schedule.
  • Chromium and Browsershot versions must be pinned and periodically bumped. Unpinned browser versions silently alter PDF output; pin them and add a visual regression test on a reference contract.
  • Placeholder templates are effectively legal copy. They need versioning, review, and a test that catches a missing required field before an envelope is sent to a counterparty.

Support

  • Support load concentrates on three questions: "the signed document isn't available yet" (retry semantics), "the webhook never arrived" (our infrastructure, not the vendor), and "the PDF looks wrong" (Chromium/layout). Document runbooks for all three before launch.
  • ProviderAuthenticationException in production usually means a rotated or expired credential. Alerting on that exception class specifically is cheap and high value.

Scaling

  • PDF rendering is the bottleneck: headless Chromium is CPU- and memory-hungry and does not belong on web request workers. Route rendering through dedicated queue workers with concurrency limits and its own autoscaling policy.
  • Signature volume is usually low relative to web traffic, so scale risk is more about burst (month-end, campaign sends) than steady state. Queue depth and render latency are the metrics to watch.
  • Webhook ingestion should be cheap and asynchronous: verify, persist raw payload, enqueue, respond 2xx. Do not do provider API calls inline in the webhook handler.

Failure modes

  • Signed document not yet available on a finalized envelope — expected, not an error; requires bounded retry with backoff and a dead-letter path. Unbounded retry here is the classic bug.
  • Webhook delivery failure or duplication — assume at-least-once delivery; idempotency keyed on provider envelope id is mandatory.
  • Rate limiting and transient provider outages — named exceptions exist, but the retry policy is our responsibility and should differ per exception class (backoff for rate limit, faster retry for transient, no retry for validation).
  • Chromium crash or timeout mid-render — leaves a half-sent envelope if send() is not transactionally ordered after successful render. Render first, verify the PDF, then send.
  • Provider credential expiry or revocation — envelopes silently stop progressing; alert on auth exceptions and on envelopes with no state change beyond an expected window.
  • Audit certificate unavailable or non-PDF for a provider — completion reporting breaks at the exact moment it matters most (disputes).

Ramp-up

  • A mid-level Laravel engineer can integrate one provider in roughly a sprint, provided Browsershot is already solved in the environment. Budget a second sprint for the webhook state machine, retry policy, and tests — that is where the real work sits and it is not in the package.
  • Add half a sprint of discovery for teams new to e-signature: envelope lifecycle, signer ordering, reminder/expiry semantics, and what "completed" legally means differ from ordinary CRUD work.
  • Recommend a written ADR covering: chosen provider, the id mapping rule from Document::$id to provider ids, retry policy per exception, and where rendered and signed PDFs are stored. That document is the difference between a clean abstraction and a leaky one six months out.
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.
abbasudo/artisan-route
mirvan/ippanel
ignibyte/aic-framework
glavweb/data-schema-bundle
glavweb/datagrid-bundle
tacticmedia/scim-server
uni-method/frame
neika-ai/sdk
adachsoft/php-code-style
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package