{"id":998,"date":"2026-09-22T09:07:20","date_gmt":"2026-09-22T09:07:20","guid":{"rendered":"https:\/\/smppcenter.com\/kb\/?p=998"},"modified":"2026-09-22T09:07:22","modified_gmt":"2026-09-22T09:07:22","slug":"global-error-codes-setup-smpp-software","status":"publish","type":"post","link":"https:\/\/smppcenter.com\/kb\/global-error-codes-setup-smpp-software\/","title":{"rendered":"How to Set Up Global Error Codes So Your Clients Get Consistent Delivery Statuses"},"content":{"rendered":"\n\n<p class=\"wp-block-paragraph\">Every vendor you connect to returns its own error codes. If those raw codes reached your clients, each client would have to handle a different set of codes for every route you use, and switching a vendor would break their integration. <strong>Global Error Codes<\/strong> fix this. You define one catalog of codes, map each vendor&#8217;s codes to it, and your clients only ever see your catalog in their delivery reports.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Where to find it<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Sidebar \u2192 Settings \u2192 Error Codes \u2192 Global<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What each field controls<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Field<\/th><th>What it does<\/th><th>How aggregators use it<\/th><\/tr><\/thead><tbody><tr><td><strong>Product<\/strong><\/td><td>SMS, WhatsApp, etc.<\/td><td>Keep separate catalogs per channel<\/td><\/tr><tr><td><strong>Identifier<\/strong><\/td><td>Unique name for the code<\/td><td>Use readable names like <code>ABSENT_SUBSCRIBER<\/code><\/td><\/tr><tr><td><strong>Source<\/strong><\/td><td><code>OPERATOR<\/code> or <code>INTERNAL<\/code><\/td><td><code>INTERNAL<\/code> fails the message on your platform without sending it to any vendor<\/td><\/tr><tr><td><strong>Status<\/strong><\/td><td><code>SUBMITTED<\/code>, <code>DELIVERED<\/code>, <code>FAILED<\/code>, <code>NOTSENT<\/code><\/td><td>The final status your client sees<\/td><\/tr><tr><td><strong>Cause<\/strong><\/td><td>Description text<\/td><td>Shown to clients, so write it for them<\/td><\/tr><tr><td><strong>Charge to User<\/strong><\/td><td>Yes\/No<\/td><td>Whether your client pays for this outcome<\/td><\/tr><tr><td><strong>Charge by Operator<\/strong><\/td><td>Yes\/No<\/td><td>Whether your vendor bills you for it<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Steps<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open <strong>Manage Global Error Codes<\/strong> and click <strong>+ (Add)<\/strong>.<\/li>\n\n\n\n<li>Select the <strong>Product<\/strong>.<\/li>\n\n\n\n<li>Enter an <strong>Identifier<\/strong> and a client-friendly <strong>Cause<\/strong>.<\/li>\n\n\n\n<li>Set <strong>Source<\/strong>. If you pick <strong>INTERNAL<\/strong>, set <strong>Status<\/strong> to <strong>NOTSENT<\/strong>.<\/li>\n\n\n\n<li>Set <strong>Charge to User<\/strong> and <strong>Charge by Operator<\/strong>.<\/li>\n\n\n\n<li>Click <strong>Save Changes<\/strong>.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">To add a similar code quickly, use the <strong>Clone<\/strong> action on an existing row. You can also export the whole catalog from the list screen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Using the two charge flags for margin control<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The two charge flags are commercial decisions, and they don&#8217;t have to match:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Operator charges you, you charge the client<\/strong> (e.g. absent subscriber on a route that bills on submit): your margin is protected.<\/li>\n\n\n\n<li><strong>Operator charges you, you don&#8217;t charge the client:<\/strong> you absorb the cost. Use this for failures caused by your own routing.<\/li>\n\n\n\n<li><strong>Operator doesn&#8217;t charge you, you charge the client:<\/strong> check your client contracts before you set this up.<\/li>\n\n\n\n<li><strong>INTERNAL rejections<\/strong> (blocked number, invalid series, missing template): usually Charge to User = No and Charge by Operator = No, because nothing left your platform.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Reconciliation reports only line up with vendor invoices if the <strong>Charge by Operator<\/strong> flag matches how each vendor actually bills.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Freeze code numbers once clients integrate.<\/strong> Clients write their retry and alert logic against your codes. Add new codes instead of renumbering old ones.<\/li>\n\n\n\n<li>Keep separate codes for failures that need different client action. &#8220;Invalid number&#8221; (don&#8217;t retry) and &#8220;network timeout&#8221; (retry) should never share a code.<\/li>\n\n\n\n<li>Clients can pull your catalog through the API. See <a href=\"https:\/\/smppcenter.com\/kb\/provide-standard-delivery-error-codes\/\">Do you provide standard delivery error codes?<\/a><\/li>\n\n\n\n<li>Any vendor code without a mapping reaches clients as the default code or <code>UNDEFINED<\/code>. Map every new vendor before sending live traffic.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Related articles<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/smppcenter.com\/kb\/map-vendor-error-codes-global-error-codes\/\">How to Map Vendor Error Codes to Global Error Codes<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/smppcenter.com\/kb\/failed-messages-get-retried-smpp-client\/\">Do the Failed Messages Get Retried in SMPP Client?<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/smppcenter.com\/kb\/how-read-smpp-delivery-receipt\/\">How to Read SMPP Delivery Receipt<\/a><\/li>\n<\/ul>\n\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Build one stable error-code catalog for your clients, control who pays for failures, and fail messages internally without touching a vendor.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[307],"tags":[309,310,311,308],"class_list":["post-998","post","type-post","status-publish","format-standard","hentry","category-error-codes-dlr","tag-delivery-report","tag-dlr-status","tag-error-mapping","tag-global-error-codes"],"_links":{"self":[{"href":"https:\/\/smppcenter.com\/kb\/wp-json\/wp\/v2\/posts\/998","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/smppcenter.com\/kb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/smppcenter.com\/kb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/smppcenter.com\/kb\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/smppcenter.com\/kb\/wp-json\/wp\/v2\/comments?post=998"}],"version-history":[{"count":0,"href":"https:\/\/smppcenter.com\/kb\/wp-json\/wp\/v2\/posts\/998\/revisions"}],"wp:attachment":[{"href":"https:\/\/smppcenter.com\/kb\/wp-json\/wp\/v2\/media?parent=998"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/smppcenter.com\/kb\/wp-json\/wp\/v2\/categories?post=998"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/smppcenter.com\/kb\/wp-json\/wp\/v2\/tags?post=998"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}